diff --git a/package.json b/package.json index c64ce4be8d..2e60bac280 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "bootstrap-sass": "^3.3.7", "gulp": "^3.9.1", "jquery": "^3.1.0", + "jquery-ui": "^1.12.1", "laravel-elixir": "^6.0.0-11", "laravel-elixir-browserify": "^0.8.1", "laravel-elixir-codeception-standalone": "^0.1.0", @@ -24,6 +25,7 @@ "vue-template-compiler": "=2.1.6" }, "dependencies": { + "bower": "^1.8.0", "jquery": "^3.1.1", "laravel-elixir-codeception": "^0.2.0" } diff --git a/public/assets/js/all.js b/public/assets/js/all.js old mode 100644 new mode 100755 index 899ad32446..6b9de08b14 --- a/public/assets/js/all.js +++ b/public/assets/js/all.js @@ -1884,15 +1884,15 @@ eval("/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n /***/ }, /* 1 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { -eval("/* WEBPACK VAR INJECTION */(function(process) {module.exports = function normalizeComponent (\n name,\n scriptExports,\n compiledTemplate,\n scopeId,\n cssModules\n) {\n scriptExports = scriptExports || {}\n\n // ES6 modules interop\n var type = typeof scriptExports.default\n if (type === 'object' || type === 'function') {\n // check named exports\n if (process.env.NODE_ENV !== 'production') {\n if (Object.keys(scriptExports).some(function (key) {\n return key !== 'default' && key !== '__esModule'\n })) {\n console.error('named exports are not supported in *.vue files.')\n }\n }\n scriptExports = scriptExports.default\n }\n\n // Vue.extend constructor export interop\n var options = typeof scriptExports === 'function'\n ? scriptExports.options\n : scriptExports\n\n // default name option based on filename\n if (options.name == null) {\n options.name = name\n }\n\n // render functions\n if (compiledTemplate) {\n options.render = compiledTemplate.render\n options.staticRenderFns = compiledTemplate.staticRenderFns\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = scopeId\n }\n\n // inject cssModules\n if (cssModules) {\n var computed = options.computed || (options.computed = {})\n Object.keys(cssModules).forEach(function (key) {\n var module = cssModules[key]\n computed[key] = function () { return module }\n })\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(30)))//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL34vdnVlLWxvYWRlci9saWIvY29tcG9uZW50LW5vcm1hbGl6ZXIuanM/ZDRmMyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudCAoXG4gIG5hbWUsXG4gIHNjcmlwdEV4cG9ydHMsXG4gIGNvbXBpbGVkVGVtcGxhdGUsXG4gIHNjb3BlSWQsXG4gIGNzc01vZHVsZXNcbikge1xuICBzY3JpcHRFeHBvcnRzID0gc2NyaXB0RXhwb3J0cyB8fCB7fVxuXG4gIC8vIEVTNiBtb2R1bGVzIGludGVyb3BcbiAgdmFyIHR5cGUgPSB0eXBlb2Ygc2NyaXB0RXhwb3J0cy5kZWZhdWx0XG4gIGlmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gY2hlY2sgbmFtZWQgZXhwb3J0c1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoc2NyaXB0RXhwb3J0cykuc29tZShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgIT09ICdkZWZhdWx0JyAmJiBrZXkgIT09ICdfX2VzTW9kdWxlJ1xuICAgICAgfSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignbmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy4nKVxuICAgICAgfVxuICAgIH1cbiAgICBzY3JpcHRFeHBvcnRzID0gc2NyaXB0RXhwb3J0cy5kZWZhdWx0XG4gIH1cblxuICAvLyBWdWUuZXh0ZW5kIGNvbnN0cnVjdG9yIGV4cG9ydCBpbnRlcm9wXG4gIHZhciBvcHRpb25zID0gdHlwZW9mIHNjcmlwdEV4cG9ydHMgPT09ICdmdW5jdGlvbidcbiAgICA/IHNjcmlwdEV4cG9ydHMub3B0aW9uc1xuICAgIDogc2NyaXB0RXhwb3J0c1xuXG4gIC8vIGRlZmF1bHQgbmFtZSBvcHRpb24gYmFzZWQgb24gZmlsZW5hbWVcbiAgaWYgKG9wdGlvbnMubmFtZSA9PSBudWxsKSB7XG4gICAgb3B0aW9ucy5uYW1lID0gbmFtZVxuICB9XG5cbiAgLy8gcmVuZGVyIGZ1bmN0aW9uc1xuICBpZiAoY29tcGlsZWRUZW1wbGF0ZSkge1xuICAgIG9wdGlvbnMucmVuZGVyID0gY29tcGlsZWRUZW1wbGF0ZS5yZW5kZXJcbiAgICBvcHRpb25zLnN0YXRpY1JlbmRlckZucyA9IGNvbXBpbGVkVGVtcGxhdGUuc3RhdGljUmVuZGVyRm5zXG4gIH1cblxuICAvLyBzY29wZWRJZFxuICBpZiAoc2NvcGVJZCkge1xuICAgIG9wdGlvbnMuX3Njb3BlSWQgPSBzY29wZUlkXG4gIH1cblxuICAvLyBpbmplY3QgY3NzTW9kdWxlc1xuICBpZiAoY3NzTW9kdWxlcykge1xuICAgIHZhciBjb21wdXRlZCA9IG9wdGlvbnMuY29tcHV0ZWQgfHwgKG9wdGlvbnMuY29tcHV0ZWQgPSB7fSlcbiAgICBPYmplY3Qua2V5cyhjc3NNb2R1bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBtb2R1bGUgPSBjc3NNb2R1bGVzW2tleV1cbiAgICAgIGNvbXB1dGVkW2tleV0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBtb2R1bGUgfVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cG9ydHM6IHNjcmlwdEV4cG9ydHMsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdnVlLWxvYWRlci9saWIvY29tcG9uZW50LW5vcm1hbGl6ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); +eval("module.exports = function normalizeComponent (\n rawScriptExports,\n compiledTemplate,\n scopeId,\n cssModules\n) {\n var esModule\n var scriptExports = rawScriptExports = rawScriptExports || {}\n\n // ES6 modules interop\n var type = typeof rawScriptExports.default\n if (type === 'object' || type === 'function') {\n esModule = rawScriptExports\n scriptExports = rawScriptExports.default\n }\n\n // Vue.extend constructor export interop\n var options = typeof scriptExports === 'function'\n ? scriptExports.options\n : scriptExports\n\n // render functions\n if (compiledTemplate) {\n options.render = compiledTemplate.render\n options.staticRenderFns = compiledTemplate.staticRenderFns\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = scopeId\n }\n\n // inject cssModules\n if (cssModules) {\n var computed = options.computed || (options.computed = {})\n Object.keys(cssModules).forEach(function (key) {\n var module = cssModules[key]\n computed[key] = function () { return module }\n })\n }\n\n return {\n esModule: esModule,\n exports: scriptExports,\n options: options\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL34vdnVlLWxvYWRlci9saWIvY29tcG9uZW50LW5vcm1hbGl6ZXIuanM/ZDRmMyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudCAoXG4gIHJhd1NjcmlwdEV4cG9ydHMsXG4gIGNvbXBpbGVkVGVtcGxhdGUsXG4gIHNjb3BlSWQsXG4gIGNzc01vZHVsZXNcbikge1xuICB2YXIgZXNNb2R1bGVcbiAgdmFyIHNjcmlwdEV4cG9ydHMgPSByYXdTY3JpcHRFeHBvcnRzID0gcmF3U2NyaXB0RXhwb3J0cyB8fCB7fVxuXG4gIC8vIEVTNiBtb2R1bGVzIGludGVyb3BcbiAgdmFyIHR5cGUgPSB0eXBlb2YgcmF3U2NyaXB0RXhwb3J0cy5kZWZhdWx0XG4gIGlmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXNNb2R1bGUgPSByYXdTY3JpcHRFeHBvcnRzXG4gICAgc2NyaXB0RXhwb3J0cyA9IHJhd1NjcmlwdEV4cG9ydHMuZGVmYXVsdFxuICB9XG5cbiAgLy8gVnVlLmV4dGVuZCBjb25zdHJ1Y3RvciBleHBvcnQgaW50ZXJvcFxuICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzY3JpcHRFeHBvcnRzID09PSAnZnVuY3Rpb24nXG4gICAgPyBzY3JpcHRFeHBvcnRzLm9wdGlvbnNcbiAgICA6IHNjcmlwdEV4cG9ydHNcblxuICAvLyByZW5kZXIgZnVuY3Rpb25zXG4gIGlmIChjb21waWxlZFRlbXBsYXRlKSB7XG4gICAgb3B0aW9ucy5yZW5kZXIgPSBjb21waWxlZFRlbXBsYXRlLnJlbmRlclxuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gY29tcGlsZWRUZW1wbGF0ZS5zdGF0aWNSZW5kZXJGbnNcbiAgfVxuXG4gIC8vIHNjb3BlZElkXG4gIGlmIChzY29wZUlkKSB7XG4gICAgb3B0aW9ucy5fc2NvcGVJZCA9IHNjb3BlSWRcbiAgfVxuXG4gIC8vIGluamVjdCBjc3NNb2R1bGVzXG4gIGlmIChjc3NNb2R1bGVzKSB7XG4gICAgdmFyIGNvbXB1dGVkID0gb3B0aW9ucy5jb21wdXRlZCB8fCAob3B0aW9ucy5jb21wdXRlZCA9IHt9KVxuICAgIE9iamVjdC5rZXlzKGNzc01vZHVsZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIG1vZHVsZSA9IGNzc01vZHVsZXNba2V5XVxuICAgICAgY29tcHV0ZWRba2V5XSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1vZHVsZSB9XG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXNNb2R1bGU6IGVzTW9kdWxlLFxuICAgIGV4cG9ydHM6IHNjcmlwdEV4cG9ydHMsXG4gICAgb3B0aW9uczogb3B0aW9uc1xuICB9XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdnVlLWxvYWRlci9saWIvY29tcG9uZW50LW5vcm1hbGl6ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ=="); /***/ }, /* 2 */ -/***/ function(module, exports) { +/***/ function(module, exports, __webpack_require__) { -eval("/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\nvar stylesInDom = {},\n\tmemoize = function(fn) {\n\t\tvar memo;\n\t\treturn function () {\n\t\t\tif (typeof memo === \"undefined\") memo = fn.apply(this, arguments);\n\t\t\treturn memo;\n\t\t};\n\t},\n\tisOldIE = memoize(function() {\n\t\treturn /msie [6-9]\\b/.test(window.navigator.userAgent.toLowerCase());\n\t}),\n\tgetHeadElement = memoize(function () {\n\t\treturn document.head || document.getElementsByTagName(\"head\")[0];\n\t}),\n\tsingletonElement = null,\n\tsingletonCounter = 0,\n\tstyleElementsInsertedAtTop = [];\n\nmodule.exports = function(list, options) {\n\tif(typeof DEBUG !== \"undefined\" && DEBUG) {\n\t\tif(typeof document !== \"object\") throw new Error(\"The style-loader cannot be used in a non-browser environment\");\n\t}\n\n\toptions = options || {};\n\t// Force single-tag solution on IE6-9, which has a hard limit on the # of \\n\\n\\n\\n\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQXV0aG9yaXplZENsaWVudHMudnVlP2ZhMzYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWN0aW9uLWxpbmtbZGF0YS12LTExNjA1ZTVjXSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLm0tYi1ub25lW2RhdGEtdi0xMTYwNWU1Y10ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL3Bhc3Nwb3J0L0F1dGhvcml6ZWRDbGllbnRzLnZ1ZT9hOTkwNzZjMFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJBdXRob3JpemVkQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWhlYWRpbmdcXFwiPkF1dGhvcml6ZWQgQXBwbGljYXRpb25zPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBdXRob3JpemVkIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+U2NvcGVzPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcInRva2VuIGluIHRva2Vuc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENsaWVudCBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uY2xpZW50Lm5hbWUgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNjb3BlcyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XFxcInRva2VuLnNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uc2NvcGVzLmpvaW4oJywgJykgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZXZva2UgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZva2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICB0b2tlbnM6IFtdXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBwcmVwYXJlQ29tcG9uZW50KCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogR2V0IGFsbCBvZiB0aGUgYXV0aG9yaXplZCB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC90b2tlbnMnKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2tlbnMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUmV2b2tlIHRoZSBnaXZlbiB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICByZXZva2UodG9rZW4pIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5kZWxldGUoJy9vYXV0aC90b2tlbnMvJyArIHRva2VuLmlkKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbnMoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG48L3NjcmlwdD5cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTExNjA1ZTVjJnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL3Bhc3Nwb3J0L0F1dGhvcml6ZWRDbGllbnRzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ=="); /***/ }, /* 20 */ /***/ function(module, exports, __webpack_require__) { -eval("exports = module.exports = __webpack_require__(0)();\n// imports\n\n\n// module\nexports.push([module.i, \"\\n.action-link[data-v-40c96b49] {\\n cursor: pointer;\\n}\\n.m-b-none[data-v-40c96b49] {\\n margin-bottom: 0;\\n}\\n\", \"\", {\"version\":3,\"sources\":[\"/./resources/assets/js/components/passport/AuthorizedClients.vue?a99076c0\"],\"names\":[],\"mappings\":\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\",\"file\":\"AuthorizedClients.vue\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQXV0aG9yaXplZENsaWVudHMudnVlPzcwYzEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWN0aW9uLWxpbmtbZGF0YS12LTQwYzk2YjQ5XSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLm0tYi1ub25lW2RhdGEtdi00MGM5NmI0OV0ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL3Bhc3Nwb3J0L0F1dGhvcml6ZWRDbGllbnRzLnZ1ZT9hOTkwNzZjMFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJBdXRob3JpemVkQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWhlYWRpbmdcXFwiPkF1dGhvcml6ZWQgQXBwbGljYXRpb25zPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBdXRob3JpemVkIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+U2NvcGVzPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcInRva2VuIGluIHRva2Vuc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENsaWVudCBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uY2xpZW50Lm5hbWUgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNjb3BlcyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XFxcInRva2VuLnNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uc2NvcGVzLmpvaW4oJywgJykgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZXZva2UgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZva2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICB0b2tlbnM6IFtdXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBwcmVwYXJlQ29tcG9uZW50KCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogR2V0IGFsbCBvZiB0aGUgYXV0aG9yaXplZCB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC90b2tlbnMnKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2tlbnMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUmV2b2tlIHRoZSBnaXZlbiB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICByZXZva2UodG9rZW4pIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5kZWxldGUoJy9vYXV0aC90b2tlbnMvJyArIHRva2VuLmlkKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbnMoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG48L3NjcmlwdD5cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQwYzk2YjQ5JnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL3Bhc3Nwb3J0L0F1dGhvcml6ZWRDbGllbnRzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ=="); +eval("exports = module.exports = __webpack_require__(0)();\n// imports\n\n\n// module\nexports.push([module.i, \"\\n\\n\", \"\", {\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"file\":\"importer.vue\",\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXIudnVlPzIzNzQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwiZmlsZVwiOlwiaW1wb3J0ZXIudnVlXCIsXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTFmZjBlZDUzJnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2ltcG9ydGVyL2ltcG9ydGVyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ=="); /***/ }, /* 21 */ /***/ function(module, exports, __webpack_require__) { -eval("exports = module.exports = __webpack_require__(0)();\n// imports\n\n\n// module\nexports.push([module.i, \"\\n\\n\", \"\", {\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"file\":\"importer.vue\",\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXIudnVlP2FlN2UiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwiZmlsZVwiOlwiaW1wb3J0ZXIudnVlXCIsXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTc4YjIzMWM2JnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2ltcG9ydGVyL2ltcG9ydGVyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ=="); +eval("exports = module.exports = __webpack_require__(0)();\n// imports\n\n\n// module\nexports.push([module.i, \"\\n\\n\", \"\", {\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"file\":\"alert.vue\",\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvYWxlcnQudnVlPzVlNzIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwiZmlsZVwiOlwiYWxlcnQudnVlXCIsXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTRlYWM1NjgwJnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2FsZXJ0LnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ=="); /***/ }, /* 22 */ /***/ function(module, exports, __webpack_require__) { -eval("exports = module.exports = __webpack_require__(0)();\n// imports\n\n\n// module\nexports.push([module.i, \"\\n\\n\", \"\", {\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"file\":\"alert.vue\",\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvYWxlcnQudnVlPzlmZTIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwiZmlsZVwiOlwiYWxlcnQudnVlXCIsXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTdiNmZlZGIzJnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2FsZXJ0LnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ=="); +eval("exports = module.exports = __webpack_require__(0)();\n// imports\n\n\n// module\nexports.push([module.i, \"\\n\\n\", \"\", {\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"file\":\"select2.vue\",\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvc2VsZWN0Mi52dWU/MWUxNSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcblxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiXCIsXCJmaWxlXCI6XCJzZWxlY3QyLnZ1ZVwiLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXG4vLyBleHBvcnRzXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi01MTU2MTNjYyZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9zZWxlY3QyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ=="); /***/ }, /* 23 */ /***/ function(module, exports, __webpack_require__) { -eval("exports = module.exports = __webpack_require__(0)();\n// imports\n\n\n// module\nexports.push([module.i, \"\\n\\n\", \"\", {\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"file\":\"importer-errors.vue\",\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZT9jMmZiIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLy4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJcIixcImZpbGVcIjpcImltcG9ydGVyLWVycm9ycy52dWVcIixcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtYmQxY2RjZmMmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ=="); +eval("exports = module.exports = __webpack_require__(0)();\n// imports\n\n\n// module\nexports.push([module.i, \"\\n.action-link[data-v-6886005f] {\\n cursor: pointer;\\n}\\n.m-b-none[data-v-6886005f] {\\n margin-bottom: 0;\\n}\\n\", \"\", {\"version\":3,\"sources\":[\"/./resources/assets/js/components/passport/PersonalAccessTokens.vue?5734f4e4\"],\"names\":[],\"mappings\":\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\",\"file\":\"PersonalAccessTokens.vue\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvUGVyc29uYWxBY2Nlc3NUb2tlbnMudnVlP2Y0YTgiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWN0aW9uLWxpbmtbZGF0YS12LTY4ODYwMDVmXSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLm0tYi1ub25lW2RhdGEtdi02ODg2MDA1Zl0ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL3Bhc3Nwb3J0L1BlcnNvbmFsQWNjZXNzVG9rZW5zLnZ1ZT81NzM0ZjRlNFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJQZXJzb25hbEFjY2Vzc1Rva2Vucy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbCBwYW5lbC1kZWZhdWx0XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVxcXCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2Vuc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cXFwiYWN0aW9uLWxpbmtcXFwiIEBjbGljaz1cXFwic2hvd0NyZWF0ZVRva2VuRm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBOZXcgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBUb2tlbnMgTm90aWNlIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XFxcIm0tYi1ub25lXFxcIiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID09PSAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBZb3UgaGF2ZSBub3QgY3JlYXRlZCBhbnkgcGVyc29uYWwgYWNjZXNzIHRva2Vucy5cXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUGVyc29uYWwgQWNjZXNzIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCIgdi1pZj1cXFwidG9rZW5zLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPk5hbWU8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB2LWZvcj1cXFwidG9rZW4gaW4gdG9rZW5zXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2xpZW50IE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0b2tlbi5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZWxldGUgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gTW9kYWwgLS0+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbCBmYWRlXFxcIiBpZD1cXFwibW9kYWwtY3JlYXRlLXRva2VuXFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZm9ybS5lcnJvcnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxzdHJvbmc+V2hvb3BzITwvc3Ryb25nPiBTb21ldGhpbmcgd2VudCB3cm9uZyE8L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIHYtZm9yPVxcXCJlcnJvciBpbiBmb3JtLmVycm9yc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXJyb3IgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gRm9ybSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cXFwiZm9ybS1ob3Jpem9udGFsXFxcIiByb2xlPVxcXCJmb3JtXFxcIiBAc3VibWl0LnByZXZlbnQ9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+TmFtZTwvbGFiZWw+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtNlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJjcmVhdGUtdG9rZW4tbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwibmFtZVxcXCIgdi1tb2RlbD1cXFwiZm9ybS5uYW1lXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTY29wZXMgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIHYtaWY9XFxcInNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+U2NvcGVzPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC02XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtZm9yPVxcXCJzY29wZSBpbiBzY29wZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjaGVja2JveFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9XFxcInRvZ2dsZVNjb3BlKHNjb3BlLmlkKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNoZWNrZWQ9XFxcInNjb3BlSXNBc3NpZ25lZChzY29wZS5pZClcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzY29wZS5pZCB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQWNjZXNzIFRva2VuIE1vZGFsIC0tPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwgZmFkZVxcXCIgaWQ9XFxcIm1vZGFsLWFjY2Vzcy10b2tlblxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2VuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgeW91ciBuZXcgcGVyc29uYWwgYWNjZXNzIHRva2VuLiBUaGlzIGlzIHRoZSBvbmx5IHRpbWUgaXQgd2lsbCBiZSBzaG93biBzbyBkb24ndCBsb3NlIGl0IVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IG5vdyB1c2UgdGhpcyB0b2tlbiB0byBtYWtlIEFQSSByZXF1ZXN0cy5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZT57eyBhY2Nlc3NUb2tlbiB9fTwvY29kZT48L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNb2RhbCBBY3Rpb25zIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdFxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCI+Q2xvc2U8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogbnVsbCxcXG5cXG4gICAgICAgICAgICAgICAgdG9rZW5zOiBbXSxcXG4gICAgICAgICAgICAgICAgc2NvcGVzOiBbXSxcXG5cXG4gICAgICAgICAgICAgICAgZm9ybToge1xcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICBzY29wZXM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW5zKCk7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2NvcGVzKCk7XFxuXFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5vbignc2hvd24uYnMubW9kYWwnLCAoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAkKCcjY3JlYXRlLXRva2VuLW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIHBlcnNvbmFsIGFjY2VzcyB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zID0gcmVzcG9uc2UuZGF0YTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIGF2YWlsYWJsZSBzY29wZXMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgZ2V0U2NvcGVzKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmdldCgnL29hdXRoL3Njb3BlcycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjb3BlcyA9IHJlc3BvbnNlLmRhdGE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBTaG93IHRoZSBmb3JtIGZvciBjcmVhdGluZyBuZXcgdG9rZW5zLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dDcmVhdGVUb2tlbkZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5tb2RhbCgnc2hvdycpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogQ3JlYXRlIGEgbmV3IHBlcnNvbmFsIGFjY2VzcyB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBzdG9yZSgpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IG51bGw7XFxuXFxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2VucycsIHRoaXMuZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5uYW1lID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMgPSBbXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmVycm9ycyA9IFtdO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHJlc3BvbnNlLmRhdGEudG9rZW4pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBY2Nlc3NUb2tlbihyZXNwb25zZS5kYXRhLmFjY2Vzc1Rva2VuKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBfLmZsYXR0ZW4oXy50b0FycmF5KHJlc3BvbnNlLmRhdGEpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kaXIodGhpcy5mb3JtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbJ1NvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluLiddO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBUb2dnbGUgdGhlIGdpdmVuIHNjb3BlIGluIHRoZSBsaXN0IG9mIGFzc2lnbmVkIHNjb3Blcy5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB0b2dnbGVTY29wZShzY29wZSkge1xcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY29wZUlzQXNzaWduZWQoc2NvcGUpKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uc2NvcGVzID0gXy5yZWplY3QodGhpcy5mb3JtLnNjb3BlcywgcyA9PiBzID09IHNjb3BlKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMucHVzaChzY29wZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gc2NvcGUgaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIHRva2VuLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNjb3BlSXNBc3NpZ25lZChzY29wZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXy5pbmRleE9mKHRoaXMuZm9ybS5zY29wZXMsIHNjb3BlKSA+PSAwO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZ2l2ZW4gYWNjZXNzIHRva2VuIHRvIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikge1xcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLXRva2VuJykubW9kYWwoJ2hpZGUnKTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtYWNjZXNzLXRva2VuJykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFJldm9rZSB0aGUgZ2l2ZW4gdG9rZW4uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcmV2b2tlKHRva2VuKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZGVsZXRlKCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2Vucy8nICsgdG9rZW4uaWQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjg4NjAwNWYmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvUGVyc29uYWxBY2Nlc3NUb2tlbnMudnVlXG4vLyBtb2R1bGUgaWQgPSAyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9"); /***/ }, /* 24 */ /***/ function(module, exports, __webpack_require__) { -eval("exports = module.exports = __webpack_require__(0)();\n// imports\n\n\n// module\nexports.push([module.i, \"\\n.action-link[data-v-cb459f5c] {\\n cursor: pointer;\\n}\\n.m-b-none[data-v-cb459f5c] {\\n margin-bottom: 0;\\n}\\n\", \"\", {\"version\":3,\"sources\":[\"/./resources/assets/js/components/passport/PersonalAccessTokens.vue?5734f4e4\"],\"names\":[],\"mappings\":\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\",\"file\":\"PersonalAccessTokens.vue\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvUGVyc29uYWxBY2Nlc3NUb2tlbnMudnVlP2RiZTQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWN0aW9uLWxpbmtbZGF0YS12LWNiNDU5ZjVjXSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLm0tYi1ub25lW2RhdGEtdi1jYjQ1OWY1Y10ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL3Bhc3Nwb3J0L1BlcnNvbmFsQWNjZXNzVG9rZW5zLnZ1ZT81NzM0ZjRlNFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJQZXJzb25hbEFjY2Vzc1Rva2Vucy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbCBwYW5lbC1kZWZhdWx0XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVxcXCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2Vuc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cXFwiYWN0aW9uLWxpbmtcXFwiIEBjbGljaz1cXFwic2hvd0NyZWF0ZVRva2VuRm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBOZXcgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBUb2tlbnMgTm90aWNlIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XFxcIm0tYi1ub25lXFxcIiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID09PSAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBZb3UgaGF2ZSBub3QgY3JlYXRlZCBhbnkgcGVyc29uYWwgYWNjZXNzIHRva2Vucy5cXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUGVyc29uYWwgQWNjZXNzIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCIgdi1pZj1cXFwidG9rZW5zLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPk5hbWU8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB2LWZvcj1cXFwidG9rZW4gaW4gdG9rZW5zXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2xpZW50IE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0b2tlbi5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZWxldGUgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gTW9kYWwgLS0+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbCBmYWRlXFxcIiBpZD1cXFwibW9kYWwtY3JlYXRlLXRva2VuXFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZm9ybS5lcnJvcnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxzdHJvbmc+V2hvb3BzITwvc3Ryb25nPiBTb21ldGhpbmcgd2VudCB3cm9uZyE8L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIHYtZm9yPVxcXCJlcnJvciBpbiBmb3JtLmVycm9yc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXJyb3IgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gRm9ybSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cXFwiZm9ybS1ob3Jpem9udGFsXFxcIiByb2xlPVxcXCJmb3JtXFxcIiBAc3VibWl0LnByZXZlbnQ9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+TmFtZTwvbGFiZWw+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtNlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJjcmVhdGUtdG9rZW4tbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwibmFtZVxcXCIgdi1tb2RlbD1cXFwiZm9ybS5uYW1lXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTY29wZXMgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIHYtaWY9XFxcInNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+U2NvcGVzPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC02XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtZm9yPVxcXCJzY29wZSBpbiBzY29wZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjaGVja2JveFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9XFxcInRvZ2dsZVNjb3BlKHNjb3BlLmlkKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNoZWNrZWQ9XFxcInNjb3BlSXNBc3NpZ25lZChzY29wZS5pZClcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzY29wZS5pZCB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQWNjZXNzIFRva2VuIE1vZGFsIC0tPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwgZmFkZVxcXCIgaWQ9XFxcIm1vZGFsLWFjY2Vzcy10b2tlblxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2VuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgeW91ciBuZXcgcGVyc29uYWwgYWNjZXNzIHRva2VuLiBUaGlzIGlzIHRoZSBvbmx5IHRpbWUgaXQgd2lsbCBiZSBzaG93biBzbyBkb24ndCBsb3NlIGl0IVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IG5vdyB1c2UgdGhpcyB0b2tlbiB0byBtYWtlIEFQSSByZXF1ZXN0cy5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZT57eyBhY2Nlc3NUb2tlbiB9fTwvY29kZT48L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNb2RhbCBBY3Rpb25zIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdFxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCI+Q2xvc2U8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogbnVsbCxcXG5cXG4gICAgICAgICAgICAgICAgdG9rZW5zOiBbXSxcXG4gICAgICAgICAgICAgICAgc2NvcGVzOiBbXSxcXG5cXG4gICAgICAgICAgICAgICAgZm9ybToge1xcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICBzY29wZXM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW5zKCk7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2NvcGVzKCk7XFxuXFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5vbignc2hvd24uYnMubW9kYWwnLCAoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAkKCcjY3JlYXRlLXRva2VuLW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIHBlcnNvbmFsIGFjY2VzcyB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zID0gcmVzcG9uc2UuZGF0YTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIGF2YWlsYWJsZSBzY29wZXMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgZ2V0U2NvcGVzKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmdldCgnL29hdXRoL3Njb3BlcycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjb3BlcyA9IHJlc3BvbnNlLmRhdGE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBTaG93IHRoZSBmb3JtIGZvciBjcmVhdGluZyBuZXcgdG9rZW5zLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dDcmVhdGVUb2tlbkZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5tb2RhbCgnc2hvdycpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogQ3JlYXRlIGEgbmV3IHBlcnNvbmFsIGFjY2VzcyB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBzdG9yZSgpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IG51bGw7XFxuXFxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2VucycsIHRoaXMuZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5uYW1lID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMgPSBbXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmVycm9ycyA9IFtdO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHJlc3BvbnNlLmRhdGEudG9rZW4pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBY2Nlc3NUb2tlbihyZXNwb25zZS5kYXRhLmFjY2Vzc1Rva2VuKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBfLmZsYXR0ZW4oXy50b0FycmF5KHJlc3BvbnNlLmRhdGEpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kaXIodGhpcy5mb3JtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbJ1NvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluLiddO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBUb2dnbGUgdGhlIGdpdmVuIHNjb3BlIGluIHRoZSBsaXN0IG9mIGFzc2lnbmVkIHNjb3Blcy5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB0b2dnbGVTY29wZShzY29wZSkge1xcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY29wZUlzQXNzaWduZWQoc2NvcGUpKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uc2NvcGVzID0gXy5yZWplY3QodGhpcy5mb3JtLnNjb3BlcywgcyA9PiBzID09IHNjb3BlKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMucHVzaChzY29wZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gc2NvcGUgaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIHRva2VuLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNjb3BlSXNBc3NpZ25lZChzY29wZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXy5pbmRleE9mKHRoaXMuZm9ybS5zY29wZXMsIHNjb3BlKSA+PSAwO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZ2l2ZW4gYWNjZXNzIHRva2VuIHRvIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikge1xcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLXRva2VuJykubW9kYWwoJ2hpZGUnKTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtYWNjZXNzLXRva2VuJykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFJldm9rZSB0aGUgZ2l2ZW4gdG9rZW4uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcmV2b2tlKHRva2VuKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZGVsZXRlKCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2Vucy8nICsgdG9rZW4uaWQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtY2I0NTlmNWMmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvUGVyc29uYWxBY2Nlc3NUb2tlbnMudnVlXG4vLyBtb2R1bGUgaWQgPSAyNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9"); +eval("exports = module.exports = __webpack_require__(0)();\n// imports\n\n\n// module\nexports.push([module.i, \"\\n\\n\", \"\", {\"version\":3,\"sources\":[],\"names\":[],\"mappings\":\"\",\"file\":\"importer-errors.vue\",\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZT8zZjVlIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLy4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJcIixcImZpbGVcIjpcImltcG9ydGVyLWVycm9ycy52dWVcIixcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtYTk3ZmE1NTYmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ=="); /***/ }, /* 25 */ /***/ function(module, exports, __webpack_require__) { -eval("exports = module.exports = __webpack_require__(0)();\n// imports\n\n\n// module\nexports.push([module.i, \"\\n.action-link[data-v-e7598638] {\\n cursor: pointer;\\n}\\n.m-b-none[data-v-e7598638] {\\n margin-bottom: 0;\\n}\\n\", \"\", {\"version\":3,\"sources\":[\"/./resources/assets/js/components/passport/Clients.vue?35867ce4\"],\"names\":[],\"mappings\":\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\",\"file\":\"Clients.vue\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWU/YzY2MCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5hY3Rpb24tbGlua1tkYXRhLXYtZTc1OTg2MzhdIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4ubS1iLW5vbmVbZGF0YS12LWU3NTk4NjM4XSB7XFxuICAgIG1hcmdpbi1ib3R0b206IDA7XFxufVxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWU/MzU4NjdjZTRcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQUNBO0lBQ0EsZ0JBQUE7Q0FDQTtBQUVBO0lBQ0EsaUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XFxcImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgT0F1dGggQ2xpZW50c1xcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcInNob3dDcmVhdGVDbGllbnRGb3JtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgTmV3IENsaWVudFxcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBDdXJyZW50IENsaWVudHMgLS0+XFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVxcXCJtLWItbm9uZVxcXCIgdi1pZj1cXFwiY2xpZW50cy5sZW5ndGggPT09IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgWW91IGhhdmUgbm90IGNyZWF0ZWQgYW55IE9BdXRoIGNsaWVudHMuXFxuICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVxcXCJ0YWJsZSB0YWJsZS1ib3JkZXJsZXNzIG0tYi1ub25lXFxcIiB2LWlmPVxcXCJjbGllbnRzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkNsaWVudCBJRDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlNlY3JldDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcImNsaWVudCBpbiBjbGllbnRzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJRCAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjbGllbnQuaWQgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNsaWVudC5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VjcmV0IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnt7IGNsaWVudC5zZWNyZXQgfX08L2NvZGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRWRpdCBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcImVkaXQoY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERlbGV0ZSBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcImRlc3Ryb3koY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgIDwvdGFibGU+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1jcmVhdGUtY2xpZW50XFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgQ2xpZW50XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtIEVycm9ycyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhbGVydCBhbGVydC1kYW5nZXJcXFwiIHYtaWY9XFxcImNyZWF0ZUZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gY3JlYXRlRm9ybS5lcnJvcnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVycm9yIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBGb3JtIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVxcXCJmb3JtLWhvcml6b250YWxcXFwiIHJvbGU9XFxcImZvcm1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5OYW1lPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XFxcImNyZWF0ZS1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJzdG9yZVxcXCIgdi1tb2RlbD1cXFwiY3JlYXRlRm9ybS5uYW1lXFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWV0aGluZyB5b3VyIHVzZXJzIHdpbGwgcmVjb2duaXplIGFuZCB0cnVzdC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVkaXJlY3QgVVJMIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTMgY29udHJvbC1sYWJlbFxcXCI+UmVkaXJlY3QgVVJMPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwicmVkaXJlY3RcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBrZXl1cC5lbnRlcj1cXFwic3RvcmVcXFwiIHYtbW9kZWw9XFxcImNyZWF0ZUZvcm0ucmVkaXJlY3RcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91ciBhcHBsaWNhdGlvbidzIGF1dGhvcml6YXRpb24gY2FsbGJhY2sgVVJMLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTW9kYWwgQWN0aW9ucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHRcXFwiIGRhdGEtZGlzbWlzcz1cXFwibW9kYWxcXFwiPkNsb3NlPC9idXR0b24+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwic3RvcmVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBFZGl0IENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1lZGl0LWNsaWVudFxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCBDbGllbnRcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZWRpdEZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gZWRpdEZvcm0uZXJyb3JzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBlcnJvciB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVkaXQgQ2xpZW50IEZvcm0gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XFxcImZvcm0taG9yaXpvbnRhbFxcXCIgcm9sZT1cXFwiZm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTmFtZSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XFxcImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcXFwiPk5hbWU8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwiZWRpdC1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLm5hbWVcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZXRoaW5nIHlvdXIgdXNlcnMgd2lsbCByZWNvZ25pemUgYW5kIHRydXN0LlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZWRpcmVjdCBVUkwgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5SZWRpcmVjdCBVUkw8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBuYW1lPVxcXCJyZWRpcmVjdFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLnJlZGlyZWN0XFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdXIgYXBwbGljYXRpb24ncyBhdXRob3JpemF0aW9uIGNhbGxiYWNrIFVSTC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInVwZGF0ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgQ2hhbmdlc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvdGVtcGxhdGU+XFxuXFxuPHNjcmlwdD5cXG4gICAgZXhwb3J0IGRlZmF1bHQge1xcbiAgICAgICAgLypcXG4gICAgICAgICAqIFRoZSBjb21wb25lbnQncyBkYXRhLlxcbiAgICAgICAgICovXFxuICAgICAgICBkYXRhKCkge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGNsaWVudHM6IFtdLFxcblxcbiAgICAgICAgICAgICAgICBjcmVhdGVGb3JtOiB7XFxuICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDogJydcXG4gICAgICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAgICAgZWRpdEZvcm06IHtcXG4gICAgICAgICAgICAgICAgICAgIGVycm9yczogW10sXFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyxcXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnJ1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLWNsaWVudCcpLm9uKCdzaG93bi5icy5tb2RhbCcsICgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICQoJyNjcmVhdGUtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50Jykub24oJ3Nob3duLmJzLm1vZGFsJywgKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgJCgnI2VkaXQtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIE9BdXRoIGNsaWVudHMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldENsaWVudHMoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZ2V0KCcvb2F1dGgvY2xpZW50cycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudHMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZm9ybSBmb3IgY3JlYXRpbmcgbmV3IGNsaWVudHMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgc2hvd0NyZWF0ZUNsaWVudEZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIENyZWF0ZSBhIG5ldyBPQXV0aCBjbGllbnQgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHN0b3JlKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLnBlcnNpc3RDbGllbnQoXFxuICAgICAgICAgICAgICAgICAgICAncG9zdCcsICcvb2F1dGgvY2xpZW50cycsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm0sICcjbW9kYWwtY3JlYXRlLWNsaWVudCdcXG4gICAgICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEVkaXQgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBlZGl0KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLmlkID0gY2xpZW50LmlkO1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLm5hbWUgPSBjbGllbnQubmFtZTtcXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybS5yZWRpcmVjdCA9IGNsaWVudC5yZWRpcmVjdDtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgY2xpZW50IGJlaW5nIGVkaXRlZC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB1cGRhdGUoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdENsaWVudChcXG4gICAgICAgICAgICAgICAgICAgICdwdXQnLCAnL29hdXRoL2NsaWVudHMvJyArIHRoaXMuZWRpdEZvcm0uaWQsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLCAnI21vZGFsLWVkaXQtY2xpZW50J1xcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUGVyc2lzdCB0aGUgY2xpZW50IHRvIHN0b3JhZ2UgdXNpbmcgdGhlIGdpdmVuIGZvcm0uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcGVyc2lzdENsaWVudChtZXRob2QsIHVyaSwgZm9ybSwgbW9kYWwpIHtcXG4gICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cFttZXRob2RdKHVyaSwgZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsaWVudHMoKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLm5hbWUgPSAnJztcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlZGlyZWN0ID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAkKG1vZGFsKS5tb2RhbCgnaGlkZScpO1xcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5kYXRhID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmVycm9ycyA9IF8uZmxhdHRlbihfLnRvQXJyYXkocmVzcG9uc2UuZGF0YSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uZXJyb3JzID0gWydTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERlc3Ryb3kgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBkZXN0cm95KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmRlbGV0ZSgnL29hdXRoL2NsaWVudHMvJyArIGNsaWVudC5pZClcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtZTc1OTg2Mzgmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWVcbi8vIG1vZHVsZSBpZCA9IDI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0="); +eval("exports = module.exports = __webpack_require__(0)();\n// imports\n\n\n// module\nexports.push([module.i, \"\\n.action-link[data-v-dc8f4892] {\\n cursor: pointer;\\n}\\n.m-b-none[data-v-dc8f4892] {\\n margin-bottom: 0;\\n}\\n\", \"\", {\"version\":3,\"sources\":[\"/./resources/assets/js/components/passport/Clients.vue?35867ce4\"],\"names\":[],\"mappings\":\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\",\"file\":\"Clients.vue\",\"sourcesContent\":[\"\\n\\n\\n\\n\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\n// exports\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWU/NDVmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5hY3Rpb24tbGlua1tkYXRhLXYtZGM4ZjQ4OTJdIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4ubS1iLW5vbmVbZGF0YS12LWRjOGY0ODkyXSB7XFxuICAgIG1hcmdpbi1ib3R0b206IDA7XFxufVxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWU/MzU4NjdjZTRcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQUNBO0lBQ0EsZ0JBQUE7Q0FDQTtBQUVBO0lBQ0EsaUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XFxcImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgT0F1dGggQ2xpZW50c1xcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcInNob3dDcmVhdGVDbGllbnRGb3JtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgTmV3IENsaWVudFxcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBDdXJyZW50IENsaWVudHMgLS0+XFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVxcXCJtLWItbm9uZVxcXCIgdi1pZj1cXFwiY2xpZW50cy5sZW5ndGggPT09IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgWW91IGhhdmUgbm90IGNyZWF0ZWQgYW55IE9BdXRoIGNsaWVudHMuXFxuICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVxcXCJ0YWJsZSB0YWJsZS1ib3JkZXJsZXNzIG0tYi1ub25lXFxcIiB2LWlmPVxcXCJjbGllbnRzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkNsaWVudCBJRDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlNlY3JldDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcImNsaWVudCBpbiBjbGllbnRzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJRCAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjbGllbnQuaWQgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNsaWVudC5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VjcmV0IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnt7IGNsaWVudC5zZWNyZXQgfX08L2NvZGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRWRpdCBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcImVkaXQoY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERlbGV0ZSBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcImRlc3Ryb3koY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgIDwvdGFibGU+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1jcmVhdGUtY2xpZW50XFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgQ2xpZW50XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtIEVycm9ycyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhbGVydCBhbGVydC1kYW5nZXJcXFwiIHYtaWY9XFxcImNyZWF0ZUZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gY3JlYXRlRm9ybS5lcnJvcnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVycm9yIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBGb3JtIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVxcXCJmb3JtLWhvcml6b250YWxcXFwiIHJvbGU9XFxcImZvcm1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5OYW1lPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XFxcImNyZWF0ZS1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJzdG9yZVxcXCIgdi1tb2RlbD1cXFwiY3JlYXRlRm9ybS5uYW1lXFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWV0aGluZyB5b3VyIHVzZXJzIHdpbGwgcmVjb2duaXplIGFuZCB0cnVzdC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVkaXJlY3QgVVJMIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTMgY29udHJvbC1sYWJlbFxcXCI+UmVkaXJlY3QgVVJMPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwicmVkaXJlY3RcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBrZXl1cC5lbnRlcj1cXFwic3RvcmVcXFwiIHYtbW9kZWw9XFxcImNyZWF0ZUZvcm0ucmVkaXJlY3RcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91ciBhcHBsaWNhdGlvbidzIGF1dGhvcml6YXRpb24gY2FsbGJhY2sgVVJMLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTW9kYWwgQWN0aW9ucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHRcXFwiIGRhdGEtZGlzbWlzcz1cXFwibW9kYWxcXFwiPkNsb3NlPC9idXR0b24+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwic3RvcmVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBFZGl0IENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1lZGl0LWNsaWVudFxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCBDbGllbnRcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZWRpdEZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gZWRpdEZvcm0uZXJyb3JzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBlcnJvciB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVkaXQgQ2xpZW50IEZvcm0gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XFxcImZvcm0taG9yaXpvbnRhbFxcXCIgcm9sZT1cXFwiZm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTmFtZSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XFxcImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcXFwiPk5hbWU8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwiZWRpdC1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLm5hbWVcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZXRoaW5nIHlvdXIgdXNlcnMgd2lsbCByZWNvZ25pemUgYW5kIHRydXN0LlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZWRpcmVjdCBVUkwgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5SZWRpcmVjdCBVUkw8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBuYW1lPVxcXCJyZWRpcmVjdFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLnJlZGlyZWN0XFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdXIgYXBwbGljYXRpb24ncyBhdXRob3JpemF0aW9uIGNhbGxiYWNrIFVSTC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInVwZGF0ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgQ2hhbmdlc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvdGVtcGxhdGU+XFxuXFxuPHNjcmlwdD5cXG4gICAgZXhwb3J0IGRlZmF1bHQge1xcbiAgICAgICAgLypcXG4gICAgICAgICAqIFRoZSBjb21wb25lbnQncyBkYXRhLlxcbiAgICAgICAgICovXFxuICAgICAgICBkYXRhKCkge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGNsaWVudHM6IFtdLFxcblxcbiAgICAgICAgICAgICAgICBjcmVhdGVGb3JtOiB7XFxuICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDogJydcXG4gICAgICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAgICAgZWRpdEZvcm06IHtcXG4gICAgICAgICAgICAgICAgICAgIGVycm9yczogW10sXFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyxcXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnJ1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLWNsaWVudCcpLm9uKCdzaG93bi5icy5tb2RhbCcsICgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICQoJyNjcmVhdGUtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50Jykub24oJ3Nob3duLmJzLm1vZGFsJywgKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgJCgnI2VkaXQtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIE9BdXRoIGNsaWVudHMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldENsaWVudHMoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZ2V0KCcvb2F1dGgvY2xpZW50cycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudHMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZm9ybSBmb3IgY3JlYXRpbmcgbmV3IGNsaWVudHMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgc2hvd0NyZWF0ZUNsaWVudEZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIENyZWF0ZSBhIG5ldyBPQXV0aCBjbGllbnQgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHN0b3JlKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLnBlcnNpc3RDbGllbnQoXFxuICAgICAgICAgICAgICAgICAgICAncG9zdCcsICcvb2F1dGgvY2xpZW50cycsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm0sICcjbW9kYWwtY3JlYXRlLWNsaWVudCdcXG4gICAgICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEVkaXQgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBlZGl0KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLmlkID0gY2xpZW50LmlkO1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLm5hbWUgPSBjbGllbnQubmFtZTtcXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybS5yZWRpcmVjdCA9IGNsaWVudC5yZWRpcmVjdDtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgY2xpZW50IGJlaW5nIGVkaXRlZC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB1cGRhdGUoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdENsaWVudChcXG4gICAgICAgICAgICAgICAgICAgICdwdXQnLCAnL29hdXRoL2NsaWVudHMvJyArIHRoaXMuZWRpdEZvcm0uaWQsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLCAnI21vZGFsLWVkaXQtY2xpZW50J1xcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUGVyc2lzdCB0aGUgY2xpZW50IHRvIHN0b3JhZ2UgdXNpbmcgdGhlIGdpdmVuIGZvcm0uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcGVyc2lzdENsaWVudChtZXRob2QsIHVyaSwgZm9ybSwgbW9kYWwpIHtcXG4gICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cFttZXRob2RdKHVyaSwgZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsaWVudHMoKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLm5hbWUgPSAnJztcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlZGlyZWN0ID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAkKG1vZGFsKS5tb2RhbCgnaGlkZScpO1xcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5kYXRhID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmVycm9ycyA9IF8uZmxhdHRlbihfLnRvQXJyYXkocmVzcG9uc2UuZGF0YSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uZXJyb3JzID0gWydTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERlc3Ryb3kgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBkZXN0cm95KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmRlbGV0ZSgnL29hdXRoL2NsaWVudHMvJyArIGNsaWVudC5pZClcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtZGM4ZjQ4OTImc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWVcbi8vIG1vZHVsZSBpZCA9IDI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0="); /***/ }, /* 26 */ @@ -2053,148 +2053,148 @@ eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPAC /***/ }, /* 28 */ -/***/ function(module, exports) { +/***/ function(module, exports, __webpack_require__) { -eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tconfigurable: false,\r\n\t\t\tget: function() { return module.l; }\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tconfigurable: false,\r\n\t\t\tget: function() { return module.i; }\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n}\r\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2MzYzIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRpZighbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xyXG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XHJcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxyXG5cdFx0aWYoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGUubDsgfVxyXG5cdFx0fSk7XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZS5pOyB9XHJcblx0XHR9KTtcclxuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xyXG5cdH1cclxuXHRyZXR1cm4gbW9kdWxlO1xyXG59XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qc1xuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ=="); +eval("/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license\n * Lodash \n * Copyright JS Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n\n /** Used as the semantic version number. */\n var VERSION = '4.17.4';\n\n /** Used as the size to enable large array optimizations. */\n var LARGE_ARRAY_SIZE = 200;\n\n /** Error message constants. */\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n FUNC_ERROR_TEXT = 'Expected a function';\n\n /** Used to stand-in for `undefined` hash values. */\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n /** Used as the maximum memoize cache size. */\n var MAX_MEMOIZE_SIZE = 500;\n\n /** Used as the internal argument placeholder. */\n var PLACEHOLDER = '__lodash_placeholder__';\n\n /** Used to compose bitmasks for cloning. */\n var CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n /** Used to compose bitmasks for value comparisons. */\n var COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n /** Used to compose bitmasks for function metadata. */\n var WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256,\n WRAP_FLIP_FLAG = 512;\n\n /** Used as default options for `_.truncate`. */\n var DEFAULT_TRUNC_LENGTH = 30,\n DEFAULT_TRUNC_OMISSION = '...';\n\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\n var HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n /** Used to indicate the type of lazy iteratees. */\n var LAZY_FILTER_FLAG = 1,\n LAZY_MAP_FLAG = 2,\n LAZY_WHILE_FLAG = 3;\n\n /** Used as references for various `Number` constants. */\n var INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n /** Used as references for the maximum length and index of an array. */\n var MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n /** Used to associate wrap methods with their bit flags. */\n var wrapFlags = [\n ['ary', WRAP_ARY_FLAG],\n ['bind', WRAP_BIND_FLAG],\n ['bindKey', WRAP_BIND_KEY_FLAG],\n ['curry', WRAP_CURRY_FLAG],\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n ['flip', WRAP_FLIP_FLAG],\n ['partial', WRAP_PARTIAL_FLAG],\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n ['rearg', WRAP_REARG_FLAG]\n ];\n\n /** `Object#toString` result references. */\n var argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n domExcTag = '[object DOMException]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]',\n weakSetTag = '[object WeakSet]';\n\n var arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n /** Used to match empty string literals in compiled template source. */\n var reEmptyStringLeading = /\\b__p \\+= '';/g,\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n /** Used to match HTML entities and HTML characters. */\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n reUnescapedHtml = /[&<>\"']/g,\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n /** Used to match template delimiters. */\n var reEscape = /<%-([\\s\\S]+?)%>/g,\n reEvaluate = /<%([\\s\\S]+?)%>/g,\n reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n reLeadingDot = /^\\./,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n /**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n reHasRegExpChar = RegExp(reRegExpChar.source);\n\n /** Used to match leading and trailing whitespace. */\n var reTrim = /^\\s+|\\s+$/g,\n reTrimStart = /^\\s+/,\n reTrimEnd = /\\s+$/;\n\n /** Used to match wrap detail comments. */\n var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n reSplitDetails = /,? & /;\n\n /** Used to match words composed of alphanumeric characters. */\n var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n /** Used to match `RegExp` flags from their coerced string values. */\n var reFlags = /\\w*$/;\n\n /** Used to detect bad signed hexadecimal string values. */\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n /** Used to detect binary string values. */\n var reIsBinary = /^0b[01]+$/i;\n\n /** Used to detect host constructors (Safari). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Used to detect octal string values. */\n var reIsOctal = /^0o[0-7]+$/i;\n\n /** Used to detect unsigned integer values. */\n var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\n var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n /** Used to ensure capturing order of template delimiters. */\n var reNoMatch = /($^)/;\n\n /** Used to match unescaped characters in compiled string literals. */\n var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n /** Used to compose unicode character classes. */\n var rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n /** Used to compose unicode capture groups. */\n var rsApos = \"['\\u2019]\",\n rsAstral = '[' + rsAstralRange + ']',\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n /** Used to compose unicode regexes. */\n var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsOrdLower = '\\\\d*(?:(?:1st|2nd|3rd|(?![123])\\\\dth)\\\\b)',\n rsOrdUpper = '\\\\d*(?:(?:1ST|2ND|3RD|(?![123])\\\\dTH)\\\\b)',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n /** Used to match apostrophes. */\n var reApos = RegExp(rsApos, 'g');\n\n /**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\n var reComboMark = RegExp(rsCombo, 'g');\n\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n /** Used to match complex or compound words. */\n var reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n rsUpper + '+' + rsOptContrUpper,\n rsOrdUpper,\n rsOrdLower,\n rsDigits,\n rsEmoji\n ].join('|'), 'g');\n\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n /** Used to detect strings that need a more robust regexp to match words. */\n var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n /** Used to assign default `context` object properties. */\n var contextProps = [\n 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n ];\n\n /** Used to make template sourceURLs easier to identify. */\n var templateCounter = -1;\n\n /** Used to identify `toStringTag` values of typed arrays. */\n var typedArrayTags = {};\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n typedArrayTags[uint32Tag] = true;\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\n typedArrayTags[weakMapTag] = false;\n\n /** Used to identify `toStringTag` values supported by `_.clone`. */\n var cloneableTags = {};\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n cloneableTags[boolTag] = cloneableTags[dateTag] =\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\n cloneableTags[numberTag] = cloneableTags[objectTag] =\n cloneableTags[regexpTag] = cloneableTags[setTag] =\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n cloneableTags[errorTag] = cloneableTags[funcTag] =\n cloneableTags[weakMapTag] = false;\n\n /** Used to map Latin Unicode letters to basic Latin letters. */\n var deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 's'\n };\n\n /** Used to map characters to HTML entities. */\n var htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n\n /** Used to map HTML entities to characters. */\n var htmlUnescapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n };\n\n /** Used to escape characters for inclusion in compiled string literals. */\n var stringEscapes = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\\n': 'n',\n '\\r': 'r',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n /** Built-in method references without a dependency on `root`. */\n var freeParseFloat = parseFloat,\n freeParseInt = parseInt;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n /** Used as a reference to the global object. */\n var root = freeGlobal || freeSelf || Function('return this')();\n\n /** Detect free variable `exports`. */\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n /** Detect the popular CommonJS extension `module.exports`. */\n var moduleExports = freeModule && freeModule.exports === freeExports;\n\n /** Detect free variable `process` from Node.js. */\n var freeProcess = moduleExports && freeGlobal.process;\n\n /** Used to access faster Node.js helpers. */\n var nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n }());\n\n /* Node.js helper references. */\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n nodeIsDate = nodeUtil && nodeUtil.isDate,\n nodeIsMap = nodeUtil && nodeUtil.isMap,\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n nodeIsSet = nodeUtil && nodeUtil.isSet,\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Adds the key-value `pair` to `map`.\n *\n * @private\n * @param {Object} map The map to modify.\n * @param {Array} pair The key-value pair to add.\n * @returns {Object} Returns `map`.\n */\n function addMapEntry(map, pair) {\n // Don't return `map.set` because it's not chainable in IE 11.\n map.set(pair[0], pair[1]);\n return map;\n }\n\n /**\n * Adds `value` to `set`.\n *\n * @private\n * @param {Object} set The set to modify.\n * @param {*} value The value to add.\n * @returns {Object} Returns `set`.\n */\n function addSetEntry(set, value) {\n // Don't return `set.add` because it's not chainable in IE 11.\n set.add(value);\n return set;\n }\n\n /**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\n function apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n }\n\n /**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.forEachRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEachRight(array, iteratee) {\n var length = array == null ? 0 : array.length;\n\n while (length--) {\n if (iteratee(array[length], length, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\n function arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n }\n\n /**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n /**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\n function arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n }\n\n /**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.reduceRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the last element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n var length = array == null ? 0 : array.length;\n if (initAccum && length) {\n accumulator = array[--length];\n }\n while (length--) {\n accumulator = iteratee(accumulator, array[length], length, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n var asciiSize = baseProperty('length');\n\n /**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function asciiToArray(string) {\n return string.split('');\n }\n\n /**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function asciiWords(string) {\n return string.match(reAsciiWord) || [];\n }\n\n /**\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n * without support for iteratee shorthands, which iterates over `collection`\n * using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */\n function baseFindKey(collection, predicate, eachFunc) {\n var result;\n eachFunc(collection, function(value, key, collection) {\n if (predicate(value, key, collection)) {\n result = key;\n return false;\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n }\n\n /**\n * This function is like `baseIndexOf` except that it accepts a comparator.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOfWith(array, value, fromIndex, comparator) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (comparator(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\n function baseIsNaN(value) {\n return value !== value;\n }\n\n /**\n * The base implementation of `_.mean` and `_.meanBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the mean.\n */\n function baseMean(array, iteratee) {\n var length = array == null ? 0 : array.length;\n return length ? (baseSum(array, iteratee) / length) : NAN;\n }\n\n /**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\n function baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.sum` and `_.sumBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */\n function baseSum(array, iteratee) {\n var result,\n index = -1,\n length = array.length;\n\n while (++index < length) {\n var current = iteratee(array[index]);\n if (current !== undefined) {\n result = result === undefined ? current : (result + current);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\n function baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n * of key-value pairs for `object` corresponding to the property names of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the key-value pairs.\n */\n function baseToPairs(object, props) {\n return arrayMap(props, function(key) {\n return [key, object[key]];\n });\n }\n\n /**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n function baseUnary(func) {\n return function(value) {\n return func(value);\n };\n }\n\n /**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\n function baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n }\n\n /**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function cacheHas(cache, key) {\n return cache.has(key);\n }\n\n /**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\n function charsStartIndex(strSymbols, chrSymbols) {\n var index = -1,\n length = strSymbols.length;\n\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */\n function charsEndIndex(strSymbols, chrSymbols) {\n var index = strSymbols.length;\n\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */\n function countHolders(array, placeholder) {\n var length = array.length,\n result = 0;\n\n while (length--) {\n if (array[length] === placeholder) {\n ++result;\n }\n }\n return result;\n }\n\n /**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\n var deburrLetter = basePropertyOf(deburredLetters);\n\n /**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n /**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeStringChar(chr) {\n return '\\\\' + stringEscapes[chr];\n }\n\n /**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function getValue(object, key) {\n return object == null ? undefined : object[key];\n }\n\n /**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\n function hasUnicode(string) {\n return reHasUnicode.test(string);\n }\n\n /**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\n function hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n }\n\n /**\n * Converts `iterator` to an array.\n *\n * @private\n * @param {Object} iterator The iterator to convert.\n * @returns {Array} Returns the converted array.\n */\n function iteratorToArray(iterator) {\n var data,\n result = [];\n\n while (!(data = iterator.next()).done) {\n result.push(data.value);\n }\n return result;\n }\n\n /**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\n function mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n }\n\n /**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\n function overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n }\n\n /**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\n function replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value === placeholder || value === PLACEHOLDER) {\n array[index] = PLACEHOLDER;\n result[resIndex++] = index;\n }\n }\n return result;\n }\n\n /**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\n function setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n }\n\n /**\n * Converts `set` to its value-value pairs.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the value-value pairs.\n */\n function setToPairs(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = [value, value];\n });\n return result;\n }\n\n /**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * A specialized version of `_.lastIndexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictLastIndexOf(array, value, fromIndex) {\n var index = fromIndex + 1;\n while (index--) {\n if (array[index] === value) {\n return index;\n }\n }\n return index;\n }\n\n /**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\n function stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n }\n\n /**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n }\n\n /**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n /**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n function unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n ++result;\n }\n return result;\n }\n\n /**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function unicodeToArray(string) {\n return string.match(reUnicode) || [];\n }\n\n /**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Create a new pristine `lodash` function using the `context` object.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Util\n * @param {Object} [context=root] The context object.\n * @returns {Function} Returns a new `lodash` function.\n * @example\n *\n * _.mixin({ 'foo': _.constant('foo') });\n *\n * var lodash = _.runInContext();\n * lodash.mixin({ 'bar': lodash.constant('bar') });\n *\n * _.isFunction(_.foo);\n * // => true\n * _.isFunction(_.bar);\n * // => false\n *\n * lodash.isFunction(lodash.foo);\n * // => false\n * lodash.isFunction(lodash.bar);\n * // => true\n *\n * // Create a suped-up `defer` in Node.js.\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n */\n var runInContext = (function runInContext(context) {\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n /** Built-in constructor references. */\n var Array = context.Array,\n Date = context.Date,\n Error = context.Error,\n Function = context.Function,\n Math = context.Math,\n Object = context.Object,\n RegExp = context.RegExp,\n String = context.String,\n TypeError = context.TypeError;\n\n /** Used for built-in method references. */\n var arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n /** Used to detect overreaching core-js shims. */\n var coreJsData = context['__core-js_shared__'];\n\n /** Used to resolve the decompiled source of functions. */\n var funcToString = funcProto.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to generate unique IDs. */\n var idCounter = 0;\n\n /** Used to detect methods masquerading as native. */\n var maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n }());\n\n /**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n var nativeObjectToString = objectProto.toString;\n\n /** Used to infer the `Object` constructor. */\n var objectCtorString = funcToString.call(Object);\n\n /** Used to restore the original `_` reference in `_.noConflict`. */\n var oldDash = root._;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n );\n\n /** Built-in value references. */\n var Buffer = moduleExports ? context.Buffer : undefined,\n Symbol = context.Symbol,\n Uint8Array = context.Uint8Array,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n symIterator = Symbol ? Symbol.iterator : undefined,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n var defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n }());\n\n /** Mocked built-ins. */\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n /* Built-in method references for those with the same name as other `lodash` methods. */\n var nativeCeil = Math.ceil,\n nativeFloor = Math.floor,\n nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeIsFinite = context.isFinite,\n nativeJoin = arrayProto.join,\n nativeKeys = overArg(Object.keys, Object),\n nativeMax = Math.max,\n nativeMin = Math.min,\n nativeNow = Date.now,\n nativeParseInt = context.parseInt,\n nativeRandom = Math.random,\n nativeReverse = arrayProto.reverse;\n\n /* Built-in method references that are verified to be native. */\n var DataView = getNative(context, 'DataView'),\n Map = getNative(context, 'Map'),\n Promise = getNative(context, 'Promise'),\n Set = getNative(context, 'Set'),\n WeakMap = getNative(context, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n /** Used to store function metadata. */\n var metaMap = WeakMap && new WeakMap;\n\n /** Used to lookup unminified function names. */\n var realNames = {};\n\n /** Used to detect maps, sets, and weakmaps. */\n var dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n /** Used to convert symbols to primitives and strings. */\n var symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash(value) {\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n if (hasOwnProperty.call(value, '__wrapped__')) {\n return wrapperClone(value);\n }\n }\n return new LodashWrapper(value);\n }\n\n /**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\n var baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n }());\n\n /**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\n function baseLodash() {\n // No operation performed.\n }\n\n /**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\n function LodashWrapper(value, chainAll) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__chain__ = !!chainAll;\n this.__index__ = 0;\n this.__values__ = undefined;\n }\n\n /**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n * following template settings to use alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type {Object}\n */\n lodash.templateSettings = {\n\n /**\n * Used to detect `data` property values to be HTML-escaped.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'escape': reEscape,\n\n /**\n * Used to detect code to be evaluated.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'evaluate': reEvaluate,\n\n /**\n * Used to detect `data` property values to inject.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'interpolate': reInterpolate,\n\n /**\n * Used to reference the data object in the template text.\n *\n * @memberOf _.templateSettings\n * @type {string}\n */\n 'variable': '',\n\n /**\n * Used to import variables into the compiled template.\n *\n * @memberOf _.templateSettings\n * @type {Object}\n */\n 'imports': {\n\n /**\n * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type {Function}\n */\n '_': lodash\n }\n };\n\n // Ensure wrappers are instances of `baseLodash`.\n lodash.prototype = baseLodash.prototype;\n lodash.prototype.constructor = lodash;\n\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n LodashWrapper.prototype.constructor = LodashWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\n function LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = MAX_ARRAY_LENGTH;\n this.__views__ = [];\n }\n\n /**\n * Creates a clone of the lazy wrapper object.\n *\n * @private\n * @name clone\n * @memberOf LazyWrapper\n * @returns {Object} Returns the cloned `LazyWrapper` object.\n */\n function lazyClone() {\n var result = new LazyWrapper(this.__wrapped__);\n result.__actions__ = copyArray(this.__actions__);\n result.__dir__ = this.__dir__;\n result.__filtered__ = this.__filtered__;\n result.__iteratees__ = copyArray(this.__iteratees__);\n result.__takeCount__ = this.__takeCount__;\n result.__views__ = copyArray(this.__views__);\n return result;\n }\n\n /**\n * Reverses the direction of lazy iteration.\n *\n * @private\n * @name reverse\n * @memberOf LazyWrapper\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\n */\n function lazyReverse() {\n if (this.__filtered__) {\n var result = new LazyWrapper(this);\n result.__dir__ = -1;\n result.__filtered__ = true;\n } else {\n result = this.clone();\n result.__dir__ *= -1;\n }\n return result;\n }\n\n /**\n * Extracts the unwrapped value from its lazy wrapper.\n *\n * @private\n * @name value\n * @memberOf LazyWrapper\n * @returns {*} Returns the unwrapped value.\n */\n function lazyValue() {\n var array = this.__wrapped__.value(),\n dir = this.__dir__,\n isArr = isArray(array),\n isRight = dir < 0,\n arrLength = isArr ? array.length : 0,\n view = getView(0, arrLength, this.__views__),\n start = view.start,\n end = view.end,\n length = end - start,\n index = isRight ? end : (start - 1),\n iteratees = this.__iteratees__,\n iterLength = iteratees.length,\n resIndex = 0,\n takeCount = nativeMin(length, this.__takeCount__);\n\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n return baseWrapperValue(array, this.__actions__);\n }\n var result = [];\n\n outer:\n while (length-- && resIndex < takeCount) {\n index += dir;\n\n var iterIndex = -1,\n value = array[index];\n\n while (++iterIndex < iterLength) {\n var data = iteratees[iterIndex],\n iteratee = data.iteratee,\n type = data.type,\n computed = iteratee(value);\n\n if (type == LAZY_MAP_FLAG) {\n value = computed;\n } else if (!computed) {\n if (type == LAZY_FILTER_FLAG) {\n continue outer;\n } else {\n break outer;\n }\n }\n }\n result[resIndex++] = value;\n }\n return result;\n }\n\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n LazyWrapper.prototype.constructor = LazyWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n function hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n }\n\n /**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n }\n\n /**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\n function hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n }\n\n // Add methods to `Hash`.\n Hash.prototype.clear = hashClear;\n Hash.prototype['delete'] = hashDelete;\n Hash.prototype.get = hashGet;\n Hash.prototype.has = hashHas;\n Hash.prototype.set = hashSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\n function listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n }\n\n /**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n }\n\n /**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n }\n\n /**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\n function listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n }\n\n // Add methods to `ListCache`.\n ListCache.prototype.clear = listCacheClear;\n ListCache.prototype['delete'] = listCacheDelete;\n ListCache.prototype.get = listCacheGet;\n ListCache.prototype.has = listCacheHas;\n ListCache.prototype.set = listCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n function mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n }\n\n /**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function mapCacheGet(key) {\n return getMapData(this, key).get(key);\n }\n\n /**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function mapCacheHas(key) {\n return getMapData(this, key).has(key);\n }\n\n /**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\n function mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n }\n\n // Add methods to `MapCache`.\n MapCache.prototype.clear = mapCacheClear;\n MapCache.prototype['delete'] = mapCacheDelete;\n MapCache.prototype.get = mapCacheGet;\n MapCache.prototype.has = mapCacheHas;\n MapCache.prototype.set = mapCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n }\n\n /**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\n function setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n }\n\n /**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\n function setCacheHas(value) {\n return this.__data__.has(value);\n }\n\n // Add methods to `SetCache`.\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n SetCache.prototype.has = setCacheHas;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n }\n\n /**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\n function stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n }\n\n /**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function stackGet(key) {\n return this.__data__.get(key);\n }\n\n /**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function stackHas(key) {\n return this.__data__.has(key);\n }\n\n /**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\n function stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n }\n\n // Add methods to `Stack`.\n Stack.prototype.clear = stackClear;\n Stack.prototype['delete'] = stackDelete;\n Stack.prototype.get = stackGet;\n Stack.prototype.has = stackHas;\n Stack.prototype.set = stackSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\n function arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.sample` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @returns {*} Returns the random element.\n */\n function arraySample(array) {\n var length = array.length;\n return length ? array[baseRandom(0, length - 1)] : undefined;\n }\n\n /**\n * A specialized version of `_.sampleSize` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function arraySampleSize(array, n) {\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n }\n\n /**\n * A specialized version of `_.shuffle` for arrays.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function arrayShuffle(array) {\n return shuffleSelf(copyArray(array));\n }\n\n /**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n }\n\n /**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n }\n\n /**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n }\n\n /**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n }\n\n /**\n * The base implementation of `_.at` without support for individual paths.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {string[]} paths The property paths to pick.\n * @returns {Array} Returns the picked elements.\n */\n function baseAt(object, paths) {\n var index = -1,\n length = paths.length,\n result = Array(length),\n skip = object == null;\n\n while (++index < length) {\n result[index] = skip ? undefined : get(object, paths[index]);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.clamp` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n */\n function baseClamp(number, lower, upper) {\n if (number === number) {\n if (upper !== undefined) {\n number = number <= upper ? number : upper;\n }\n if (lower !== undefined) {\n number = number >= lower ? number : lower;\n }\n }\n return number;\n }\n\n /**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\n function baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, baseClone, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n }\n\n /**\n * The base implementation of `_.conforms` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n */\n function baseConforms(source) {\n var props = keys(source);\n return function(object) {\n return baseConformsTo(object, source, props);\n };\n }\n\n /**\n * The base implementation of `_.conformsTo` which accepts `props` to check.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n */\n function baseConformsTo(object, source, props) {\n var length = props.length;\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (length--) {\n var key = props[length],\n predicate = source[key],\n value = object[key];\n\n if ((value === undefined && !(key in object)) || !predicate(value)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\n * to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Array} args The arguments to provide to `func`.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n function baseDelay(func, wait, args) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return setTimeout(function() { func.apply(undefined, args); }, wait);\n }\n\n /**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\n function baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEach = createBaseEach(baseForOwn);\n\n /**\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n /**\n * The base implementation of `_.every` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\n function baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n }\n\n /**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\n function baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.fill` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n */\n function baseFill(array, value, start, end) {\n var length = array.length;\n\n start = toInteger(start);\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = (end === undefined || end > length) ? length : toInteger(end);\n if (end < 0) {\n end += length;\n }\n end = start > end ? 0 : toLength(end);\n while (start < end) {\n array[start++] = value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\n function baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseFor = createBaseFor();\n\n /**\n * This function is like `baseFor` except that it iterates over properties\n * in the opposite order.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseForRight = createBaseFor(true);\n\n /**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwnRight(object, iteratee) {\n return object && baseForRight(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.functions` which creates an array of\n * `object` function property names filtered from `props`.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} props The property names to filter.\n * @returns {Array} Returns the function names.\n */\n function baseFunctions(object, props) {\n return arrayFilter(props, function(key) {\n return isFunction(object[key]);\n });\n }\n\n /**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n }\n\n /**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n }\n\n /**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n function baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n }\n\n /**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\n function baseGt(value, other) {\n return value > other;\n }\n\n /**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n }\n\n /**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHasIn(object, key) {\n return object != null && key in Object(object);\n }\n\n /**\n * The base implementation of `_.inRange` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to check.\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */\n function baseInRange(number, start, end) {\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\n }\n\n /**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\n function baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.invert` and `_.invertBy` which inverts\n * `object` with values transformed by `iteratee` and set by `setter`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform values.\n * @param {Object} accumulator The initial inverted object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseInverter(object, setter, iteratee, accumulator) {\n baseForOwn(object, function(value, key, object) {\n setter(accumulator, iteratee(value), key, object);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.invoke` without support for individual\n * method arguments.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\n function baseInvoke(object, path, args) {\n path = castPath(path, object);\n object = parent(object, path);\n var func = object == null ? object : object[toKey(last(path))];\n return func == null ? undefined : apply(func, object, args);\n }\n\n /**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\n function baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n }\n\n /**\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n */\n function baseIsArrayBuffer(value) {\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n }\n\n /**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */\n function baseIsDate(value) {\n return isObjectLike(value) && baseGetTag(value) == dateTag;\n }\n\n /**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n function baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n }\n\n /**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n }\n\n /**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\n function baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n }\n\n /**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\n function baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\n function baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n }\n\n /**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\n function baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n }\n\n /**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\n function baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n }\n\n /**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\n function baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n }\n\n /**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\n function baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n }\n\n /**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\n function baseLt(value, other) {\n return value < other;\n }\n\n /**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n }\n\n /**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n }\n\n /**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n }\n\n /**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n if (isObject(srcValue)) {\n stack || (stack = new Stack);\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(object[key], srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n }\n\n /**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = object[key],\n srcValue = source[key],\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n }\n\n /**\n * The base implementation of `_.nth` which doesn't coerce arguments.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {number} n The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n */\n function baseNth(array, n) {\n var length = array.length;\n if (!length) {\n return;\n }\n n += n < 0 ? length : 0;\n return isIndex(n, length) ? array[n] : undefined;\n }\n\n /**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\n function baseOrderBy(collection, iteratees, orders) {\n var index = -1;\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n }\n\n /**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\n function basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n }\n\n /**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\n function basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n }\n\n /**\n * The base implementation of `_.pullAllBy` without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n */\n function basePullAll(array, values, iteratee, comparator) {\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n index = -1,\n length = values.length,\n seen = array;\n\n if (array === values) {\n values = copyArray(values);\n }\n if (iteratee) {\n seen = arrayMap(array, baseUnary(iteratee));\n }\n while (++index < length) {\n var fromIndex = 0,\n value = values[index],\n computed = iteratee ? iteratee(value) : value;\n\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n if (seen !== array) {\n splice.call(seen, fromIndex, 1);\n }\n splice.call(array, fromIndex, 1);\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.pullAt` without support for individual\n * indexes or capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */\n function basePullAt(array, indexes) {\n var length = array ? indexes.length : 0,\n lastIndex = length - 1;\n\n while (length--) {\n var index = indexes[length];\n if (length == lastIndex || index !== previous) {\n var previous = index;\n if (isIndex(index)) {\n splice.call(array, index, 1);\n } else {\n baseUnset(array, index);\n }\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.random` without support for returning\n * floating-point numbers.\n *\n * @private\n * @param {number} lower The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the random number.\n */\n function baseRandom(lower, upper) {\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n }\n\n /**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\n function baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n }\n\n /**\n * The base implementation of `_.repeat` which doesn't coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */\n function baseRepeat(string, n) {\n var result = '';\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n return result;\n }\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n do {\n if (n % 2) {\n result += string;\n }\n n = nativeFloor(n / 2);\n if (n) {\n string += string;\n }\n } while (n);\n\n return result;\n }\n\n /**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\n function baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n }\n\n /**\n * The base implementation of `_.sample`.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n */\n function baseSample(collection) {\n return arraySample(values(collection));\n }\n\n /**\n * The base implementation of `_.sampleSize` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function baseSampleSize(collection, n) {\n var array = values(collection);\n return shuffleSelf(array, baseClamp(n, 0, array.length));\n }\n\n /**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n }\n\n /**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var baseSetData = !metaMap ? identity : function(func, data) {\n metaMap.set(func, data);\n return func;\n };\n\n /**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n };\n\n /**\n * The base implementation of `_.shuffle`.\n *\n * @private\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function baseShuffle(collection) {\n return shuffleSelf(values(collection));\n }\n\n /**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n }\n\n /**\n * The base implementation of `_.some` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n }\n\n /**\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n * performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndex(array, value, retHighest) {\n var low = 0,\n high = array == null ? low : array.length;\n\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n while (low < high) {\n var mid = (low + high) >>> 1,\n computed = array[mid];\n\n if (computed !== null && !isSymbol(computed) &&\n (retHighest ? (computed <= value) : (computed < value))) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return high;\n }\n return baseSortedIndexBy(array, value, identity, retHighest);\n }\n\n /**\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n * which invokes `iteratee` for `value` and each element of `array` to compute\n * their sort ranking. The iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The iteratee invoked per element.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\n value = iteratee(value);\n\n var low = 0,\n high = array == null ? 0 : array.length,\n valIsNaN = value !== value,\n valIsNull = value === null,\n valIsSymbol = isSymbol(value),\n valIsUndefined = value === undefined;\n\n while (low < high) {\n var mid = nativeFloor((low + high) / 2),\n computed = iteratee(array[mid]),\n othIsDefined = computed !== undefined,\n othIsNull = computed === null,\n othIsReflexive = computed === computed,\n othIsSymbol = isSymbol(computed);\n\n if (valIsNaN) {\n var setLow = retHighest || othIsReflexive;\n } else if (valIsUndefined) {\n setLow = othIsReflexive && (retHighest || othIsDefined);\n } else if (valIsNull) {\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n } else if (valIsSymbol) {\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n } else if (othIsNull || othIsSymbol) {\n setLow = false;\n } else {\n setLow = retHighest ? (computed <= value) : (computed < value);\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n }\n\n /**\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseSortedUniq(array, iteratee) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n if (!index || !eq(computed, seen)) {\n var seen = computed;\n result[resIndex++] = value === 0 ? 0 : value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toNumber` which doesn't ensure correct\n * conversions of binary, hexadecimal, or octal string values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n */\n function baseToNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n return +value;\n }\n\n /**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n function baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\n function baseUnset(object, path) {\n path = castPath(path, object);\n object = parent(object, path);\n return object == null || delete object[toKey(last(path))];\n }\n\n /**\n * The base implementation of `_.update`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to update.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseUpdate(object, path, updater, customizer) {\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\n }\n\n /**\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n * without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseWhile(array, predicate, isDrop, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length) &&\n predicate(array[index], index, array)) {}\n\n return isDrop\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n }\n\n /**\n * The base implementation of `wrapperValue` which returns the result of\n * performing a sequence of actions on the unwrapped `value`, where each\n * successive action is supplied the return value of the previous.\n *\n * @private\n * @param {*} value The unwrapped value.\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\n * @returns {*} Returns the resolved value.\n */\n function baseWrapperValue(value, actions) {\n var result = value;\n if (result instanceof LazyWrapper) {\n result = result.value();\n }\n return arrayReduce(actions, function(result, action) {\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\n }, result);\n }\n\n /**\n * The base implementation of methods like `_.xor`, without support for\n * iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of values.\n */\n function baseXor(arrays, iteratee, comparator) {\n var length = arrays.length;\n if (length < 2) {\n return length ? baseUniq(arrays[0]) : [];\n }\n var index = -1,\n result = Array(length);\n\n while (++index < length) {\n var array = arrays[index],\n othIndex = -1;\n\n while (++othIndex < length) {\n if (othIndex != index) {\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n }\n }\n }\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n }\n\n /**\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n *\n * @private\n * @param {Array} props The property identifiers.\n * @param {Array} values The property values.\n * @param {Function} assignFunc The function to assign values.\n * @returns {Object} Returns the new object.\n */\n function baseZipObject(props, values, assignFunc) {\n var index = -1,\n length = props.length,\n valsLength = values.length,\n result = {};\n\n while (++index < length) {\n var value = index < valsLength ? values[index] : undefined;\n assignFunc(result, props[index], value);\n }\n return result;\n }\n\n /**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\n function castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n }\n\n /**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\n function castFunction(value) {\n return typeof value == 'function' ? value : identity;\n }\n\n /**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\n function castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n }\n\n /**\n * A `baseRest` alias which can be replaced with `identity` by module\n * replacement plugins.\n *\n * @private\n * @type {Function}\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n var castRest = baseRest;\n\n /**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\n function castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n }\n\n /**\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n *\n * @private\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\n */\n var clearTimeout = ctxClearTimeout || function(id) {\n return root.clearTimeout(id);\n };\n\n /**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\n function cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n }\n\n /**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\n function cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n }\n\n /**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\n function cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n }\n\n /**\n * Creates a clone of `map`.\n *\n * @private\n * @param {Object} map The map to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned map.\n */\n function cloneMap(map, isDeep, cloneFunc) {\n var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map);\n return arrayReduce(array, addMapEntry, new map.constructor);\n }\n\n /**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\n function cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n }\n\n /**\n * Creates a clone of `set`.\n *\n * @private\n * @param {Object} set The set to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned set.\n */\n function cloneSet(set, isDeep, cloneFunc) {\n var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set);\n return arrayReduce(array, addSetEntry, new set.constructor);\n }\n\n /**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\n function cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n }\n\n /**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\n function cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n }\n\n /**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\n function compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n }\n\n /**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\n function compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n }\n\n /**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgs(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersLength = holders.length,\n leftIndex = -1,\n leftLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(leftLength + rangeLength),\n isUncurried = !isCurried;\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n }\n while (rangeLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n }\n\n /**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgsRight(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersIndex = -1,\n holdersLength = holders.length,\n rightIndex = -1,\n rightLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(rangeLength + rightLength),\n isUncurried = !isCurried;\n\n while (++argsIndex < rangeLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n }\n return result;\n }\n\n /**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\n function copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n }\n\n /**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\n function copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n }\n\n /**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n }\n\n /**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n }\n\n /**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\n function createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n };\n }\n\n /**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\n function createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n }\n\n /**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n }\n\n /**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createBind(func, bitmask, thisArg) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, arguments);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\n function createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n }\n\n /**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\n function createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n }\n\n /**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCtor(Ctor) {\n return function() {\n // Use a `switch` statement to work with class constructors. See\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0: return new Ctor;\n case 1: return new Ctor(args[0]);\n case 2: return new Ctor(args[0], args[1]);\n case 3: return new Ctor(args[0], args[1], args[2]);\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n }\n\n /**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCurry(func, bitmask, arity) {\n var Ctor = createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length,\n placeholder = getHolder(wrapper);\n\n while (index--) {\n args[index] = arguments[index];\n }\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n ? []\n : replaceHolders(args, placeholder);\n\n length -= holders.length;\n if (length < arity) {\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\n args, holders, undefined, undefined, arity - length);\n }\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return apply(fn, this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\n function createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = getIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n }\n\n /**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\n function createFlow(fromRight) {\n return flatRest(function(funcs) {\n var length = funcs.length,\n index = length,\n prereq = LodashWrapper.prototype.thru;\n\n if (fromRight) {\n funcs.reverse();\n }\n while (index--) {\n var func = funcs[index];\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n var wrapper = new LodashWrapper([], true);\n }\n }\n index = wrapper ? index : length;\n while (++index < length) {\n func = funcs[index];\n\n var funcName = getFuncName(func),\n data = funcName == 'wrapper' ? getData(func) : undefined;\n\n if (data && isLaziable(data[0]) &&\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n !data[4].length && data[9] == 1\n ) {\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n } else {\n wrapper = (func.length == 1 && isLaziable(func))\n ? wrapper[funcName]()\n : wrapper.thru(func);\n }\n }\n return function() {\n var args = arguments,\n value = args[0];\n\n if (wrapper && args.length == 1 && isArray(value)) {\n return wrapper.plant(value).value();\n }\n var index = 0,\n result = length ? funcs[index].apply(this, args) : value;\n\n while (++index < length) {\n result = funcs[index].call(this, result);\n }\n return result;\n };\n });\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n * to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & WRAP_ARY_FLAG,\n isBind = bitmask & WRAP_BIND_FLAG,\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n isFlip = bitmask & WRAP_FLIP_FLAG,\n Ctor = isBindKey ? undefined : createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length;\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (isCurried) {\n var placeholder = getHolder(wrapper),\n holdersCount = countHolders(args, placeholder);\n }\n if (partials) {\n args = composeArgs(args, partials, holders, isCurried);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n }\n length -= holdersCount;\n if (isCurried && length < arity) {\n var newHolders = replaceHolders(args, placeholder);\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n args, newHolders, argPos, ary, arity - length\n );\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n length = args.length;\n if (argPos) {\n args = reorder(args, argPos);\n } else if (isFlip && length > 1) {\n args.reverse();\n }\n if (isAry && ary < length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtor(fn);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.invertBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} toIteratee The function to resolve iteratees.\n * @returns {Function} Returns the new inverter function.\n */\n function createInverter(setter, toIteratee) {\n return function(object, iteratee) {\n return baseInverter(object, setter, toIteratee(iteratee), {});\n };\n }\n\n /**\n * Creates a function that performs a mathematical operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @param {number} [defaultValue] The value used for `undefined` arguments.\n * @returns {Function} Returns the new mathematical operation function.\n */\n function createMathOperation(operator, defaultValue) {\n return function(value, other) {\n var result;\n if (value === undefined && other === undefined) {\n return defaultValue;\n }\n if (value !== undefined) {\n result = value;\n }\n if (other !== undefined) {\n if (result === undefined) {\n return other;\n }\n if (typeof value == 'string' || typeof other == 'string') {\n value = baseToString(value);\n other = baseToString(other);\n } else {\n value = baseToNumber(value);\n other = baseToNumber(other);\n }\n result = operator(value, other);\n }\n return result;\n };\n }\n\n /**\n * Creates a function like `_.over`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over iteratees.\n * @returns {Function} Returns the new over function.\n */\n function createOver(arrayFunc) {\n return flatRest(function(iteratees) {\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n return baseRest(function(args) {\n var thisArg = this;\n return arrayFunc(iteratees, function(iteratee) {\n return apply(iteratee, thisArg, args);\n });\n });\n });\n }\n\n /**\n * Creates the padding for `string` based on `length`. The `chars` string\n * is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {number} length The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padding for `string`.\n */\n function createPadding(length, chars) {\n chars = chars === undefined ? ' ' : baseToString(chars);\n\n var charsLength = chars.length;\n if (charsLength < 2) {\n return charsLength ? baseRepeat(chars, length) : chars;\n }\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n return hasUnicode(chars)\n ? castSlice(stringToArray(result), 0, length).join('')\n : result.slice(0, length);\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n * the new function.\n * @returns {Function} Returns the new wrapped function.\n */\n function createPartial(func, bitmask, thisArg, partials) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength),\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n return apply(fn, isBind ? thisArg : this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\n function createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of `-0` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n }\n\n /**\n * Creates a function that performs a relational operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @returns {Function} Returns the new relational operation function.\n */\n function createRelationalOperation(operator) {\n return function(value, other) {\n if (!(typeof value == 'string' && typeof other == 'string')) {\n value = toNumber(value);\n other = toNumber(other);\n }\n return operator(value, other);\n };\n }\n\n /**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n var isCurry = bitmask & WRAP_CURRY_FLAG,\n newHolders = isCurry ? holders : undefined,\n newHoldersRight = isCurry ? undefined : holders,\n newPartials = isCurry ? partials : undefined,\n newPartialsRight = isCurry ? undefined : partials;\n\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n }\n var newData = [\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n newHoldersRight, argPos, ary, arity\n ];\n\n var result = wrapFunc.apply(undefined, newData);\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return setWrapToString(result, func, bitmask);\n }\n\n /**\n * Creates a function like `_.round`.\n *\n * @private\n * @param {string} methodName The name of the `Math` method to use when rounding.\n * @returns {Function} Returns the new round function.\n */\n function createRound(methodName) {\n var func = Math[methodName];\n return function(number, precision) {\n number = toNumber(number);\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n if (precision) {\n // Shift with exponential notation to avoid floating-point issues.\n // See [MDN](https://mdn.io/round#Examples) for more details.\n var pair = (toString(number) + 'e').split('e'),\n value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n pair = (toString(value) + 'e').split('e');\n return +(pair[0] + 'e' + (+pair[1] - precision));\n }\n return func(number);\n };\n }\n\n /**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n };\n\n /**\n * Creates a `_.toPairs` or `_.toPairsIn` function.\n *\n * @private\n * @param {Function} keysFunc The function to get the keys of a given object.\n * @returns {Function} Returns the new pairs function.\n */\n function createToPairs(keysFunc) {\n return function(object) {\n var tag = getTag(object);\n if (tag == mapTag) {\n return mapToArray(object);\n }\n if (tag == setTag) {\n return setToPairs(object);\n }\n return baseToPairs(object, keysFunc(object));\n };\n }\n\n /**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * 512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n arity = arity === undefined ? arity : toInteger(arity);\n length -= holders ? holders.length : 0;\n\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : getData(func);\n\n var newData = [\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n argPos, ary, arity\n ];\n\n if (data) {\n mergeData(newData, data);\n }\n func = newData[0];\n bitmask = newData[1];\n thisArg = newData[2];\n partials = newData[3];\n holders = newData[4];\n arity = newData[9] = newData[9] === undefined\n ? (isBindKey ? 0 : func.length)\n : nativeMax(newData[9] - length, 0);\n\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n }\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n var result = createBind(func, bitmask, thisArg);\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n result = createCurry(func, bitmask, arity);\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n result = createPartial(func, bitmask, thisArg, partials);\n } else {\n result = createHybrid.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setWrapToString(setter(result, newData), func, bitmask);\n }\n\n /**\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n * of source objects to the destination object for all destination properties\n * that resolve to `undefined`.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n }\n\n /**\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n * objects into destination objects that are passed thru.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to merge.\n * @param {Object} object The parent object of `objValue`.\n * @param {Object} source The parent object of `srcValue`.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n if (isObject(objValue) && isObject(srcValue)) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, objValue);\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n stack['delete'](srcValue);\n }\n return objValue;\n }\n\n /**\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n * objects.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {string} key The key of the property to inspect.\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n */\n function customOmitClone(value) {\n return isPlainObject(value) ? undefined : value;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n function flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n }\n\n /**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n }\n\n /**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n }\n\n /**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\n var getData = !metaMap ? noop : function(func) {\n return metaMap.get(func);\n };\n\n /**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\n function getFuncName(func) {\n var result = (func.name + ''),\n array = realNames[result],\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n }\n\n /**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */\n function getHolder(func) {\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n return object.placeholder;\n }\n\n /**\n * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n * this function returns the custom method, otherwise it returns `baseIteratee`.\n * If arguments are provided, the chosen function is invoked with them and\n * its result is returned.\n *\n * @private\n * @param {*} [value] The value to convert to an iteratee.\n * @param {number} [arity] The arity of the created iteratee.\n * @returns {Function} Returns the chosen function or its result.\n */\n function getIteratee() {\n var result = lodash.iteratee || iteratee;\n result = result === iteratee ? baseIteratee : result;\n return arguments.length ? result(arguments[0], arguments[1]) : result;\n }\n\n /**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\n function getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n }\n\n /**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\n function getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n }\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n function getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n }\n\n /**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n function getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n }\n\n /**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n };\n\n /**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n };\n\n /**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n var getTag = baseGetTag;\n\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n }\n\n /**\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\n *\n * @private\n * @param {number} start The start of the view.\n * @param {number} end The end of the view.\n * @param {Array} transforms The transformations to apply to the view.\n * @returns {Object} Returns an object containing the `start` and `end`\n * positions of the view.\n */\n function getView(start, end, transforms) {\n var index = -1,\n length = transforms.length;\n\n while (++index < length) {\n var data = transforms[index],\n size = data.size;\n\n switch (data.type) {\n case 'drop': start += size; break;\n case 'dropRight': end -= size; break;\n case 'take': end = nativeMin(end, start + size); break;\n case 'takeRight': start = nativeMax(start, end - size); break;\n }\n }\n return { 'start': start, 'end': end };\n }\n\n /**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */\n function getWrapDetails(source) {\n var match = source.match(reWrapDetails);\n return match ? match[1].split(reSplitDetails) : [];\n }\n\n /**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\n function hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n }\n\n /**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\n function initCloneArray(array) {\n var length = array.length,\n result = array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n }\n\n /**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n }\n\n /**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneByTag(object, tag, cloneFunc, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return cloneMap(object, isDeep, cloneFunc);\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return cloneSet(object, isDeep, cloneFunc);\n\n case symbolTag:\n return cloneSymbol(object);\n }\n }\n\n /**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */\n function insertWrapDetails(source, details) {\n var length = details.length;\n if (!length) {\n return source;\n }\n var lastIndex = length - 1;\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n details = details.join(length > 2 ? ', ' : ' ');\n return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n }\n\n /**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\n function isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n }\n\n /**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\n function isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n }\n\n /**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\n function isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n }\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n }\n\n /**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\n function isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n }\n\n /**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n * else `false`.\n */\n function isLaziable(func) {\n var funcName = getFuncName(func),\n other = lodash[funcName];\n\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n return false;\n }\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n }\n\n /**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\n function isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n }\n\n /**\n * Checks if `func` is capable of being masked.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n */\n var isMaskable = coreJsData ? isFunction : stubFalse;\n\n /**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\n function isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n }\n\n /**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\n function isStrictComparable(value) {\n return value === value && !isObject(value);\n }\n\n /**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n }\n\n /**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\n function memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n }\n\n /**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\n function mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n var isCombo =\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & WRAP_BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = value;\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & WRAP_ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n }\n\n /**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\n function objectToString(value) {\n return nativeObjectToString.call(value);\n }\n\n /**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\n function overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n }\n\n /**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\n function parent(object, path) {\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n }\n\n /**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\n function reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = copyArray(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n }\n\n /**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var setData = shortOut(baseSetData);\n\n /**\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n var setTimeout = ctxSetTimeout || function(func, wait) {\n return root.setTimeout(func, wait);\n };\n\n /**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var setToString = shortOut(baseSetToString);\n\n /**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */\n function setWrapToString(wrapper, reference, bitmask) {\n var source = (reference + '');\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n }\n\n /**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\n function shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n }\n\n /**\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @param {number} [size=array.length] The size of `array`.\n * @returns {Array} Returns `array`.\n */\n function shuffleSelf(array, size) {\n var index = -1,\n length = array.length,\n lastIndex = length - 1;\n\n size = size === undefined ? length : size;\n while (++index < size) {\n var rand = baseRandom(index, lastIndex),\n value = array[rand];\n\n array[rand] = array[index];\n array[index] = value;\n }\n array.length = size;\n return array;\n }\n\n /**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\n var stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (reLeadingDot.test(string)) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n });\n\n /**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\n function toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\n function toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n }\n\n /**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */\n function updateWrapDetails(details, bitmask) {\n arrayEach(wrapFlags, function(pair) {\n var value = '_.' + pair[0];\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n details.push(value);\n }\n });\n return details.sort();\n }\n\n /**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\n function wrapperClone(wrapper) {\n if (wrapper instanceof LazyWrapper) {\n return wrapper.clone();\n }\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n result.__actions__ = copyArray(wrapper.__actions__);\n result.__index__ = wrapper.__index__;\n result.__values__ = wrapper.__values__;\n return result;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\n function chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n }\n\n /**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\n function compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * Creates a new array concatenating `array` with any additional arrays\n * and/or values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to concatenate.\n * @param {...*} [values] The values to concatenate.\n * @returns {Array} Returns the new concatenated array.\n * @example\n *\n * var array = [1];\n * var other = _.concat(array, 2, [3], [[4]]);\n *\n * console.log(other);\n * // => [1, 2, 3, [4]]\n *\n * console.log(array);\n * // => [1]\n */\n function concat() {\n var length = arguments.length;\n if (!length) {\n return [];\n }\n var args = Array(length - 1),\n array = arguments[0],\n index = length;\n\n while (index--) {\n args[index - 1] = arguments[index];\n }\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n }\n\n /**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\n var difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var differenceBy = baseRest(function(array, values) {\n var iteratee = last(values);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`. The order and\n * references of result values are determined by the first array. The comparator\n * is invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n *\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }]\n */\n var differenceWith = baseRest(function(array, values) {\n var comparator = last(values);\n if (isArrayLikeObject(comparator)) {\n comparator = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n : [];\n });\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function drop(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.dropRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropRightWhile(users, ['active', false]);\n * // => objects for ['barney']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropRightWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.dropWhile(users, function(o) { return !o.active; });\n * // => objects for ['pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropWhile(users, ['active', false]);\n * // => objects for ['pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true)\n : [];\n }\n\n /**\n * Fills elements of `array` with `value` from `start` up to, but not\n * including, `end`.\n *\n * **Note:** This method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Array\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.fill(array, 'a');\n * console.log(array);\n * // => ['a', 'a', 'a']\n *\n * _.fill(Array(3), 2);\n * // => [2, 2, 2]\n *\n * _.fill([4, 6, 8, 10], '*', 1, 3);\n * // => [4, '*', '*', 10]\n */\n function fill(array, value, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n start = 0;\n end = length;\n }\n return baseFill(array, value, start, end);\n }\n\n /**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\n function findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index);\n }\n\n /**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n * // => 2\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastIndex(users, ['active', false]);\n * // => 2\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastIndex(users, 'active');\n * // => 0\n */\n function findLastIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length - 1;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = fromIndex < 0\n ? nativeMax(length + index, 0)\n : nativeMin(index, length - 1);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n }\n\n /**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\n function flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n }\n\n /**\n * Recursively flattens `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\n * // => [1, 2, 3, 4, 5]\n */\n function flattenDeep(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, INFINITY) : [];\n }\n\n /**\n * Recursively flatten `array` up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * var array = [1, [2, [3, [4]], 5]];\n *\n * _.flattenDepth(array, 1);\n * // => [1, 2, [3, [4]], 5]\n *\n * _.flattenDepth(array, 2);\n * // => [1, 2, 3, [4], 5]\n */\n function flattenDepth(array, depth) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(array, depth);\n }\n\n /**\n * The inverse of `_.toPairs`; this method returns an object composed\n * from key-value `pairs`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} pairs The key-value pairs.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.fromPairs([['a', 1], ['b', 2]]);\n * // => { 'a': 1, 'b': 2 }\n */\n function fromPairs(pairs) {\n var index = -1,\n length = pairs == null ? 0 : pairs.length,\n result = {};\n\n while (++index < length) {\n var pair = pairs[index];\n result[pair[0]] = pair[1];\n }\n return result;\n }\n\n /**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\n function head(array) {\n return (array && array.length) ? array[0] : undefined;\n }\n\n /**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */\n function indexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseIndexOf(array, value, index);\n }\n\n /**\n * Gets all but the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n */\n function initial(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 0, -1) : [];\n }\n\n /**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\n var intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `iteratee`\n * which is invoked for each element of each `arrays` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [2.1]\n *\n * // The `_.property` iteratee shorthand.\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }]\n */\n var intersectionBy = baseRest(function(arrays) {\n var iteratee = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n if (iteratee === last(mapped)) {\n iteratee = undefined;\n } else {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `comparator`\n * which is invoked to compare elements of `arrays`. The order and references\n * of result values are determined by the first array. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.intersectionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }]\n */\n var intersectionWith = baseRest(function(arrays) {\n var comparator = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n comparator = typeof comparator == 'function' ? comparator : undefined;\n if (comparator) {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, undefined, comparator)\n : [];\n });\n\n /**\n * Converts all elements in `array` into a string separated by `separator`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to convert.\n * @param {string} [separator=','] The element separator.\n * @returns {string} Returns the joined string.\n * @example\n *\n * _.join(['a', 'b', 'c'], '~');\n * // => 'a~b~c'\n */\n function join(array, separator) {\n return array == null ? '' : nativeJoin.call(array, separator);\n }\n\n /**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\n function last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n }\n\n /**\n * This method is like `_.indexOf` except that it iterates over elements of\n * `array` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 1, 2], 2);\n * // => 3\n *\n * // Search from the `fromIndex`.\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n * // => 1\n */\n function lastIndexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n }\n return value === value\n ? strictLastIndexOf(array, value, index)\n : baseFindIndex(array, baseIsNaN, index, true);\n }\n\n /**\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\n * element from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.11.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=0] The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n *\n * _.nth(array, 1);\n * // => 'b'\n *\n * _.nth(array, -2);\n * // => 'c';\n */\n function nth(array, n) {\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n }\n\n /**\n * Removes all given values from `array` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n * to remove elements from an array by predicate.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...*} [values] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pull(array, 'a', 'c');\n * console.log(array);\n * // => ['b', 'b']\n */\n var pull = baseRest(pullAll);\n\n /**\n * This method is like `_.pull` except that it accepts an array of values to remove.\n *\n * **Note:** Unlike `_.difference`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pullAll(array, ['a', 'c']);\n * console.log(array);\n * // => ['b', 'b']\n */\n function pullAll(array, values) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values)\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\n * invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The iteratee is invoked with one argument: (value).\n *\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n *\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n * console.log(array);\n * // => [{ 'x': 2 }]\n */\n function pullAllBy(array, values, iteratee) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, getIteratee(iteratee, 2))\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `comparator` which\n * is invoked to compare elements of `array` to `values`. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n *\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n * console.log(array);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n */\n function pullAllWith(array, values, comparator) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, undefined, comparator)\n : array;\n }\n\n /**\n * Removes elements from `array` corresponding to `indexes` and returns an\n * array of removed elements.\n *\n * **Note:** Unlike `_.at`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n * var pulled = _.pullAt(array, [1, 3]);\n *\n * console.log(array);\n * // => ['a', 'c']\n *\n * console.log(pulled);\n * // => ['b', 'd']\n */\n var pullAt = flatRest(function(array, indexes) {\n var length = array == null ? 0 : array.length,\n result = baseAt(array, indexes);\n\n basePullAt(array, arrayMap(indexes, function(index) {\n return isIndex(index, length) ? +index : index;\n }).sort(compareAscending));\n\n return result;\n });\n\n /**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is invoked\n * with three arguments: (value, index, array).\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n * to pull elements from an array by value.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n * return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */\n function remove(array, predicate) {\n var result = [];\n if (!(array && array.length)) {\n return result;\n }\n var index = -1,\n indexes = [],\n length = array.length;\n\n predicate = getIteratee(predicate, 3);\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result.push(value);\n indexes.push(index);\n }\n }\n basePullAt(array, indexes);\n return result;\n }\n\n /**\n * Reverses `array` so that the first element becomes the last, the second\n * element becomes the second to last, and so on.\n *\n * **Note:** This method mutates `array` and is based on\n * [`Array#reverse`](https://mdn.io/Array/reverse).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.reverse(array);\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function reverse(array) {\n return array == null ? array : nativeReverse.call(array);\n }\n\n /**\n * Creates a slice of `array` from `start` up to, but not including, `end`.\n *\n * **Note:** This method is used instead of\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n * returned.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function slice(array, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n start = 0;\n end = length;\n }\n else {\n start = start == null ? 0 : toInteger(start);\n end = end === undefined ? length : toInteger(end);\n }\n return baseSlice(array, start, end);\n }\n\n /**\n * Uses a binary search to determine the lowest index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n */\n function sortedIndex(array, value) {\n return baseSortedIndex(array, value);\n }\n\n /**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n * // => 0\n */\n function sortedIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n }\n\n /**\n * This method is like `_.indexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n * // => 1\n */\n function sortedIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value);\n if (index < length && eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.sortedIndex` except that it returns the highest\n * index at which `value` should be inserted into `array` in order to\n * maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n * // => 4\n */\n function sortedLastIndex(array, value) {\n return baseSortedIndex(array, value, true);\n }\n\n /**\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 1\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n * // => 1\n */\n function sortedLastIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n }\n\n /**\n * This method is like `_.lastIndexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n * // => 3\n */\n function sortedLastIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value, true) - 1;\n if (eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.uniq` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniq([1, 1, 2]);\n * // => [1, 2]\n */\n function sortedUniq(array) {\n return (array && array.length)\n ? baseSortedUniq(array)\n : [];\n }\n\n /**\n * This method is like `_.uniqBy` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n * // => [1.1, 2.3]\n */\n function sortedUniqBy(array, iteratee) {\n return (array && array.length)\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\n : [];\n }\n\n /**\n * Gets all but the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.tail([1, 2, 3]);\n * // => [2, 3]\n */\n function tail(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 1, length) : [];\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.take([1, 2, 3]);\n * // => [1]\n *\n * _.take([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.take([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.take([1, 2, 3], 0);\n * // => []\n */\n function take(array, n, guard) {\n if (!(array && array.length)) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRight([1, 2, 3]);\n * // => [3]\n *\n * _.takeRight([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.takeRight([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.takeRight([1, 2, 3], 0);\n * // => []\n */\n function takeRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.takeRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeRightWhile(users, ['active', false]);\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeRightWhile(users, 'active');\n * // => []\n */\n function takeRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.takeWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeWhile(users, ['active', false]);\n * // => objects for ['barney', 'fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeWhile(users, 'active');\n * // => []\n */\n function takeWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3))\n : [];\n }\n\n /**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\n var union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n });\n\n /**\n * This method is like `_.union` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which uniqueness is computed. Result values are chosen from the first\n * array in which the value occurs. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n var unionBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.union` except that it accepts `comparator` which\n * is invoked to compare elements of `arrays`. Result values are chosen from\n * the first array in which the value occurs. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.unionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var unionWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n });\n\n /**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\n function uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n function uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */\n function uniqWith(array, comparator) {\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n }\n\n /**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @since 1.2.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * _.unzip(zipped);\n * // => [['a', 'b'], [1, 2], [true, false]]\n */\n function unzip(array) {\n if (!(array && array.length)) {\n return [];\n }\n var length = 0;\n array = arrayFilter(array, function(group) {\n if (isArrayLikeObject(group)) {\n length = nativeMax(group.length, length);\n return true;\n }\n });\n return baseTimes(length, function(index) {\n return arrayMap(array, baseProperty(index));\n });\n }\n\n /**\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\n * how regrouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * regrouped values.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * _.unzipWith(zipped, _.add);\n * // => [3, 30, 300]\n */\n function unzipWith(array, iteratee) {\n if (!(array && array.length)) {\n return [];\n }\n var result = unzip(array);\n if (iteratee == null) {\n return result;\n }\n return arrayMap(result, function(group) {\n return apply(iteratee, undefined, group);\n });\n }\n\n /**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\n var without = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, values)\n : [];\n });\n\n /**\n * Creates an array of unique values that is the\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the given arrays. The order of result values is determined by the order\n * they occur in the arrays.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.without\n * @example\n *\n * _.xor([2, 1], [2, 3]);\n * // => [1, 3]\n */\n var xor = baseRest(function(arrays) {\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which by which they're compared. The order of result values is determined\n * by the order they occur in the arrays. The iteratee is invoked with one\n * argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2, 3.4]\n *\n * // The `_.property` iteratee shorthand.\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var xorBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `comparator` which is\n * invoked to compare elements of `arrays`. The order of result values is\n * determined by the order they occur in the arrays. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.xorWith(objects, others, _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var xorWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n });\n\n /**\n * Creates an array of grouped elements, the first of which contains the\n * first elements of the given arrays, the second of which contains the\n * second elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n */\n var zip = baseRest(unzip);\n\n /**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject(['a', 'b'], [1, 2]);\n * // => { 'a': 1, 'b': 2 }\n */\n function zipObject(props, values) {\n return baseZipObject(props || [], values || [], assignValue);\n }\n\n /**\n * This method is like `_.zipObject` except that it supports property paths.\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n */\n function zipObjectDeep(props, values) {\n return baseZipObject(props || [], values || [], baseSet);\n }\n\n /**\n * This method is like `_.zip` except that it accepts `iteratee` to specify\n * how grouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * grouped values.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n * return a + b + c;\n * });\n * // => [111, 222]\n */\n var zipWith = baseRest(function(arrays) {\n var length = arrays.length,\n iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n return unzipWith(arrays, iteratee);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n * chain sequences enabled. The result of such sequences must be unwrapped\n * with `_#value`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Seq\n * @param {*} value The value to wrap.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'pebbles', 'age': 1 }\n * ];\n *\n * var youngest = _\n * .chain(users)\n * .sortBy('age')\n * .map(function(o) {\n * return o.user + ' is ' + o.age;\n * })\n * .head()\n * .value();\n * // => 'pebbles is 1'\n */\n function chain(value) {\n var result = lodash(value);\n result.__chain__ = true;\n return result;\n }\n\n /**\n * This method invokes `interceptor` and returns `value`. The interceptor\n * is invoked with one argument; (value). The purpose of this method is to\n * \"tap into\" a method chain sequence in order to modify intermediate results.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns `value`.\n * @example\n *\n * _([1, 2, 3])\n * .tap(function(array) {\n * // Mutate input array.\n * array.pop();\n * })\n * .reverse()\n * .value();\n * // => [2, 1]\n */\n function tap(value, interceptor) {\n interceptor(value);\n return value;\n }\n\n /**\n * This method is like `_.tap` except that it returns the result of `interceptor`.\n * The purpose of this method is to \"pass thru\" values replacing intermediate\n * results in a method chain sequence.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns the result of `interceptor`.\n * @example\n *\n * _(' abc ')\n * .chain()\n * .trim()\n * .thru(function(value) {\n * return [value];\n * })\n * .value();\n * // => ['abc']\n */\n function thru(value, interceptor) {\n return interceptor(value);\n }\n\n /**\n * This method is the wrapper version of `_.at`.\n *\n * @name at\n * @memberOf _\n * @since 1.0.0\n * @category Seq\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _(object).at(['a[0].b.c', 'a[1]']).value();\n * // => [3, 4]\n */\n var wrapperAt = flatRest(function(paths) {\n var length = paths.length,\n start = length ? paths[0] : 0,\n value = this.__wrapped__,\n interceptor = function(object) { return baseAt(object, paths); };\n\n if (length > 1 || this.__actions__.length ||\n !(value instanceof LazyWrapper) || !isIndex(start)) {\n return this.thru(interceptor);\n }\n value = value.slice(start, +start + (length ? 1 : 0));\n value.__actions__.push({\n 'func': thru,\n 'args': [interceptor],\n 'thisArg': undefined\n });\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\n if (length && !array.length) {\n array.push(undefined);\n }\n return array;\n });\n });\n\n /**\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n *\n * @name chain\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * // A sequence without explicit chaining.\n * _(users).head();\n * // => { 'user': 'barney', 'age': 36 }\n *\n * // A sequence with explicit chaining.\n * _(users)\n * .chain()\n * .head()\n * .pick('user')\n * .value();\n * // => { 'user': 'barney' }\n */\n function wrapperChain() {\n return chain(this);\n }\n\n /**\n * Executes the chain sequence and returns the wrapped result.\n *\n * @name commit\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).push(3);\n *\n * console.log(array);\n * // => [1, 2]\n *\n * wrapped = wrapped.commit();\n * console.log(array);\n * // => [1, 2, 3]\n *\n * wrapped.last();\n * // => 3\n *\n * console.log(array);\n * // => [1, 2, 3]\n */\n function wrapperCommit() {\n return new LodashWrapper(this.value(), this.__chain__);\n }\n\n /**\n * Gets the next value on a wrapped object following the\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n *\n * @name next\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the next iterator value.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 1 }\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 2 }\n *\n * wrapped.next();\n * // => { 'done': true, 'value': undefined }\n */\n function wrapperNext() {\n if (this.__values__ === undefined) {\n this.__values__ = toArray(this.value());\n }\n var done = this.__index__ >= this.__values__.length,\n value = done ? undefined : this.__values__[this.__index__++];\n\n return { 'done': done, 'value': value };\n }\n\n /**\n * Enables the wrapper to be iterable.\n *\n * @name Symbol.iterator\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the wrapper object.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped[Symbol.iterator]() === wrapped;\n * // => true\n *\n * Array.from(wrapped);\n * // => [1, 2]\n */\n function wrapperToIterator() {\n return this;\n }\n\n /**\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\n *\n * @name plant\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @param {*} value The value to plant.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2]).map(square);\n * var other = wrapped.plant([3, 4]);\n *\n * other.value();\n * // => [9, 16]\n *\n * wrapped.value();\n * // => [1, 4]\n */\n function wrapperPlant(value) {\n var result,\n parent = this;\n\n while (parent instanceof baseLodash) {\n var clone = wrapperClone(parent);\n clone.__index__ = 0;\n clone.__values__ = undefined;\n if (result) {\n previous.__wrapped__ = clone;\n } else {\n result = clone;\n }\n var previous = clone;\n parent = parent.__wrapped__;\n }\n previous.__wrapped__ = value;\n return result;\n }\n\n /**\n * This method is the wrapper version of `_.reverse`.\n *\n * **Note:** This method mutates the wrapped array.\n *\n * @name reverse\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _(array).reverse().value()\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function wrapperReverse() {\n var value = this.__wrapped__;\n if (value instanceof LazyWrapper) {\n var wrapped = value;\n if (this.__actions__.length) {\n wrapped = new LazyWrapper(this);\n }\n wrapped = wrapped.reverse();\n wrapped.__actions__.push({\n 'func': thru,\n 'args': [reverse],\n 'thisArg': undefined\n });\n return new LodashWrapper(wrapped, this.__chain__);\n }\n return this.thru(reverse);\n }\n\n /**\n * Executes the chain sequence to resolve the unwrapped value.\n *\n * @name value\n * @memberOf _\n * @since 0.1.0\n * @alias toJSON, valueOf\n * @category Seq\n * @returns {*} Returns the resolved unwrapped value.\n * @example\n *\n * _([1, 2, 3]).value();\n * // => [1, 2, 3]\n */\n function wrapperValue() {\n return baseWrapperValue(this.__wrapped__, this.__actions__);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the number of times the key was returned by `iteratee`. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': 1, '6': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.countBy(['one', 'two', 'three'], 'length');\n * // => { '3': 2, '5': 1 }\n */\n var countBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n ++result[key];\n } else {\n baseAssignValue(result, key, 1);\n }\n });\n\n /**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\n function every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n */\n function filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\n var find = createFind(findIndex);\n\n /**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=collection.length-1] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n * return n % 2 == 1;\n * });\n * // => 3\n */\n var findLast = createFind(findLastIndex);\n\n /**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDeep([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMapDeep(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), INFINITY);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDepth([1, 2], duplicate, 2);\n * // => [[1, 1], [2, 2]]\n */\n function flatMapDepth(collection, iteratee, depth) {\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(map(collection, iteratee), depth);\n }\n\n /**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forEach` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @alias eachRight\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEach\n * @example\n *\n * _.forEachRight([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `2` then `1`.\n */\n function forEachRight(collection, iteratee) {\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\n var groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n });\n\n /**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\n function includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n }\n\n /**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `path` is a function, it's invoked\n * for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke each method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invokeMap([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\n var invokeMap = baseRest(function(collection, path, args) {\n var index = -1,\n isFunc = typeof path == 'function',\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value) {\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n });\n return result;\n });\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the last element responsible for generating the key. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var array = [\n * { 'dir': 'left', 'code': 97 },\n * { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.keyBy(array, function(o) {\n * return String.fromCharCode(o.code);\n * });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.keyBy(array, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n */\n var keyBy = createAggregator(function(result, value, key) {\n baseAssignValue(result, key, value);\n });\n\n /**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\n function map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */\n function orderBy(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n if (!isArray(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n orders = guard ? undefined : orders;\n if (!isArray(orders)) {\n orders = orders == null ? [] : [orders];\n }\n return baseOrderBy(collection, iteratees, orders);\n }\n\n /**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [['fred'], ['barney', 'pebbles']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { 'age': 1, 'active': false });\n * // => objects for [['pebbles'], ['barney', 'fred']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, ['active', false]);\n * // => objects for [['barney', 'pebbles'], ['fred']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, 'active');\n * // => objects for [['fred'], ['barney', 'pebbles']]\n */\n var partition = createAggregator(function(result, value, key) {\n result[key ? 0 : 1].push(value);\n }, function() { return [[], []]; });\n\n /**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\n function reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n }\n\n /**\n * This method is like `_.reduce` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduce\n * @example\n *\n * var array = [[0, 1], [2, 3], [4, 5]];\n *\n * _.reduceRight(array, function(flattened, other) {\n * return flattened.concat(other);\n * }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */\n function reduceRight(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n }\n\n /**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\n function reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(getIteratee(predicate, 3)));\n }\n\n /**\n * Gets a random element from `collection`.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n */\n function sample(collection) {\n var func = isArray(collection) ? arraySample : baseSample;\n return func(collection);\n }\n\n /**\n * Gets `n` random elements at unique keys from `collection` up to the\n * size of `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @param {number} [n=1] The number of elements to sample.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the random elements.\n * @example\n *\n * _.sampleSize([1, 2, 3], 2);\n * // => [3, 1]\n *\n * _.sampleSize([1, 2, 3], 4);\n * // => [2, 3, 1]\n */\n function sampleSize(collection, n, guard) {\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n return func(collection, n);\n }\n\n /**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */\n function shuffle(collection) {\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\n return func(collection);\n }\n\n /**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */\n function size(collection) {\n if (collection == null) {\n return 0;\n }\n if (isArrayLike(collection)) {\n return isString(collection) ? stringSize(collection) : collection.length;\n }\n var tag = getTag(collection);\n if (tag == mapTag || tag == setTag) {\n return collection.size;\n }\n return baseKeys(collection).length;\n }\n\n /**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\n function some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n */\n var sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\n var now = ctxNow || function() {\n return root.Date.now();\n };\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The opposite of `_.before`; this method creates a function that invokes\n * `func` once it's called `n` or more times.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {number} n The number of calls before `func` is invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = ['profile', 'settings'];\n *\n * var done = _.after(saves.length, function() {\n * console.log('done saving!');\n * });\n *\n * _.forEach(saves, function(type) {\n * asyncSave({ 'type': type, 'complete': done });\n * });\n * // => Logs 'done saving!' after the two async saves have completed.\n */\n function after(n, func) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n < 1) {\n return func.apply(this, arguments);\n }\n };\n }\n\n /**\n * Creates a function that invokes `func`, with up to `n` arguments,\n * ignoring any additional arguments.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @param {number} [n=func.length] The arity cap.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n * // => [6, 8, 10]\n */\n function ary(func, n, guard) {\n n = guard ? undefined : n;\n n = (func && n == null) ? func.length : n;\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n }\n\n /**\n * Creates a function that invokes `func`, with the `this` binding and arguments\n * of the created function, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {number} n The number of calls at which `func` is no longer invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * jQuery(element).on('click', _.before(5, addContactToList));\n * // => Allows adding up to 4 contacts to the list.\n */\n function before(n, func) {\n var result;\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n > 0) {\n result = func.apply(this, arguments);\n }\n if (n <= 1) {\n func = undefined;\n }\n return result;\n };\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and `partials` prepended to the arguments it receives.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * function greet(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */\n var bind = baseRest(function(func, thisArg, partials) {\n var bitmask = WRAP_BIND_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bind));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(func, bitmask, thisArg, partials, holders);\n });\n\n /**\n * Creates a function that invokes the method at `object[key]` with `partials`\n * prepended to the arguments it receives.\n *\n * This method differs from `_.bind` by allowing bound functions to reference\n * methods that may be redefined or don't yet exist. See\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n * for more details.\n *\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Function\n * @param {Object} object The object to invoke the method on.\n * @param {string} key The key of the method.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n * 'user': 'fred',\n * 'greet': function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n * };\n *\n * var bound = _.bindKey(object, 'greet', 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * object.greet = function(greeting, punctuation) {\n * return greeting + 'ya ' + this.user + punctuation;\n * };\n *\n * bound('!');\n * // => 'hiya fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bindKey(object, 'greet', _, '!');\n * bound('hi');\n * // => 'hiya fred!'\n */\n var bindKey = baseRest(function(object, key, partials) {\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bindKey));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(key, bitmask, object, partials, holders);\n });\n\n /**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\n function curry(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curry.placeholder;\n return result;\n }\n\n /**\n * This method is like `_.curry` except that arguments are applied to `func`\n * in the manner of `_.partialRight` instead of `_.partial`.\n *\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curryRight(abc);\n *\n * curried(3)(2)(1);\n * // => [1, 2, 3]\n *\n * curried(2, 3)(1);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(3)(1, _)(2);\n * // => [1, 2, 3]\n */\n function curryRight(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curryRight.placeholder;\n return result;\n }\n\n /**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\n function debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n }\n\n /**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, 'deferred');\n * // => Logs 'deferred' after one millisecond.\n */\n var defer = baseRest(function(func, args) {\n return baseDelay(func, 1, args);\n });\n\n /**\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\n * provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) {\n * console.log(text);\n * }, 1000, 'later');\n * // => Logs 'later' after one second.\n */\n var delay = baseRest(function(func, wait, args) {\n return baseDelay(func, toNumber(wait) || 0, args);\n });\n\n /**\n * Creates a function that invokes `func` with arguments reversed.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to flip arguments for.\n * @returns {Function} Returns the new flipped function.\n * @example\n *\n * var flipped = _.flip(function() {\n * return _.toArray(arguments);\n * });\n *\n * flipped('a', 'b', 'c', 'd');\n * // => ['d', 'c', 'b', 'a']\n */\n function flip(func) {\n return createWrap(func, WRAP_FLIP_FLAG);\n }\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\n function memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n }\n\n // Expose `MapCache`.\n memoize.Cache = MapCache;\n\n /**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\n function negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n }\n\n /**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first invocation. The `func` is\n * invoked with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // => `createApplication` is invoked once\n */\n function once(func) {\n return before(2, func);\n }\n\n /**\n * Creates a function that invokes `func` with its arguments transformed.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Function\n * @param {Function} func The function to wrap.\n * @param {...(Function|Function[])} [transforms=[_.identity]]\n * The argument transforms.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function doubled(n) {\n * return n * 2;\n * }\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var func = _.overArgs(function(x, y) {\n * return [x, y];\n * }, [square, doubled]);\n *\n * func(9, 3);\n * // => [81, 6]\n *\n * func(10, 5);\n * // => [100, 10]\n */\n var overArgs = castRest(function(func, transforms) {\n transforms = (transforms.length == 1 && isArray(transforms[0]))\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n var funcsLength = transforms.length;\n return baseRest(function(args) {\n var index = -1,\n length = nativeMin(args.length, funcsLength);\n\n while (++index < length) {\n args[index] = transforms[index].call(this, args[index]);\n }\n return apply(func, this, args);\n });\n });\n\n /**\n * Creates a function that invokes `func` with `partials` prepended to the\n * arguments it receives. This method is like `_.bind` except it does **not**\n * alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 0.2.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var sayHelloTo = _.partial(greet, 'hello');\n * sayHelloTo('fred');\n * // => 'hello fred'\n *\n * // Partially applied with placeholders.\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */\n var partial = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partial));\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n });\n\n /**\n * This method is like `_.partial` except that partially applied arguments\n * are appended to the arguments it receives.\n *\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var greetFred = _.partialRight(greet, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n *\n * // Partially applied with placeholders.\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\n * sayHelloTo('fred');\n * // => 'hello fred'\n */\n var partialRight = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partialRight));\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n });\n\n /**\n * Creates a function that invokes `func` with arguments arranged according\n * to the specified `indexes` where the argument value at the first index is\n * provided as the first argument, the argument value at the second index is\n * provided as the second argument, and so on.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to rearrange arguments for.\n * @param {...(number|number[])} indexes The arranged argument indexes.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var rearged = _.rearg(function(a, b, c) {\n * return [a, b, c];\n * }, [2, 0, 1]);\n *\n * rearged('b', 'c', 'a')\n * // => ['a', 'b', 'c']\n */\n var rearg = flatRest(function(func, indexes) {\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n });\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as\n * an array.\n *\n * **Note:** This method is based on the\n * [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\n function rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start === undefined ? start : toInteger(start);\n return baseRest(func, start);\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * create function and an array of arguments much like\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n *\n * **Note:** This method is based on the\n * [spread operator](https://mdn.io/spread_operator).\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Function\n * @param {Function} func The function to spread arguments over.\n * @param {number} [start=0] The start position of the spread.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.spread(function(who, what) {\n * return who + ' says ' + what;\n * });\n *\n * say(['fred', 'hello']);\n * // => 'fred says hello'\n *\n * var numbers = Promise.all([\n * Promise.resolve(40),\n * Promise.resolve(36)\n * ]);\n *\n * numbers.then(_.spread(function(x, y) {\n * return x + y;\n * }));\n * // => a Promise of 76\n */\n function spread(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\n return baseRest(function(args) {\n var array = args[start],\n otherArgs = castSlice(args, 0, start);\n\n if (array) {\n arrayPush(otherArgs, array);\n }\n return apply(func, this, otherArgs);\n });\n }\n\n /**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\n function throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n }\n\n /**\n * Creates a function that accepts up to one argument, ignoring any\n * additional arguments.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.unary(parseInt));\n * // => [6, 8, 10]\n */\n function unary(func) {\n return ary(func, 1);\n }\n\n /**\n * Creates a function that provides `value` to `wrapper` as its first\n * argument. Any additional arguments provided to the function are appended\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n * binding of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {*} value The value to wrap.\n * @param {Function} [wrapper=identity] The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n * return '

' + func(text) + '

';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => '

fred, barney, & pebbles

'\n */\n function wrap(value, wrapper) {\n return partial(castFunction(wrapper), value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Casts `value` as an array if it's not one.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Lang\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast array.\n * @example\n *\n * _.castArray(1);\n * // => [1]\n *\n * _.castArray({ 'a': 1 });\n * // => [{ 'a': 1 }]\n *\n * _.castArray('abc');\n * // => ['abc']\n *\n * _.castArray(null);\n * // => [null]\n *\n * _.castArray(undefined);\n * // => [undefined]\n *\n * _.castArray();\n * // => []\n *\n * var array = [1, 2, 3];\n * console.log(_.castArray(array) === array);\n * // => true\n */\n function castArray() {\n if (!arguments.length) {\n return [];\n }\n var value = arguments[0];\n return isArray(value) ? value : [value];\n }\n\n /**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\n function clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.clone` except that it accepts `customizer` which\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n * cloning is handled by the method instead. The `customizer` is invoked with\n * up to four arguments; (value [, index|key, object, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeepWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * }\n *\n * var el = _.cloneWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 0\n */\n function cloneWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\n function cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.cloneWith` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the deep cloned value.\n * @see _.cloneWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(true);\n * }\n * }\n *\n * var el = _.cloneDeepWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 20\n */\n function cloneDeepWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * Checks if `object` conforms to `source` by invoking the predicate\n * properties of `source` with the corresponding property values of `object`.\n *\n * **Note:** This method is equivalent to `_.conforms` when `source` is\n * partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n * // => true\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n * // => false\n */\n function conformsTo(object, source) {\n return source == null || baseConformsTo(object, source, keys(source));\n }\n\n /**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\n function eq(value, other) {\n return value === other || (value !== value && other !== other);\n }\n\n /**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n * @see _.lt\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */\n var gt = createRelationalOperation(baseGt);\n\n /**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\n * `other`, else `false`.\n * @see _.lte\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */\n var gte = createRelationalOperation(function(value, other) {\n return value >= other;\n });\n\n /**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n };\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\n var isArray = Array.isArray;\n\n /**\n * Checks if `value` is classified as an `ArrayBuffer` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n * @example\n *\n * _.isArrayBuffer(new ArrayBuffer(2));\n * // => true\n *\n * _.isArrayBuffer(new Array(2));\n * // => false\n */\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n /**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n function isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n }\n\n /**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\n function isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n }\n\n /**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\n function isBoolean(value) {\n return value === true || value === false ||\n (isObjectLike(value) && baseGetTag(value) == boolTag);\n }\n\n /**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\n var isBuffer = nativeIsBuffer || stubFalse;\n\n /**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n /**\n * Checks if `value` is likely a DOM element.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('');\n * // => false\n */\n function isElement(value) {\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n }\n\n /**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\n function isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\n function isEqual(value, other) {\n return baseIsEqual(value, other);\n }\n\n /**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */\n function isEqualWith(value, other, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n }\n\n /**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\n function isError(value) {\n if (!isObjectLike(value)) {\n return false;\n }\n var tag = baseGetTag(value);\n return tag == errorTag || tag == domExcTag ||\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n }\n\n /**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */\n function isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n }\n\n /**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */\n function isInteger(value) {\n return typeof value == 'number' && value == toInteger(value);\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\n function isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n }\n\n /**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n function isObjectLike(value) {\n return value != null && typeof value == 'object';\n }\n\n /**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n /**\n * Performs a partial deep comparison between `object` and `source` to\n * determine if `object` contains equivalent property values.\n *\n * **Note:** This method is equivalent to `_.matches` when `source` is\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.isMatch(object, { 'b': 2 });\n * // => true\n *\n * _.isMatch(object, { 'b': 1 });\n * // => false\n */\n function isMatch(object, source) {\n return object === source || baseIsMatch(object, source, getMatchData(source));\n }\n\n /**\n * This method is like `_.isMatch` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with five\n * arguments: (objValue, srcValue, index|key, object, source).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, srcValue) {\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\n * return true;\n * }\n * }\n *\n * var object = { 'greeting': 'hello' };\n * var source = { 'greeting': 'hi' };\n *\n * _.isMatchWith(object, source, customizer);\n * // => true\n */\n function isMatchWith(object, source, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseIsMatch(object, source, getMatchData(source), customizer);\n }\n\n /**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is based on\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n * `undefined` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\n function isNaN(value) {\n // An `NaN` primitive is the only value that is not equal to itself.\n // Perform the `toStringTag` check first to avoid errors with some\n // ActiveX objects in IE.\n return isNumber(value) && value != +value;\n }\n\n /**\n * Checks if `value` is a pristine native function.\n *\n * **Note:** This method can't reliably detect native functions in the presence\n * of the core-js package because core-js circumvents this kind of detection.\n * Despite multiple requests, the core-js maintainer has made it clear: any\n * attempt to fix the detection will be obstructed. As a result, we're left\n * with little choice but to throw an error. Unfortunately, this also affects\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n * which rely on core-js.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\n function isNative(value) {\n if (isMaskable(value)) {\n throw new Error(CORE_ERROR_TEXT);\n }\n return baseIsNative(value);\n }\n\n /**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */\n function isNull(value) {\n return value === null;\n }\n\n /**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\n function isNil(value) {\n return value == null;\n }\n\n /**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\n function isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n }\n\n /**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\n function isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n }\n\n /**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n /**\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n * double precision number which isn't the result of a rounded unsafe integer.\n *\n * **Note:** This method is based on\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n * @example\n *\n * _.isSafeInteger(3);\n * // => true\n *\n * _.isSafeInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isSafeInteger(Infinity);\n * // => false\n *\n * _.isSafeInteger('3');\n * // => false\n */\n function isSafeInteger(value) {\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n /**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\n function isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n }\n\n /**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\n function isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n }\n\n /**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n /**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\n function isUndefined(value) {\n return value === undefined;\n }\n\n /**\n * Checks if `value` is classified as a `WeakMap` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n * @example\n *\n * _.isWeakMap(new WeakMap);\n * // => true\n *\n * _.isWeakMap(new Map);\n * // => false\n */\n function isWeakMap(value) {\n return isObjectLike(value) && getTag(value) == weakMapTag;\n }\n\n /**\n * Checks if `value` is classified as a `WeakSet` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n * @example\n *\n * _.isWeakSet(new WeakSet);\n * // => true\n *\n * _.isWeakSet(new Set);\n * // => false\n */\n function isWeakSet(value) {\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n }\n\n /**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n * @see _.gt\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */\n var lt = createRelationalOperation(baseLt);\n\n /**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to\n * `other`, else `false`.\n * @see _.gte\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */\n var lte = createRelationalOperation(function(value, other) {\n return value <= other;\n });\n\n /**\n * Converts `value` to an array.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * _.toArray({ 'a': 1, 'b': 2 });\n * // => [1, 2]\n *\n * _.toArray('abc');\n * // => ['a', 'b', 'c']\n *\n * _.toArray(1);\n * // => []\n *\n * _.toArray(null);\n * // => []\n */\n function toArray(value) {\n if (!value) {\n return [];\n }\n if (isArrayLike(value)) {\n return isString(value) ? stringToArray(value) : copyArray(value);\n }\n if (symIterator && value[symIterator]) {\n return iteratorToArray(value[symIterator]());\n }\n var tag = getTag(value),\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n return func(value);\n }\n\n /**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\n function toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n }\n\n /**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\n function toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n }\n\n /**\n * Converts `value` to an integer suitable for use as the length of an\n * array-like object.\n *\n * **Note:** This method is based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toLength(3.2);\n * // => 3\n *\n * _.toLength(Number.MIN_VALUE);\n * // => 0\n *\n * _.toLength(Infinity);\n * // => 4294967295\n *\n * _.toLength('3.2');\n * // => 3\n */\n function toLength(value) {\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n }\n\n /**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\n function toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n }\n\n /**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\n function toPlainObject(value) {\n return copyObject(value, keysIn(value));\n }\n\n /**\n * Converts `value` to a safe integer. A safe integer can be compared and\n * represented correctly.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toSafeInteger(3.2);\n * // => 3\n *\n * _.toSafeInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toSafeInteger(Infinity);\n * // => 9007199254740991\n *\n * _.toSafeInteger('3.2');\n * // => 3\n */\n function toSafeInteger(value) {\n return value\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n : (value === 0 ? value : 0);\n }\n\n /**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\n function toString(value) {\n return value == null ? '' : baseToString(value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\n var assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n });\n\n /**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n */\n var assignIn = createAssigner(function(object, source) {\n copyObject(source, keysIn(source), object);\n });\n\n /**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n });\n\n /**\n * This method is like `_.assign` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignInWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keys(source), object, customizer);\n });\n\n /**\n * Creates an array of values corresponding to `paths` of `object`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Array} Returns the picked values.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _.at(object, ['a[0].b.c', 'a[1]']);\n * // => [3, 4]\n */\n var at = flatRest(baseAt);\n\n /**\n * Creates an object that inherits from the `prototype` object. If a\n * `properties` object is given, its own enumerable string keyed properties\n * are assigned to the created object.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n * 'constructor': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */\n function create(prototype, properties) {\n var result = baseCreate(prototype);\n return properties == null ? result : baseAssign(result, properties);\n }\n\n /**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var defaults = baseRest(function(args) {\n args.push(undefined, customDefaultsAssignIn);\n return apply(assignInWith, undefined, args);\n });\n\n /**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaults\n * @example\n *\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n * // => { 'a': { 'b': 2, 'c': 3 } }\n */\n var defaultsDeep = baseRest(function(args) {\n args.push(undefined, customDefaultsMerge);\n return apply(mergeWith, undefined, args);\n });\n\n /**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findKey(users, function(o) { return o.age < 40; });\n * // => 'barney' (iteration order is not guaranteed)\n *\n * // The `_.matches` iteratee shorthand.\n * _.findKey(users, { 'age': 1, 'active': true });\n * // => 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findKey(users, 'active');\n * // => 'barney'\n */\n function findKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n }\n\n /**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findLastKey(users, function(o) { return o.age < 40; });\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastKey(users, { 'age': 36, 'active': true });\n * // => 'barney'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastKey(users, 'active');\n * // => 'pebbles'\n */\n function findLastKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n }\n\n /**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */\n function forIn(object, iteratee) {\n return object == null\n ? object\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n */\n function forInRight(object, iteratee) {\n return object == null\n ? object\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forOwn(object, iteratee) {\n return object && baseForOwn(object, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n */\n function forOwnRight(object, iteratee) {\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an array of function property names from own enumerable properties\n * of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functionsIn\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functions(new Foo);\n * // => ['a', 'b']\n */\n function functions(object) {\n return object == null ? [] : baseFunctions(object, keys(object));\n }\n\n /**\n * Creates an array of function property names from own and inherited\n * enumerable properties of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functions\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functionsIn(new Foo);\n * // => ['a', 'b', 'c']\n */\n function functionsIn(object) {\n return object == null ? [] : baseFunctions(object, keysIn(object));\n }\n\n /**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n }\n\n /**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\n function has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n }\n\n /**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\n function hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n }\n\n /**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n */\n var invert = createInverter(function(result, value, key) {\n result[value] = key;\n }, constant(identity));\n\n /**\n * This method is like `_.invert` except that the inverted object is generated\n * from the results of running each element of `object` thru `iteratee`. The\n * corresponding inverted value of each inverted key is an array of keys\n * responsible for generating the inverted value. The iteratee is invoked\n * with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Object\n * @param {Object} object The object to invert.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invertBy(object);\n * // => { '1': ['a', 'c'], '2': ['b'] }\n *\n * _.invertBy(object, function(value) {\n * return 'group' + value;\n * });\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n */\n var invertBy = createInverter(function(result, value, key) {\n if (hasOwnProperty.call(result, value)) {\n result[value].push(key);\n } else {\n result[value] = [key];\n }\n }, getIteratee);\n\n /**\n * Invokes the method at `path` of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n *\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n * // => [2, 3]\n */\n var invoke = baseRest(baseInvoke);\n\n /**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\n function keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n }\n\n /**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\n function keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n }\n\n /**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n * with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapValues\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */\n function mapKeys(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, iteratee(value, key, object), value);\n });\n return result;\n }\n\n /**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\n function mapValues(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n }\n\n /**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\n var merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n });\n\n /**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n * if (_.isArray(objValue)) {\n * return objValue.concat(srcValue);\n * }\n * }\n *\n * var object = { 'a': [1], 'b': [2] };\n * var other = { 'a': [3], 'b': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { 'a': [1, 3], 'b': [2, 4] }\n */\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n baseMerge(object, source, srcIndex, customizer);\n });\n\n /**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */\n var omit = flatRest(function(object, paths) {\n var result = {};\n if (object == null) {\n return result;\n }\n var isDeep = false;\n paths = arrayMap(paths, function(path) {\n path = castPath(path, object);\n isDeep || (isDeep = path.length > 1);\n return path;\n });\n copyObject(object, getAllKeysIn(object), result);\n if (isDeep) {\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n }\n var length = paths.length;\n while (length--) {\n baseUnset(result, paths[length]);\n }\n return result;\n });\n\n /**\n * The opposite of `_.pickBy`; this method creates an object composed of\n * the own and inherited enumerable string keyed properties of `object` that\n * `predicate` doesn't return truthy for. The predicate is invoked with two\n * arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omitBy(object, _.isNumber);\n * // => { 'b': '2' }\n */\n function omitBy(object, predicate) {\n return pickBy(object, negate(getIteratee(predicate)));\n }\n\n /**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\n var pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n });\n\n /**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */\n function pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\n var props = arrayMap(getAllKeysIn(object), function(prop) {\n return [prop];\n });\n predicate = getIteratee(predicate);\n return basePickBy(object, props, function(value, path) {\n return predicate(value, path[0]);\n });\n }\n\n /**\n * This method is like `_.get` except that if the resolved value is a\n * function it's invoked with the `this` binding of its parent object and\n * its result is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n *\n * _.result(object, 'a[0].b.c1');\n * // => 3\n *\n * _.result(object, 'a[0].b.c2');\n * // => 4\n *\n * _.result(object, 'a[0].b.c3', 'default');\n * // => 'default'\n *\n * _.result(object, 'a[0].b.c3', _.constant('default'));\n * // => 'default'\n */\n function result(object, path, defaultValue) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length;\n\n // Ensure the loop is entered when path is empty.\n if (!length) {\n length = 1;\n object = undefined;\n }\n while (++index < length) {\n var value = object == null ? undefined : object[toKey(path[index])];\n if (value === undefined) {\n index = length;\n value = defaultValue;\n }\n object = isFunction(value) ? value.call(object) : value;\n }\n return object;\n }\n\n /**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\n function set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n }\n\n /**\n * This method is like `_.set` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.setWith(object, '[0][1]', 'a', Object);\n * // => { '0': { '1': 'a' } }\n */\n function setWith(object, path, value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseSet(object, path, value, customizer);\n }\n\n /**\n * Creates an array of own enumerable string keyed-value pairs for `object`\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n * entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entries\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairs(new Foo);\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n */\n var toPairs = createToPairs(keys);\n\n /**\n * Creates an array of own and inherited enumerable string keyed-value pairs\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n * or set, its entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entriesIn\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairsIn(new Foo);\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n */\n var toPairsIn = createToPairs(keysIn);\n\n /**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\n function transform(object, iteratee, accumulator) {\n var isArr = isArray(object),\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n iteratee = getIteratee(iteratee, 4);\n if (accumulator == null) {\n var Ctor = object && object.constructor;\n if (isArrLike) {\n accumulator = isArr ? new Ctor : [];\n }\n else if (isObject(object)) {\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n }\n else {\n accumulator = {};\n }\n }\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n return iteratee(accumulator, value, index, object);\n });\n return accumulator;\n }\n\n /**\n * Removes the property at `path` of `object`.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n * _.unset(object, 'a[0].b.c');\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n *\n * _.unset(object, ['a', '0', 'b', 'c']);\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n */\n function unset(object, path) {\n return object == null ? true : baseUnset(object, path);\n }\n\n /**\n * This method is like `_.set` except that accepts `updater` to produce the\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n * is invoked with one argument: (value).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n * console.log(object.a[0].b.c);\n * // => 9\n *\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n * console.log(object.x[0].y.z);\n * // => 0\n */\n function update(object, path, updater) {\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\n }\n\n /**\n * This method is like `_.update` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n * // => { '0': { '1': 'a' } }\n */\n function updateWith(object, path, updater, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n }\n\n /**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\n function values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n }\n\n /**\n * Creates an array of the own and inherited enumerable string keyed property\n * values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */\n function valuesIn(object) {\n return object == null ? [] : baseValues(object, keysIn(object));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */\n function clamp(number, lower, upper) {\n if (upper === undefined) {\n upper = lower;\n lower = undefined;\n }\n if (upper !== undefined) {\n upper = toNumber(upper);\n upper = upper === upper ? upper : 0;\n }\n if (lower !== undefined) {\n lower = toNumber(lower);\n lower = lower === lower ? lower : 0;\n }\n return baseClamp(toNumber(number), lower, upper);\n }\n\n /**\n * Checks if `n` is between `start` and up to, but not including, `end`. If\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\n * If `start` is greater than `end` the params are swapped to support\n * negative ranges.\n *\n * @static\n * @memberOf _\n * @since 3.3.0\n * @category Number\n * @param {number} number The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n * @see _.range, _.rangeRight\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n *\n * _.inRange(-3, -2, -6);\n * // => true\n */\n function inRange(number, start, end) {\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n number = toNumber(number);\n return baseInRange(number, start, end);\n }\n\n /**\n * Produces a random number between the inclusive `lower` and `upper` bounds.\n * If only one argument is provided a number between `0` and the given number\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\n * floats, a floating-point number is returned instead of an integer.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Number\n * @param {number} [lower=0] The lower bound.\n * @param {number} [upper=1] The upper bound.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\n function random(lower, upper, floating) {\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n upper = floating = undefined;\n }\n if (floating === undefined) {\n if (typeof upper == 'boolean') {\n floating = upper;\n upper = undefined;\n }\n else if (typeof lower == 'boolean') {\n floating = lower;\n lower = undefined;\n }\n }\n if (lower === undefined && upper === undefined) {\n lower = 0;\n upper = 1;\n }\n else {\n lower = toFinite(lower);\n if (upper === undefined) {\n upper = lower;\n lower = 0;\n } else {\n upper = toFinite(upper);\n }\n }\n if (lower > upper) {\n var temp = lower;\n lower = upper;\n upper = temp;\n }\n if (floating || lower % 1 || upper % 1) {\n var rand = nativeRandom();\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n }\n return baseRandom(lower, upper);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\n var camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n });\n\n /**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\n function capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n }\n\n /**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('déjà vu');\n * // => 'deja vu'\n */\n function deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n }\n\n /**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search up to.\n * @returns {boolean} Returns `true` if `string` ends with `target`,\n * else `false`.\n * @example\n *\n * _.endsWith('abc', 'c');\n * // => true\n *\n * _.endsWith('abc', 'b');\n * // => false\n *\n * _.endsWith('abc', 'b', 2);\n * // => true\n */\n function endsWith(string, target, position) {\n string = toString(string);\n target = baseToString(target);\n\n var length = string.length;\n position = position === undefined\n ? length\n : baseClamp(toInteger(position), 0, length);\n\n var end = position;\n position -= target.length;\n return position >= 0 && string.slice(position, end) == target;\n }\n\n /**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */\n function escape(string) {\n string = toString(string);\n return (string && reHasUnescapedHtml.test(string))\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\n : string;\n }\n\n /**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\n function escapeRegExp(string) {\n string = toString(string);\n return (string && reHasRegExpChar.test(string))\n ? string.replace(reRegExpChar, '\\\\$&')\n : string;\n }\n\n /**\n * Converts `string` to\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase('Foo Bar');\n * // => 'foo-bar'\n *\n * _.kebabCase('fooBar');\n * // => 'foo-bar'\n *\n * _.kebabCase('__FOO_BAR__');\n * // => 'foo-bar'\n */\n var kebabCase = createCompounder(function(result, word, index) {\n return result + (index ? '-' : '') + word.toLowerCase();\n });\n\n /**\n * Converts `string`, as space separated words, to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.lowerCase('--Foo-Bar--');\n * // => 'foo bar'\n *\n * _.lowerCase('fooBar');\n * // => 'foo bar'\n *\n * _.lowerCase('__FOO_BAR__');\n * // => 'foo bar'\n */\n var lowerCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + word.toLowerCase();\n });\n\n /**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst('Fred');\n * // => 'fred'\n *\n * _.lowerFirst('FRED');\n * // => 'fRED'\n */\n var lowerFirst = createCaseFirst('toLowerCase');\n\n /**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => ' abc '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */\n function pad(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n if (!length || strLength >= length) {\n return string;\n }\n var mid = (length - strLength) / 2;\n return (\n createPadding(nativeFloor(mid), chars) +\n string +\n createPadding(nativeCeil(mid), chars)\n );\n }\n\n /**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd('abc', 6);\n * // => 'abc '\n *\n * _.padEnd('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padEnd('abc', 3);\n * // => 'abc'\n */\n function padEnd(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (string + createPadding(length - strLength, chars))\n : string;\n }\n\n /**\n * Pads `string` on the left side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padStart('abc', 6);\n * // => ' abc'\n *\n * _.padStart('abc', 6, '_-');\n * // => '_-_abc'\n *\n * _.padStart('abc', 3);\n * // => 'abc'\n */\n function padStart(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (createPadding(length - strLength, chars) + string)\n : string;\n }\n\n /**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n * hexadecimal, in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix=10] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */\n function parseInt(string, radix, guard) {\n if (guard || radix == null) {\n radix = 0;\n } else if (radix) {\n radix = +radix;\n }\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n }\n\n /**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=1] The number of times to repeat the string.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */\n function repeat(string, n, guard) {\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n return baseRepeat(toString(string), n);\n }\n\n /**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace('Hi Fred', 'Fred', 'Barney');\n * // => 'Hi Barney'\n */\n function replace() {\n var args = arguments,\n string = toString(args[0]);\n\n return args.length < 3 ? string : string.replace(args[1], args[2]);\n }\n\n /**\n * Converts `string` to\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase('Foo Bar');\n * // => 'foo_bar'\n *\n * _.snakeCase('fooBar');\n * // => 'foo_bar'\n *\n * _.snakeCase('--FOO-BAR--');\n * // => 'foo_bar'\n */\n var snakeCase = createCompounder(function(result, word, index) {\n return result + (index ? '_' : '') + word.toLowerCase();\n });\n\n /**\n * Splits `string` by `separator`.\n *\n * **Note:** This method is based on\n * [`String#split`](https://mdn.io/String/split).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to split.\n * @param {RegExp|string} separator The separator pattern to split by.\n * @param {number} [limit] The length to truncate results to.\n * @returns {Array} Returns the string segments.\n * @example\n *\n * _.split('a-b-c', '-', 2);\n * // => ['a', 'b']\n */\n function split(string, separator, limit) {\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n separator = limit = undefined;\n }\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n if (!limit) {\n return [];\n }\n string = toString(string);\n if (string && (\n typeof separator == 'string' ||\n (separator != null && !isRegExp(separator))\n )) {\n separator = baseToString(separator);\n if (!separator && hasUnicode(string)) {\n return castSlice(stringToArray(string), 0, limit);\n }\n }\n return string.split(separator, limit);\n }\n\n /**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar--');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__FOO_BAR__');\n * // => 'FOO BAR'\n */\n var startCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + upperFirst(word);\n });\n\n /**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`,\n * else `false`.\n * @example\n *\n * _.startsWith('abc', 'a');\n * // => true\n *\n * _.startsWith('abc', 'b');\n * // => false\n *\n * _.startsWith('abc', 'b', 1);\n * // => true\n */\n function startsWith(string, target, position) {\n string = toString(string);\n position = position == null\n ? 0\n : baseClamp(toInteger(position), 0, string.length);\n\n target = baseToString(target);\n return string.slice(position, position + target.length) == target;\n }\n\n /**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n * The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n * The \"evaluate\" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n * An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n * The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\n * The sourceURL of the compiled template.\n * @param {string} [options.variable='obj']\n * The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the \"interpolate\" delimiter to create a compiled template.\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // Use the HTML \"escape\" delimiter to escape data property values.\n * var compiled = _.template('<%- value %>');\n * compiled({ 'value': '\\r\\n\\r\\n\\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 78 */\n/***/ function(module, exports) {\n\n\t/*\r\n\t\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\t\tAuthor Tobias Koppers @sokra\r\n\t*/\r\n\t// css base code, injected by the css-loader\r\n\tmodule.exports = function() {\r\n\t\tvar list = [];\r\n\t\r\n\t\t// return the list of modules as css string\r\n\t\tlist.toString = function toString() {\r\n\t\t\tvar result = [];\r\n\t\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\t\tvar item = this[i];\r\n\t\t\t\tif(item[2]) {\r\n\t\t\t\t\tresult.push(\"@media \" + item[2] + \"{\" + item[1] + \"}\");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult.push(item[1]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn result.join(\"\");\r\n\t\t};\r\n\t\r\n\t\t// import a list of modules into the list\r\n\t\tlist.i = function(modules, mediaQuery) {\r\n\t\t\tif(typeof modules === \"string\")\r\n\t\t\t\tmodules = [[null, modules, \"\"]];\r\n\t\t\tvar alreadyImportedModules = {};\r\n\t\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\t\tvar id = this[i][0];\r\n\t\t\t\tif(typeof id === \"number\")\r\n\t\t\t\t\talreadyImportedModules[id] = true;\r\n\t\t\t}\r\n\t\t\tfor(i = 0; i < modules.length; i++) {\r\n\t\t\t\tvar item = modules[i];\r\n\t\t\t\t// skip already imported module\r\n\t\t\t\t// this implementation is not 100% perfect for weird media query combinations\r\n\t\t\t\t// when a module is imported multiple times with different media queries.\r\n\t\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\r\n\t\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\r\n\t\t\t\t\tif(mediaQuery && !item[2]) {\r\n\t\t\t\t\t\titem[2] = mediaQuery;\r\n\t\t\t\t\t} else if(mediaQuery) {\r\n\t\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlist.push(item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\treturn list;\r\n\t};\r\n\n\n/***/ },\n/* 79 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*\n\t\tMIT License http://www.opensource.org/licenses/mit-license.php\n\t\tAuthor Tobias Koppers @sokra\n\t*/\n\tvar stylesInDom = {},\n\t\tmemoize = function(fn) {\n\t\t\tvar memo;\n\t\t\treturn function () {\n\t\t\t\tif (typeof memo === \"undefined\") memo = fn.apply(this, arguments);\n\t\t\t\treturn memo;\n\t\t\t};\n\t\t},\n\t\tisOldIE = memoize(function() {\n\t\t\treturn /msie [6-9]\\b/.test(window.navigator.userAgent.toLowerCase());\n\t\t}),\n\t\tgetHeadElement = memoize(function () {\n\t\t\treturn document.head || document.getElementsByTagName(\"head\")[0];\n\t\t}),\n\t\tsingletonElement = null,\n\t\tsingletonCounter = 0,\n\t\tstyleElementsInsertedAtTop = [];\n\t\n\tmodule.exports = function(list, options) {\n\t\tif(false) {\n\t\t\tif(typeof document !== \"object\") throw new Error(\"The style-loader cannot be used in a non-browser environment\");\n\t\t}\n\t\n\t\toptions = options || {};\n\t\t// Force single-tag solution on IE6-9, which has a hard limit on the # of \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 85 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t header: { type: String },\n\t placement: { type: String, default: 'right' },\n\t show: { type: Boolean, required: true },\n\t width: { type: Number, default: 320 }\n\t },\n\t watch: {\n\t show: function show(val, old) {\n\t var _this = this;\n\t\n\t this.$emit('input', val);\n\t this.$emit(this.show ? 'open' : 'close');\n\t var body = document.body;\n\t var scrollBarWidth = (0, _utils.getScrollBarWidth)();\n\t if (val) {\n\t if (!this._backdrop) {\n\t this._backdrop = document.createElement('div');\n\t }\n\t this._backdrop.className = 'aside-backdrop';\n\t body.appendChild(this._backdrop);\n\t body.classList.add('modal-open');\n\t if (scrollBarWidth !== 0) {\n\t body.style.paddingRight = scrollBarWidth + 'px';\n\t }\n\t // request property that requires layout to force a layout\n\t var x = this._backdrop.clientHeight;\n\t this._backdrop.classList.add('in');\n\t (0, _NodeList2.default)(this._backdrop).on('click', function () {\n\t return _this.trigger_close();\n\t });\n\t } else {\n\t (0, _NodeList2.default)(this._backdrop).on('transitionend', function () {\n\t (0, _NodeList2.default)(_this._backdrop).off();\n\t try {\n\t body.classList.remove('modal-open');\n\t body.style.paddingRight = '0';\n\t body.removeChild(_this._backdrop);\n\t _this._backdrop = null;\n\t } catch (e) {}\n\t });\n\t this._backdrop.className = 'aside-backdrop';\n\t }\n\t }\n\t },\n\t methods: {\n\t trigger: function trigger() {\n\t var _this2 = this;\n\t\n\t return {\n\t close: function close() {\n\t return _this2.trigger_close();\n\t },\n\t open: function open() {\n\t return _this2.trigger_open();\n\t }\n\t };\n\t },\n\t trigger_close: function trigger_close() {\n\t this.$emit('close');\n\t },\n\t trigger_open: function trigger_open() {\n\t this.$emit('open');\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this3 = this;\n\t\n\t this.$emit('trigger', function () {\n\t return _this3.trigger;\n\t });\n\t }\n\t};\n\n/***/ },\n/* 86 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('transition', {\n\t attrs: {\n\t \"name\": 'slide' + _vm.placement\n\t }\n\t }, [(_vm.show) ? _vm._c('div', {\n\t staticClass: \"aside\",\n\t class: _vm.placement,\n\t style: ({\n\t width: _vm.width + 'px'\n\t })\n\t }, [_vm._c('div', {\n\t staticClass: \"aside-dialog\"\n\t }, [_vm._c('div', {\n\t staticClass: \"aside-content\"\n\t }, [_vm._c('div', {\n\t staticClass: \"aside-header\"\n\t }, [_vm._c('button', {\n\t staticClass: \"close\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.trigger_close\n\t }\n\t }, [_vm._c('span', [_vm._v(\"×\")])]), _vm._v(\" \"), _vm._c('h4', {\n\t staticClass: \"aside-title\"\n\t }, [_vm._t(\"header\", [_vm._v(_vm._s(_vm.header))])], 2)]), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"aside-body\"\n\t }, [_vm._t(\"default\")], 2)])])]) : _vm._e()])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-3a4bde27\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 87 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(88)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(89)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\ButtonGroup.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-125eb0c8\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-125eb0c8\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] ButtonGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 88 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t buttons: { default: true },\n\t justified: { type: Boolean, default: false },\n\t type: { type: String, default: 'default' },\n\t value: { default: null },\n\t vertical: { type: Boolean, default: false }\n\t },\n\t data: function data() {\n\t this._btnGroup = true;\n\t return {\n\t val: this.value\n\t };\n\t },\n\t\n\t watch: {\n\t val: function val(_val) {\n\t this.$emit('input', _val);\n\t }\n\t }\n\t};\n\n/***/ },\n/* 89 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: {\n\t 'btn-group': _vm.buttons, 'btn-group-justified': _vm.justified, 'btn-group-vertical': _vm.vertical\n\t },\n\t attrs: {\n\t \"data-toggle\": _vm.buttons && 'buttons'\n\t }\n\t }, [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-125eb0c8\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 90 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(91)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(93)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(94)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Carousel.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t__vue_options__._scopeId = \"data-v-322dee41\"\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-322dee41\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-322dee41\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Carousel.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 91 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 93 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// let coerce = {\n\t// interval: 'number'\n\t// }\n\t\n\texports.default = {\n\t props: {\n\t indicators: {\n\t type: Boolean,\n\t default: true\n\t },\n\t controls: {\n\t type: Boolean,\n\t default: true\n\t },\n\t interval: {\n\t type: Number,\n\t default: 5000\n\t }\n\t },\n\t data: function data() {\n\t return {\n\t indicator_list: [],\n\t index: 0,\n\t isAnimating: false\n\t };\n\t },\n\t\n\t watch: {\n\t index: function index(newVal, oldVal) {\n\t this.slide(newVal > oldVal ? 'left' : 'right', newVal, oldVal);\n\t }\n\t },\n\t methods: {\n\t indicatorClick: function indicatorClick(index) {\n\t if (this.isAnimating || this.index === index) return false;\n\t this.isAnimating = true;\n\t this.index = index;\n\t },\n\t slide: function slide(direction, next, prev) {\n\t var _this = this;\n\t\n\t if (!this.$el) {\n\t return;\n\t }\n\t var $slider = (0, _NodeList2.default)('.item', this.$el);\n\t if (!$slider.length) {\n\t return;\n\t }\n\t var selected = $slider[next] || $slider[0];\n\t (0, _NodeList2.default)(selected).addClass(direction === 'left' ? 'next' : 'prev');\n\t // request property that requires layout to force a layout\n\t var x = selected.clientHeight;\n\t (0, _NodeList2.default)([$slider[prev], selected]).addClass(direction).on('transitionend', function () {\n\t $slider.off('transitionend').className = 'item';\n\t (0, _NodeList2.default)(selected).addClass('active');\n\t _this.isAnimating = false;\n\t });\n\t },\n\t next: function next() {\n\t if (!this.$el || this.isAnimating) {\n\t return false;\n\t }\n\t this.isAnimating = true;\n\t this.index + 1 < (0, _NodeList2.default)('.item', this.$el).length ? this.index += 1 : this.index = 0;\n\t },\n\t prev: function prev() {\n\t if (!this.$el || this.isAnimating) {\n\t return false;\n\t }\n\t this.isAnimating = true;\n\t this.index === 0 ? this.index = (0, _NodeList2.default)('.item', this.$el).length - 1 : this.index -= 1;\n\t },\n\t toggleInterval: function toggleInterval(val) {\n\t if (val === undefined) {\n\t val = this._intervalID;\n\t }\n\t if (this._intervalID) {\n\t clearInterval(this._intervalID);\n\t delete this._intervalID;\n\t }\n\t if (val && this.interval > 0) {\n\t this._intervalID = setInterval(this.next, this.interval);\n\t }\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this2 = this;\n\t\n\t this.toggleInterval(true);\n\t (0, _NodeList2.default)(this.$el).on('mouseenter', function () {\n\t return _this2.toggleInterval(false);\n\t }).on('mouseleave', function () {\n\t return _this2.toggleInterval(true);\n\t });\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t this.toggleInterval(false);\n\t (0, _NodeList2.default)(this.$el).off('mouseenter mouseleave');\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 94 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t staticClass: \"carousel slide\",\n\t attrs: {\n\t \"data-ride\": \"carousel\"\n\t }\n\t }, [_vm._c('ol', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.indicators),\n\t expression: \"indicators\"\n\t }],\n\t staticClass: \"carousel-indicators\"\n\t }, _vm._l((_vm.indicator_list), function(indicator, i) {\n\t return _vm._c('li', {\n\t class: {\n\t active: i === _vm.index\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.indicatorClick(i)\n\t }\n\t }\n\t }, [_vm._c('span')])\n\t })), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"carousel-inner\",\n\t attrs: {\n\t \"role\": \"listbox\"\n\t }\n\t }, [_vm._t(\"default\")], 2), _vm._v(\" \"), _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.controls),\n\t expression: \"controls\"\n\t }],\n\t staticClass: \"carousel-controls hidden-xs\"\n\t }, [_vm._c('a', {\n\t staticClass: \"left carousel-control\",\n\t attrs: {\n\t \"role\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.prev\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"glyphicon glyphicon-chevron-left\",\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t }\n\t })]), _vm._v(\" \"), _vm._c('a', {\n\t staticClass: \"right carousel-control\",\n\t attrs: {\n\t \"role\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.next\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"glyphicon glyphicon-chevron-right\",\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t }\n\t })])])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-322dee41\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 95 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(96)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(98)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(99)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Checkbox.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t__vue_options__._scopeId = \"data-v-6922bf24\"\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-6922bf24\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-6922bf24\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Checkbox.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 96 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 98 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t button: { type: Boolean, default: false },\n\t disabled: { type: Boolean, default: false },\n\t falseValue: { default: false },\n\t name: { type: String, default: null },\n\t readonly: { type: Boolean, default: false },\n\t trueValue: { default: true },\n\t type: { type: String, default: null },\n\t value: { default: false }\n\t },\n\t data: function data() {\n\t return {\n\t checked: this.value === this.trueValue\n\t };\n\t },\n\t\n\t computed: {\n\t isButton: function isButton() {\n\t return this.button || this._inGroup && this.$parent.buttons;\n\t },\n\t isFalse: function isFalse() {\n\t return this.value === this.falseValue;\n\t },\n\t isTrue: function isTrue() {\n\t return this.value === this.trueValue;\n\t },\n\t parentValue: function parentValue() {\n\t return this._ingroup && this.$parent.val;\n\t },\n\t typeColor: function typeColor() {\n\t return this.type || this.$parent && this.$parent.type || 'default';\n\t }\n\t },\n\t watch: {\n\t checked: function checked(val, old) {\n\t var value = val ? this.trueValue : this.falseValue;\n\t this.$emit('checked', val);\n\t this.$emit('input', value);\n\t this.eval();\n\t },\n\t parentValue: function parentValue(val) {\n\t var checked = val === this.trueValue;\n\t if (this.checked !== checked) {\n\t this.checked = checked;\n\t }\n\t },\n\t value: function value(val, old) {\n\t var checked = val === this.trueValue;\n\t if (this.checked !== checked) {\n\t this.checked = checked;\n\t }\n\t }\n\t },\n\t created: function created() {\n\t var parent = this.$parent;\n\t if (parent && parent._btnGroup && !parent._radioGroup) {\n\t this._inGroup = true;\n\t parent._checkboxGroup = true;\n\t if (!(parent.val instanceof Array)) {\n\t parent.val = [];\n\t }\n\t this.eval();\n\t }\n\t },\n\t mounted: function mounted() {\n\t if (!this.$parent._checkboxGroup || typeof this.value === 'boolean') {\n\t return;\n\t }\n\t if (this.$parent.val.length) {\n\t // this.checked = ~this.$parent.val.indexOf(this.value)\n\t this.$emit('checked', ~this.$parent.val.indexOf(this.value));\n\t } else if (this.checked) {\n\t this.$parent.val.push(this.value);\n\t }\n\t },\n\t\n\t methods: {\n\t eval: function _eval() {\n\t if (this._inGroup) {\n\t var value = this.checked ? this.isTrue : this.isFalse;\n\t var index = this.$parent.val.indexOf(value);\n\t if (this.checked && !~index) this.$parent.val.push(value);\n\t if (!this.checked && ~index) this.$parent.val.splice(index, 1);\n\t }\n\t },\n\t toggle: function toggle() {\n\t if (this.disabled || this.readonly) {\n\t return;\n\t }\n\t this.checked = !this.checked;\n\t }\n\t }\n\t};\n\n/***/ },\n/* 99 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c(_vm.isButton ? 'a' : 'label', {\n\t tag: \"a\",\n\t class: [_vm.isButton ? 'btn btn-' + _vm.typeColor : 'open checkbox ' + _vm.typeColor, {\n\t active: _vm.checked,\n\t disabled: _vm.disabled,\n\t readonly: _vm.readonly\n\t }],\n\t on: {\n\t \"click\": _vm.toggle\n\t }\n\t }, [(_vm.name) ? _vm._c('input', {\n\t attrs: {\n\t \"type\": \"hidden\",\n\t \"name\": _vm.name\n\t },\n\t domProps: {\n\t \"value\": _vm.checked ? _vm.trueValue : _vm.falseValue\n\t }\n\t }) : _vm._e(), _vm._v(\" \"), (!_vm.isButton) ? _vm._c('span', {\n\t staticClass: \"icon dropdown-toggle\",\n\t class: [_vm.checked ? 'btn-' + _vm.typeColor : '', {\n\t bg: _vm.typeColor === 'default'\n\t }]\n\t }) : _vm._e(), _vm._v(\" \"), (!_vm.isButton && _vm.checked && _vm.typeColor === 'default') ? _vm._c('span', {\n\t staticClass: \"icon\"\n\t }) : _vm._e(), _vm._v(\" \"), _vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-6922bf24\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 100 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(101)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(103)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(104)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Datepicker.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-477b8e5d\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-477b8e5d\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Datepicker.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 101 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 103 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\t// import $ from './utils/NodeList.js'\n\t\n\texports.default = {\n\t props: {\n\t value: { type: String },\n\t format: { default: 'MM/dd/yyyy' },\n\t disabledDaysOfWeek: { type: Array, default: function _default() {\n\t return [];\n\t }\n\t },\n\t width: { type: String /*, default: '200px'*/ },\n\t clearButton: { type: Boolean, default: false },\n\t lang: { type: String, default: navigator.language },\n\t placeholder: { type: String },\n\t iconsFont: { type: String, default: 'glyphicon' }\n\t },\n\t data: function data() {\n\t return {\n\t currDate: new Date(),\n\t dateRange: [],\n\t decadeRange: [],\n\t displayDayView: false,\n\t displayMonthView: false,\n\t displayYearView: false\n\t };\n\t },\n\t\n\t watch: {\n\t currDate: function currDate() {\n\t this.getDateRange();\n\t },\n\t format: function format() {\n\t this.$emit('input', this.stringify(this.currDate));\n\t }\n\t },\n\t computed: {\n\t text: function text() {\n\t return (0, _utils.translations)(this.lang);\n\t },\n\t preBtnClasses: function preBtnClasses() {\n\t return 'datepicker-preBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-left';\n\t },\n\t nextBtnClasses: function nextBtnClasses() {\n\t return 'datepicker-nextBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-right';\n\t },\n\t disabledDaysArray: function disabledDaysArray() {\n\t return this.disabledDaysOfWeek.map(function (d) {\n\t return parseInt(d, 10);\n\t });\n\t }\n\t },\n\t methods: {\n\t close: function close() {\n\t this.displayDayView = this.displayMonthView = this.displayYearView = false;\n\t },\n\t inputClick: function inputClick() {\n\t this.currDate = this.parse(this.value) || this.parse(new Date());\n\t if (this.displayMonthView || this.displayYearView) {\n\t this.displayDayView = false;\n\t } else {\n\t this.displayDayView = !this.displayDayView;\n\t }\n\t },\n\t preNextDecadeClick: function preNextDecadeClick(flag) {\n\t var year = this.currDate.getFullYear();\n\t var months = this.currDate.getMonth();\n\t var date = this.currDate.getDate();\n\t\n\t if (flag === 0) {\n\t this.currDate = new Date(year - 10, months, date);\n\t } else {\n\t this.currDate = new Date(year + 10, months, date);\n\t }\n\t },\n\t preNextMonthClick: function preNextMonthClick(flag) {\n\t var year = this.currDate.getFullYear();\n\t var month = this.currDate.getMonth();\n\t var date = this.currDate.getDate();\n\t\n\t if (flag === 0) {\n\t var preMonth = this.getYearMonth(year, month - 1);\n\t this.currDate = new Date(preMonth.year, preMonth.month, date);\n\t } else {\n\t var nextMonth = this.getYearMonth(year, month + 1);\n\t this.currDate = new Date(nextMonth.year, nextMonth.month, date);\n\t }\n\t },\n\t preNextYearClick: function preNextYearClick(flag) {\n\t var year = this.currDate.getFullYear();\n\t var months = this.currDate.getMonth();\n\t var date = this.currDate.getDate();\n\t\n\t if (flag === 0) {\n\t this.currDate = new Date(year - 1, months, date);\n\t } else {\n\t this.currDate = new Date(year + 1, months, date);\n\t }\n\t },\n\t yearSelect: function yearSelect(year) {\n\t this.displayYearView = false;\n\t this.displayMonthView = true;\n\t this.currDate = new Date(year, this.currDate.getMonth(), this.currDate.getDate());\n\t },\n\t daySelect: function daySelect(day) {\n\t if (day.sclass === 'datepicker-item-disable') {\n\t return false;\n\t } else {\n\t this.currDate = day.date;\n\t this.$emit('input', this.stringify(this.currDate));\n\t this.displayDayView = false;\n\t }\n\t },\n\t switchMonthView: function switchMonthView() {\n\t this.displayDayView = false;\n\t this.displayMonthView = true;\n\t },\n\t switchDecadeView: function switchDecadeView() {\n\t this.displayMonthView = false;\n\t this.displayYearView = true;\n\t },\n\t monthSelect: function monthSelect(index) {\n\t this.displayMonthView = false;\n\t this.displayDayView = true;\n\t this.currDate = new Date(this.currDate.getFullYear(), index, this.currDate.getDate());\n\t },\n\t getYearMonth: function getYearMonth(year, month) {\n\t if (month > 11) {\n\t year++;\n\t month = 0;\n\t } else if (month < 0) {\n\t year--;\n\t month = 11;\n\t }\n\t return { year: year, month: month };\n\t },\n\t stringifyDecadeHeader: function stringifyDecadeHeader(date) {\n\t var yearStr = date.getFullYear().toString();\n\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0;\n\t var lastYearOfDecade = parseInt(firstYearOfDecade, 10) + 10;\n\t return firstYearOfDecade + '-' + lastYearOfDecade;\n\t },\n\t stringifyDayHeader: function stringifyDayHeader(date) {\n\t return this.text.months[date.getMonth()] + ' ' + date.getFullYear();\n\t },\n\t parseMonth: function parseMonth(date) {\n\t return this.text.months[date.getMonth()];\n\t },\n\t stringifyYearHeader: function stringifyYearHeader(date) {\n\t return date.getFullYear();\n\t },\n\t stringify: function stringify(date) {\n\t var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.format;\n\t\n\t if (!date) date = this.parse();\n\t if (!date) return '';\n\t var year = date.getFullYear();\n\t var month = date.getMonth() + 1;\n\t var day = date.getDate();\n\t var monthName = this.parseMonth(date);\n\t\n\t return format.replace(/yyyy/g, year).replace(/MMMM/g, monthName).replace(/MMM/g, monthName.substring(0, 3)).replace(/MM/g, ('0' + month).slice(-2)).replace(/dd/g, ('0' + day).slice(-2)).replace(/yy/g, year).replace(/M(?!a)/g, month).replace(/d/g, day);\n\t },\n\t parse: function parse() {\n\t var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.value;\n\t\n\t var date = void 0;\n\t if (str.length === 10 && (this.format === 'dd-MM-yyyy' || this.format === 'dd/MM/yyyy')) {\n\t date = new Date(str.substring(6, 10), str.substring(3, 5) - 1, str.substring(0, 2));\n\t } else {\n\t date = new Date(str);\n\t }\n\t return isNaN(date.getFullYear()) ? new Date() : date;\n\t },\n\t getDayCount: function getDayCount(year, month) {\n\t var dict = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\t if (month === 1) {\n\t if (year % 400 === 0 || year % 4 === 0 && year % 100 !== 0) {\n\t return 29;\n\t }\n\t }\n\t return dict[month];\n\t },\n\t getDateRange: function getDateRange() {\n\t this.dateRange = [];\n\t this.decadeRange = [];\n\t var time = {\n\t year: this.currDate.getFullYear(),\n\t month: this.currDate.getMonth(),\n\t day: this.currDate.getDate()\n\t };\n\t var yearStr = time.year.toString();\n\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0 - 1;\n\t for (var i = 0; i < 12; i++) {\n\t this.decadeRange.push({\n\t text: firstYearOfDecade + i\n\t });\n\t }\n\t\n\t var currMonthFirstDay = new Date(time.year, time.month, 1);\n\t var firstDayWeek = currMonthFirstDay.getDay() + 1;\n\t if (firstDayWeek === 0) {\n\t firstDayWeek = 7;\n\t }\n\t var dayCount = this.getDayCount(time.year, time.month);\n\t if (firstDayWeek > 1) {\n\t var preMonth = this.getYearMonth(time.year, time.month - 1);\n\t var prevMonthDayCount = this.getDayCount(preMonth.year, preMonth.month);\n\t for (var _i = 1; _i < firstDayWeek; _i++) {\n\t var dayText = prevMonthDayCount - firstDayWeek + _i + 1;\n\t var date = new Date(preMonth.year, preMonth.month, dayText);\n\t var sclass = 'datepicker-item-gray';\n\t if (this.disabledDaysArray.indexOf(date.getDay()) > -1) {\n\t sclass = 'datepicker-item-disable';\n\t }\n\t this.dateRange.push({\n\t text: dayText,\n\t date: date,\n\t sclass: 'datepicker-item-gray'\n\t });\n\t }\n\t }\n\t\n\t for (var _i2 = 1; _i2 <= dayCount; _i2++) {\n\t var _date = new Date(time.year, time.month, _i2);\n\t var _sclass = '';\n\t if (this.disabledDaysArray.indexOf(_date.getDay()) > -1) {\n\t _sclass = 'datepicker-item-disable';\n\t }\n\t if (_i2 == time.day && _date.getFullYear() == time.year && _date.getMonth() == time.month) {\n\t _sclass = 'datepicker-dateRange-item-active';\n\t }\n\t this.dateRange.push({\n\t text: _i2,\n\t date: _date,\n\t sclass: _sclass\n\t });\n\t }\n\t\n\t if (this.dateRange.length < 42) {\n\t var nextMonthNeed = 42 - this.dateRange.length;\n\t var nextMonth = this.getYearMonth(time.year, time.month + 1);\n\t\n\t for (var _i3 = 1; _i3 <= nextMonthNeed; _i3++) {\n\t var _date2 = new Date(nextMonth.year, nextMonth.month, _i3);\n\t var _sclass2 = 'datepicker-item-gray';\n\t if (this.disabledDaysArray.indexOf(_date2.getDay()) > -1) {\n\t _sclass2 = 'datepicker-item-disable';\n\t }\n\t this.dateRange.push({\n\t text: _i3,\n\t date: _date2,\n\t sclass: _sclass2\n\t });\n\t }\n\t }\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this = this;\n\t\n\t var el = this.$el;\n\t this._blur = function (e) {\n\t if (!el.contains(e.target)) _this.close();\n\t };\n\t this.$emit('child-created', this);\n\t this.currDate = this.parse(this.value) || this.parse(new Date());\n\t window.addEventListener('click', this._blur);\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t window.removeEventListener('click', this._blur);\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 104 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t staticClass: \"datepicker\"\n\t }, [_vm._c('input', {\n\t staticClass: \"form-control datepicker-input\",\n\t class: {\n\t 'with-reset-button': _vm.clearButton\n\t },\n\t style: ({\n\t width: _vm.width\n\t }),\n\t attrs: {\n\t \"type\": \"text\",\n\t \"placeholder\": _vm.placeholder\n\t },\n\t domProps: {\n\t \"value\": _vm.value\n\t },\n\t on: {\n\t \"click\": _vm.inputClick,\n\t \"input\": function($event) {\n\t _vm.$emit('input', $event.target.value)\n\t }\n\t }\n\t }), _vm._v(\" \"), (_vm.clearButton && _vm.value) ? _vm._c('button', {\n\t staticClass: \"close\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.$emit('input', '')\n\t }\n\t }\n\t }, [_vm._c('span', [_vm._v(\"×\")])]) : _vm._e(), _vm._v(\" \"), _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.displayDayView),\n\t expression: \"displayDayView\"\n\t }],\n\t staticClass: \"datepicker-popup\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-inner\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-body\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-ctrl\"\n\t }, [_vm._c('span', {\n\t class: _vm.preBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextMonthClick(0)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t class: _vm.nextBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextMonthClick(1)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('p', {\n\t on: {\n\t \"click\": _vm.switchMonthView\n\t }\n\t }, [_vm._v(_vm._s(_vm.stringifyDayHeader(_vm.currDate)))])]), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"datepicker-weekRange\"\n\t }, _vm._l((_vm.text.daysOfWeek), function(w) {\n\t return _vm._c('span', [_vm._v(_vm._s(w))])\n\t })), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"datepicker-dateRange\"\n\t }, _vm._l((_vm.dateRange), function(d) {\n\t return _vm._c('span', {\n\t class: d.sclass,\n\t on: {\n\t \"click\": function($event) {\n\t _vm.daySelect(d)\n\t }\n\t }\n\t }, [_vm._v(_vm._s(d.text))])\n\t }))])])]), _vm._v(\" \"), _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.displayMonthView),\n\t expression: \"displayMonthView\"\n\t }],\n\t staticClass: \"datepicker-popup\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-inner\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-body\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-ctrl\"\n\t }, [_vm._c('span', {\n\t class: _vm.preBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextYearClick(0)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t class: _vm.nextBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextYearClick(1)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('p', {\n\t on: {\n\t \"click\": _vm.switchDecadeView\n\t }\n\t }, [_vm._v(_vm._s(_vm.stringifyYearHeader(_vm.currDate)))])]), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"datepicker-monthRange\"\n\t }, [_vm._l((_vm.text.months), function(m, index) {\n\t return [_vm._c('span', {\n\t class: {\n\t 'datepicker-dateRange-item-active':\n\t (_vm.text.months[_vm.parse(_vm.value).getMonth()] === m) &&\n\t _vm.currDate.getFullYear() === _vm.parse(_vm.value).getFullYear()\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.monthSelect(index)\n\t }\n\t }\n\t }, [_vm._v(_vm._s(m.substr(0, 3)))])]\n\t })], 2)])])]), _vm._v(\" \"), _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.displayYearView),\n\t expression: \"displayYearView\"\n\t }],\n\t staticClass: \"datepicker-popup\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-inner\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-body\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-ctrl\"\n\t }, [_vm._c('span', {\n\t class: _vm.preBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextDecadeClick(0)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t class: _vm.nextBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextDecadeClick(1)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('p', [_vm._v(_vm._s(_vm.stringifyDecadeHeader(_vm.currDate)))])]), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"datepicker-monthRange decadeRange\"\n\t }, [_vm._l((_vm.decadeRange), function(decade) {\n\t return [_vm._c('span', {\n\t class: {\n\t 'datepicker-dateRange-item-active': _vm.parse(this.value).getFullYear() === decade.text\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t $event.stopPropagation();\n\t _vm.yearSelect(decade.text)\n\t }\n\t }\n\t }, [_vm._v(_vm._s(decade.text))])]\n\t })], 2)])])])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-477b8e5d\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 105 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(106)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(107)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Dropdown.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-39be1072\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-39be1072\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Dropdown.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 106 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tvar _ClickOutside = __webpack_require__(66);\n\t\n\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t directives: {\n\t ClickOutside: _ClickOutside2.default\n\t },\n\t props: {\n\t disabled: { type: Boolean, default: false },\n\t size: { type: String, default: null },\n\t text: { type: String, default: null },\n\t type: { type: String, default: 'default' },\n\t value: { type: Boolean, default: false }\n\t },\n\t data: function data() {\n\t var show = this.value;\n\t return { show: show };\n\t },\n\t\n\t watch: {\n\t show: function show(val) {\n\t this.$emit('input', val);\n\t },\n\t value: function value(val) {\n\t this.show = val;\n\t }\n\t },\n\t computed: {\n\t buttonSize: function buttonSize() {\n\t return ~['lg', 'sm', 'xs'].indexOf(this.size) ? 'btn-' + this.size : '';\n\t },\n\t inInput: function inInput() {\n\t return this.$parent._input;\n\t },\n\t isLi: function isLi() {\n\t return this.$parent._isTabs || this.$parent._navbar || this.$parent.menu;\n\t },\n\t menu: function menu() {\n\t return !this.$parent || this.$parent.navbar;\n\t },\n\t slots: function slots() {\n\t return this._slotContents;\n\t },\n\t submenu: function submenu() {\n\t return this.$parent && (this.$parent.menu || this.$parent.submenu);\n\t }\n\t },\n\t methods: {\n\t blur: function blur() {\n\t this.show = false;\n\t },\n\t toggle: function toggle() {\n\t if (!this.disabled) {\n\t this.show = !this.show;\n\t }\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this = this;\n\t\n\t (0, _NodeList2.default)('ul', this.$el).on('click', 'li>a', function (e) {\n\t _this.show = false;\n\t });\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t (0, _NodeList2.default)('ul', this.$el).off();\n\t }\n\t};\n\n/***/ },\n/* 107 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c(_vm.isLi ? 'li' : 'div', {\n\t directives: [{\n\t name: \"click-outside\",\n\t rawName: \"v-click-outside\",\n\t value: (_vm.blur),\n\t expression: \"blur\"\n\t }],\n\t tag: \"div\",\n\t class: [{\n\t open: _vm.show,\n\t disabled: _vm.disabled,\n\t dropdown: _vm.isLi,\n\t 'input-group-btn': _vm.inInput,\n\t 'btn-group': !_vm.isLi && !_vm.inInput\n\t }]\n\t }, [_vm._t(\"before\"), _vm._v(\" \"), (_vm.isLi) ? _vm._c('a', {\n\t class: ['dropdown-toggle', _vm.buttonSize, {\n\t disabled: _vm.disabled\n\t }],\n\t attrs: {\n\t \"role\": \"button\"\n\t },\n\t on: {\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t _vm.show = false\n\t },\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }\n\t }\n\t }, [_vm._t(\"button\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"caret\"\n\t })], 2) : _vm._c('button', {\n\t class: ['btn btn-' + _vm.type, _vm.buttonSize, 'dropdown-toggle'],\n\t attrs: {\n\t \"type\": \"button\",\n\t \"disabled\": _vm.disabled\n\t },\n\t on: {\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t _vm.show = false\n\t },\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }\n\t }\n\t }, [_vm._t(\"button\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"caret\"\n\t })], 2), _vm._v(\" \"), _vm._t(\"dropdown-menu\", [_vm._c('ul', {\n\t staticClass: \"dropdown-menu\"\n\t }, [_vm._t(\"default\")], 2)])], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-39be1072\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 108 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(109)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(110)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\FormGroup.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-79eb400a\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-79eb400a\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] FormGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 109 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// let coerce = {\n\t// enterSubmit: 'boolean',\n\t// icon: 'boolean'\n\t// }\n\t\n\texports.default = {\n\t props: {\n\t enterSubmit: {\n\t type: Boolean,\n\t default: false\n\t },\n\t icon: {\n\t type: Boolean,\n\t default: false\n\t },\n\t lang: {\n\t type: String,\n\t default: navigator.language\n\t }\n\t },\n\t data: function data() {\n\t return {\n\t children: [],\n\t valid: null,\n\t timeout: null\n\t };\n\t },\n\t\n\t watch: {\n\t valid: function valid(val, old) {\n\t this.$emit('isvalid', val);\n\t this.$emit(!val ? 'invalid' : 'valid');\n\t if (val !== old && this._parent) this._parent.validate();\n\t }\n\t },\n\t methods: {\n\t validate: function validate() {\n\t var valid = true;\n\t this.children.some(function (el) {\n\t var v = el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\n\t if (!v) valid = false;\n\t return !valid;\n\t });\n\t this.valid = valid;\n\t return valid === true;\n\t }\n\t },\n\t created: function created() {\n\t this._formGroup = true;\n\t var parent = this.$parent;\n\t while (parent && !parent._formGroup) {\n\t parent = parent.$parent;\n\t }\n\t if (parent && parent._formGroup) {\n\t parent.children.push(this);\n\t this._parent = parent;\n\t }\n\t },\n\t mounted: function mounted() {\n\t this.validate();\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._parent) {\n\t var index = this._parent.children.indexOf(this);\n\t this._parent.children.splice(index, 1);\n\t }\n\t }\n\t}; //\n\t//\n\n/***/ },\n/* 110 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-79eb400a\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 111 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(112)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(113)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\FormValidator.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-b9f57c46\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-b9f57c46\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] FormValidator.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 112 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t props: {\n\t enterSubmit: { type: Boolean, default: false },\n\t icon: { type: Boolean, default: false },\n\t lang: { type: String, default: navigator.language },\n\t value: null\n\t },\n\t data: function data() {\n\t return {\n\t children: [],\n\t valid: null,\n\t timeout: null\n\t };\n\t },\n\t\n\t watch: {\n\t valid: function valid(val, old) {\n\t this.$emit('isvalid', val);\n\t this.$emit('input', val);\n\t this.$emit(!val ? 'invalid' : 'valid');\n\t if (val !== old && this._parent) this._parent.validate();\n\t }\n\t },\n\t methods: {\n\t validate: function validate() {\n\t var invalid = !this.children.every(function (el) {\n\t return el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\n\t });\n\t this.valid = !invalid;\n\t return !invalid;\n\t }\n\t },\n\t created: function created() {\n\t this._formValidator = true;\n\t var parent = this.$parent;\n\t while (parent && !parent._formValidator) {\n\t parent = parent.$parent;\n\t }\n\t if (parent && parent._formValidator) {\n\t parent.children.push(this);\n\t this._parent = parent;\n\t }\n\t },\n\t mounted: function mounted() {\n\t this.validate();\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._parent) {\n\t var index = this._parent.children.indexOf(this);\n\t this._parent.children.splice(index, 1);\n\t }\n\t }\n\t}; //\n\t//\n\n/***/ },\n/* 113 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-b9f57c46\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 114 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(115)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(117)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(118)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Input.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t__vue_options__._scopeId = \"data-v-652ad7b9\"\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-652ad7b9\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-652ad7b9\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Input.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 115 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 117 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\tvar DELAY = 300;\n\t\n\texports.default = {\n\t props: {\n\t clearButton: { type: Boolean, default: false },\n\t cols: { type: Number, default: null },\n\t datalist: { type: Array, default: null },\n\t disabled: { type: Boolean, default: false },\n\t enterSubmit: { type: Boolean, default: false },\n\t error: { type: String, default: null },\n\t help: { type: String, default: null },\n\t hideHelp: { type: Boolean, default: true },\n\t icon: { type: Boolean, default: false },\n\t label: { type: String, default: null },\n\t lang: { type: String, default: navigator.language },\n\t mask: null,\n\t maskDelay: { type: Number, default: 100 },\n\t match: { type: String, default: null },\n\t max: { type: String, default: null },\n\t maxlength: { type: Number, default: null },\n\t min: { type: String, default: null },\n\t minlength: { type: Number, default: 0 },\n\t name: { type: String, default: null },\n\t pattern: { default: null },\n\t placeholder: { type: String, default: null },\n\t readonly: { type: Boolean, default: false },\n\t required: { type: Boolean, default: false },\n\t rows: { type: Number, default: 3 },\n\t step: { type: Number, default: null },\n\t type: { type: String, default: 'text' },\n\t url: { type: String, default: null },\n\t urlMap: { type: Function, default: null },\n\t validationDelay: { type: Number, default: 250 },\n\t value: { default: null }\n\t },\n\t data: function data() {\n\t var val = this.value;\n\t return {\n\t options: this.datalist,\n\t val: val,\n\t valid: null,\n\t timeout: null\n\t };\n\t },\n\t\n\t computed: {\n\t canValidate: function canValidate() {\n\t return !this.disabled && !this.readonly && (this.required || this.regex || this.nativeValidate || this.match !== null);\n\t },\n\t errorText: function errorText() {\n\t var value = this.value;\n\t var error = [this.error];\n\t if (!value && this.required) error.push('(' + this.text.required.toLowerCase() + ')');\n\t if (value && value.length < this.minlength) error.push('(' + this.text.minLength.toLowerCase() + ': ' + this.minlength + ')');\n\t return error.join(' ');\n\t },\n\t id_datalist: function id_datalist() {\n\t if (this.type !== 'textarea' && this.datalist instanceof Array) {\n\t if (!this._id_datalist) {\n\t if (!this.$root.id_datalist) {\n\t this.$root.id_datalist = 0;\n\t }\n\t this._id_datalist = 'input-datalist' + this.$root.id_datalist++;\n\t }\n\t return this._id_datalist;\n\t }\n\t return null;\n\t },\n\t input: function input() {\n\t return this.$refs.input;\n\t },\n\t nativeValidate: function nativeValidate() {\n\t return (this.input || {}).checkValidity && (~['url', 'email'].indexOf(this.type.toLowerCase()) || this.min || this.max);\n\t },\n\t regex: function regex() {\n\t return _utils.coerce.pattern(this.pattern);\n\t },\n\t showError: function showError() {\n\t return this.error && this.valid === false;\n\t },\n\t showHelp: function showHelp() {\n\t return this.help && (!this.showError || !this.hideHelp);\n\t },\n\t text: function text() {\n\t return (0, _utils.translations)(this.lang);\n\t },\n\t title: function title() {\n\t return this.errorText || this.help || '';\n\t }\n\t },\n\t watch: {\n\t datalist: function datalist(val, old) {\n\t if (val !== old && val instanceof Array) {\n\t this.options = val;\n\t }\n\t },\n\t match: function match(val) {\n\t this.eval();\n\t },\n\t options: function options(val, old) {\n\t if (val !== old) this.$emit('options', val);\n\t },\n\t url: function url(val) {\n\t this._url();\n\t },\n\t val: function val(_val, old) {\n\t var _this = this;\n\t\n\t this.$emit('input', _val);\n\t if (_val !== old) {\n\t if (this.mask instanceof Function) {\n\t _val = this.mask(_val || '');\n\t if (this.val !== _val) {\n\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\n\t this._timeout.mask = setTimeout(function () {\n\t _this.val = _val;\n\t }, isNaN(this.maskDelay) ? 0 : this.maskDelay);\n\t }\n\t }\n\t this.eval();\n\t }\n\t },\n\t valid: function valid(val, old) {\n\t this.$emit('isvalid', val);\n\t this.$emit(!val ? 'invalid' : 'valid');\n\t if (this._parent) this._parent.validate();\n\t },\n\t value: function value(val) {\n\t if (this.val !== val) {\n\t this.val = val;\n\t }\n\t }\n\t },\n\t methods: {\n\t attr: function attr(value) {\n\t return ~['', null, undefined].indexOf(value) || value instanceof Function ? null : value;\n\t },\n\t emit: function emit(e) {\n\t this.$emit(e.type, e.type == 'input' ? e.target.value : e);\n\t if (e.type === 'blur' && this.canValidate) {\n\t this.valid = this.validate();\n\t }\n\t },\n\t eval: function _eval() {\n\t var _this2 = this;\n\t\n\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\n\t if (!this.canValidate) {\n\t this.valid = true;\n\t } else {\n\t this._timeout.eval = setTimeout(function () {\n\t _this2.valid = _this2.validate();\n\t _this2._timeout.eval = null;\n\t }, this.validationDelay);\n\t }\n\t },\n\t focus: function focus() {\n\t this.input.focus();\n\t },\n\t submit: function submit() {\n\t if (this.$parent._formValidator) {\n\t return this.$parent.validate();\n\t }\n\t if (this.input.form) {\n\t var invalids = (0, _NodeList2.default)('.form-group.validate:not(.has-success)', this.input.form);\n\t if (invalids.length) {\n\t invalids.find('input,textarea,select')[0].focus();\n\t } else {\n\t this.input.form.submit();\n\t }\n\t }\n\t },\n\t validate: function validate() {\n\t if (!this.canValidate) {\n\t return true;\n\t }\n\t var value = (this.val || '').trim();\n\t if (!value) {\n\t return !this.required;\n\t }\n\t if (this.match !== null) {\n\t return this.match === value;\n\t }\n\t if (value.length < this.minlength) {\n\t return false;\n\t }\n\t if (this.nativeValidate && !this.input.checkValidity()) {\n\t return false;\n\t }\n\t if (this.regex) {\n\t if (!(this.regex instanceof Function ? this.regex(this.value) : this.regex.test(this.value))) {\n\t return false;\n\t }\n\t }\n\t return true;\n\t },\n\t reset: function reset() {\n\t this.value = '';\n\t this.valid = null;\n\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\n\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\n\t }\n\t },\n\t created: function created() {\n\t this._input = true;\n\t this._timeout = {};\n\t var parent = this.$parent;\n\t while (parent && !parent._formValidator) {\n\t parent = parent.$parent;\n\t }\n\t if (parent && parent._formValidator) {\n\t parent.children.push(this);\n\t this._parent = parent;\n\t }\n\t this._url = (0, _utils.delayer)(function () {\n\t var _this3 = this;\n\t\n\t if (!this.url || !this.$http || this._loading) {\n\t return;\n\t }\n\t this._loading = true;\n\t this.$http.get(this.url).then(function (response) {\n\t var data = response.data instanceof Array ? response.data : [];\n\t try {\n\t data = JSON.parse(data);\n\t } catch (e) {}\n\t if (_this3.urlMap) {\n\t data = data.map(_this3.urlMap);\n\t }\n\t _this3.options = data;\n\t _this3.loading = false;\n\t }, function (response) {\n\t _this3.loading = false;\n\t });\n\t }, DELAY);\n\t if (this.url) this._url();\n\t },\n\t mounted: function mounted() {\n\t // $(this.input).on('focus', e => { this.$emit('focus', e) }).on('blur', e => {\n\t // if (this.canValidate) { this.valid = this.validate() }\n\t // this.$emit('blur', e)\n\t // })\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t // $(this.input).off()\n\t if (this._parent) {\n\t var index = this._parent.children.indexOf(this);\n\t this._parent.children.splice(index, 1);\n\t }\n\t }\n\t};\n\n/***/ },\n/* 118 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t staticClass: \"form-group\",\n\t class: {\n\t validate: _vm.canValidate, 'has-feedback': _vm.icon, 'has-error': _vm.canValidate && _vm.valid === false, 'has-success': _vm.canValidate && _vm.valid\n\t }\n\t }, [_vm._t(\"label\", [(_vm.label) ? _vm._c('label', {\n\t staticClass: \"control-label\",\n\t on: {\n\t \"click\": _vm.focus\n\t }\n\t }, [_vm._v(_vm._s(_vm.label))]) : _vm._e()]), _vm._v(\" \"), (_vm.$slots.before || _vm.$slots.after) ? _vm._c('div', {\n\t staticClass: \"input-group\"\n\t }, [_vm._t(\"before\"), _vm._v(\" \"), _vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.val),\n\t expression: \"val\"\n\t }],\n\t ref: \"input\",\n\t tag: \"textarea\",\n\t staticClass: \"form-control\",\n\t attrs: {\n\t \"cols\": _vm.cols,\n\t \"disabled\": _vm.disabled,\n\t \"list\": _vm.id_datalist,\n\t \"max\": _vm.attr(_vm.max),\n\t \"maxlength\": _vm.maxlength,\n\t \"min\": _vm.attr(_vm.min),\n\t \"name\": _vm.name,\n\t \"placeholder\": _vm.placeholder,\n\t \"readonly\": _vm.readonly,\n\t \"required\": _vm.required,\n\t \"rows\": _vm.rows,\n\t \"step\": _vm.step,\n\t \"title\": _vm.attr(_vm.title),\n\t \"type\": _vm.type == 'textarea' ? null : _vm.type\n\t },\n\t domProps: {\n\t \"value\": _vm._s(_vm.val)\n\t },\n\t on: {\n\t \"blur\": _vm.emit,\n\t \"focus\": _vm.emit,\n\t \"input\": [function($event) {\n\t if ($event.target.composing) { return; }\n\t _vm.val = $event.target.value\n\t }, _vm.emit],\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"enter\", 13)) { return; }\n\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\n\t }\n\t }\n\t }), _vm._v(\" \"), (_vm.clearButton && _vm.value) ? _vm._c('div', {\n\t class: {\n\t icon: _vm.icon\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"close\",\n\t on: {\n\t \"click\": function($event) {\n\t _vm.value = ''\n\t }\n\t }\n\t }, [_vm._v(\"×\")])]) : _vm._e(), _vm._v(\" \"), (_vm.icon) ? _vm._c('div', {\n\t staticClass: \"icon\"\n\t }, [(_vm.icon && _vm.valid !== null) ? _vm._c('span', {\n\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t }\n\t }) : _vm._e()]) : _vm._e(), _vm._v(\" \"), _vm._t(\"after\")], 2) : [_vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.val),\n\t expression: \"val\"\n\t }],\n\t ref: \"input\",\n\t tag: \"textarea\",\n\t staticClass: \"form-control\",\n\t attrs: {\n\t \"cols\": _vm.cols,\n\t \"disabled\": _vm.disabled,\n\t \"list\": _vm.id_datalist,\n\t \"max\": _vm.attr(_vm.max),\n\t \"maxlength\": _vm.maxlength,\n\t \"min\": _vm.attr(_vm.min),\n\t \"name\": _vm.name,\n\t \"placeholder\": _vm.placeholder,\n\t \"readonly\": _vm.readonly,\n\t \"required\": _vm.required,\n\t \"rows\": _vm.rows,\n\t \"step\": _vm.step,\n\t \"title\": _vm.attr(_vm.title),\n\t \"type\": _vm.type == 'textarea' ? null : _vm.type\n\t },\n\t domProps: {\n\t \"value\": _vm._s(_vm.val)\n\t },\n\t on: {\n\t \"blur\": _vm.emit,\n\t \"focus\": _vm.emit,\n\t \"input\": [function($event) {\n\t if ($event.target.composing) { return; }\n\t _vm.val = $event.target.value\n\t }, _vm.emit],\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"enter\", 13)) { return; }\n\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\n\t }\n\t }\n\t }), _vm._v(\" \"), (_vm.clearButton && _vm.val) ? _vm._c('span', {\n\t staticClass: \"close\",\n\t on: {\n\t \"click\": function($event) {\n\t _vm.val = ''\n\t }\n\t }\n\t }, [_vm._v(\"×\")]) : _vm._e(), _vm._v(\" \"), (_vm.icon && _vm.valid !== null) ? _vm._c('span', {\n\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t }\n\t }) : _vm._e()], _vm._v(\" \"), (_vm.id_datalist) ? _vm._c('datalist', {\n\t attrs: {\n\t \"id\": _vm.id_datalist\n\t }\n\t }, _vm._l((_vm.options), function(opc) {\n\t return _vm._c('option', {\n\t domProps: {\n\t \"value\": opc\n\t }\n\t })\n\t })) : _vm._e(), _vm._v(\" \"), (_vm.showHelp) ? _vm._c('div', {\n\t staticClass: \"help-block\",\n\t on: {\n\t \"click\": _vm.focus\n\t }\n\t }, [_vm._v(_vm._s(_vm.help))]) : _vm._e(), _vm._v(\" \"), (_vm.showError) ? _vm._c('div', {\n\t staticClass: \"help-block with-errors\",\n\t on: {\n\t \"click\": _vm.focus\n\t }\n\t }, [_vm._v(_vm._s(_vm.errorText))]) : _vm._e()], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-652ad7b9\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 119 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(120)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(122)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(127)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Modal.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-fe7d5dc8\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-fe7d5dc8\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Modal.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 120 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 122 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _isInteger = __webpack_require__(123);\n\t\n\tvar _isInteger2 = _interopRequireDefault(_isInteger);\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t props: {\n\t backdrop: { type: Boolean, default: true },\n\t callback: { type: Function, default: null },\n\t cancelText: { type: String, default: 'Close' },\n\t effect: { type: String, default: null },\n\t large: { type: Boolean, default: false },\n\t okText: { type: String, default: 'Save changes' },\n\t small: { type: Boolean, default: false },\n\t title: { type: String, default: '' },\n\t value: { type: Boolean, required: true },\n\t width: { default: null }\n\t },\n\t computed: {\n\t optionalWidth: function optionalWidth() {\n\t if (this.width === null) {\n\t return null;\n\t } else if ((0, _isInteger2.default)(this.width)) {\n\t return this.width + 'px';\n\t }\n\t return this.width;\n\t }\n\t },\n\t watch: {\n\t value: function value(val) {\n\t this.transitionstart();\n\t }\n\t },\n\t methods: {\n\t backClose: function backClose(e) {\n\t if (this.backdrop && e.target === this.$el) {\n\t this.close();\n\t }\n\t },\n\t close: function close() {\n\t this.$emit('cancel');\n\t this.$emit('input', false);\n\t },\n\t ok: function ok() {\n\t if (this.callback instanceof Function) this.callback();\n\t this.$emit('ok');\n\t this.$emit('input', true);\n\t },\n\t transitionstart: function transitionstart() {\n\t var el = this.$el;\n\t var body = document.body;\n\t var scrollBarWidth = (0, _utils.getScrollBarWidth)();\n\t if (this.value) {\n\t el.querySelector('.modal-content').focus();\n\t el.style.display = 'block';\n\t setTimeout(function () {\n\t return el.classList.add('in');\n\t }, 0);\n\t body.classList.add('modal-open');\n\t if (scrollBarWidth !== 0) {\n\t body.style.paddingRight = scrollBarWidth + 'px';\n\t }\n\t } else {\n\t el.classList.remove('in');\n\t }\n\t },\n\t transitionend: function transitionend() {\n\t if (!this.value) {\n\t this.$el.style.display = 'none';\n\t var body = document.body;\n\t body.style.paddingRight = null;\n\t body.classList.remove('modal-open');\n\t }\n\t }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 123 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(124), __esModule: true };\n\n/***/ },\n/* 124 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(125);\n\tmodule.exports = __webpack_require__(7).Number.isInteger;\n\n/***/ },\n/* 125 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.3 Number.isInteger(number)\n\tvar $export = __webpack_require__(5);\n\t\n\t$export($export.S, 'Number', {isInteger: __webpack_require__(126)});\n\n/***/ },\n/* 126 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.3 Number.isInteger(number)\n\tvar isObject = __webpack_require__(13)\n\t , floor = Math.floor;\n\tmodule.exports = function isInteger(it){\n\t return !isObject(it) && isFinite(it) && floor(it) === it;\n\t};\n\n/***/ },\n/* 127 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: ['modal', _vm.effect],\n\t attrs: {\n\t \"role\": \"dialog\"\n\t },\n\t on: {\n\t \"click\": _vm.backClose,\n\t \"transitionend\": _vm.transitionend\n\t }\n\t }, [_vm._c('div', {\n\t class: {\n\t 'modal-dialog': true, 'modal-lg': _vm.large, 'modal-sm': _vm.small\n\t },\n\t style: ({\n\t width: _vm.optionalWidth\n\t }),\n\t attrs: {\n\t \"role\": \"document\"\n\t }\n\t }, [_vm._c('div', {\n\t staticClass: \"modal-content\"\n\t }, [_vm._t(\"modal-header\", [_vm._c('div', {\n\t staticClass: \"modal-header\"\n\t }, [_vm._c('button', {\n\t staticClass: \"close\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.close\n\t }\n\t }, [_vm._c('span', [_vm._v(\"×\")])]), _vm._v(\" \"), _vm._c('h4', {\n\t staticClass: \"modal-title\"\n\t }, [_vm._t(\"title\", [_vm._v(_vm._s(_vm.title))])], 2)])]), _vm._v(\" \"), _vm._t(\"modal-body\", [_vm._c('div', {\n\t staticClass: \"modal-body\"\n\t }, [_vm._t(\"default\")], 2)]), _vm._v(\" \"), _vm._t(\"modal-footer\", [_vm._c('div', {\n\t staticClass: \"modal-footer\"\n\t }, [_vm._c('button', {\n\t staticClass: \"btn btn-default\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.close\n\t }\n\t }, [_vm._v(_vm._s(_vm.cancelText))]), _vm._v(\" \"), _vm._c('button', {\n\t staticClass: \"btn btn-primary\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.ok\n\t }\n\t }, [_vm._v(_vm._s(_vm.okText))])])])], 2)])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-fe7d5dc8\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 128 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(129)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(130)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Navbar.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-38f0619e\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-38f0619e\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Navbar.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 129 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t props: {\n\t type: { type: String, default: 'default' },\n\t placement: { type: String, default: '' }\n\t },\n\t data: function data() {\n\t return {\n\t id: 'bs-example-navbar-collapse-1',\n\t collapsed: true,\n\t styles: {}\n\t };\n\t },\n\t\n\t computed: {\n\t slots: function slots() {\n\t return this._slotContents;\n\t }\n\t },\n\t methods: {\n\t toggleCollapse: function toggleCollapse(e) {\n\t e && e.preventDefault();\n\t this.collapsed = !this.collapsed;\n\t }\n\t },\n\t created: function created() {\n\t this._navbar = true;\n\t },\n\t mounted: function mounted() {\n\t var _this = this;\n\t\n\t try {\n\t (function () {\n\t var $dropdown = (0, _NodeList2.default)('.dropdown>[data-toggle=\"dropdown\"]', _this.$el).parent();\n\t if ($dropdown) {\n\t $dropdown.on('click', '.dropdown-toggle', function (e) {\n\t e.preventDefault();\n\t $dropdown.each(function (content) {\n\t if (content.contains(e.target)) content.classList.toggle('open');\n\t });\n\t }).on('click', '.dropdown-menu>li>a', function (e) {\n\t $dropdown.each(function (content) {\n\t if (content.contains(e.target)) content.classList.remove('open');\n\t });\n\t }).onBlur(function (e) {\n\t $dropdown.each(function (content) {\n\t if (!content.contains(e.target)) content.classList.remove('open');\n\t });\n\t });\n\t }\n\t })();\n\t } catch (ex) {\n\t console.log('error finding dropdown');\n\t }\n\t\n\t (0, _NodeList2.default)(this.$el).on('click touchstart', 'li:not(.dropdown)>a', function (e) {\n\t setTimeout(function () {\n\t _this.collapsed = true;\n\t }, 200);\n\t }).onBlur(function (e) {\n\t if (!_this.$el.contains(e.target)) {\n\t _this.collapsed = true;\n\t }\n\t });\n\t var height = this.$el.offsetHeight;\n\t if (this.placement === 'top') {\n\t document.body.style.paddingTop = height + 'px';\n\t }\n\t if (this.placement === 'bottom') {\n\t document.body.style.paddingBottom = height + 'px';\n\t }\n\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\"collapse\"]', this.$el).on('click', function (e) {\n\t return _this.toggleCollapse(e);\n\t });\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t (0, _NodeList2.default)('.dropdown', this.$el).off('click').offBlur();\n\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\"collapse\"]', this.$el).off('click');\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 130 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('nav', {\n\t class: ['navbar', 'navbar-' + _vm.type, _vm.placement === 'static' ? 'navbar-static-top' : 'navbar-fixed-' + _vm.placement]\n\t }, [_vm._c('div', {\n\t staticClass: \"container-fluid\"\n\t }, [_vm._c('div', {\n\t staticClass: \"navbar-header\"\n\t }, [(!_vm.$slots.collapse) ? _vm._c('button', {\n\t staticClass: \"navbar-toggle collapsed\",\n\t attrs: {\n\t \"type\": \"button\",\n\t \"aria-expanded\": \"false\"\n\t },\n\t on: {\n\t \"click\": _vm.toggleCollapse\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"sr-only\"\n\t }, [_vm._v(\"Toggle navigation\")]), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"icon-bar\"\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"icon-bar\"\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"icon-bar\"\n\t })]) : _vm._e(), _vm._v(\" \"), _vm._t(\"collapse\"), _vm._v(\" \"), _vm._t(\"brand\")], 2), _vm._v(\" \"), _vm._c('div', {\n\t class: ['navbar-collapse', {\n\t collapse: _vm.collapsed\n\t }]\n\t }, [_vm._c('ul', {\n\t staticClass: \"nav navbar-nav\"\n\t }, [_vm._t(\"default\")], 2), _vm._v(\" \"), (_vm.$slots.left) ? _vm._c('ul', {\n\t staticClass: \"nav navbar-nav navbar-left\"\n\t }, [_vm._t(\"left\")], 2) : _vm._e(), _vm._v(\" \"), (_vm.$slots.right) ? _vm._c('ul', {\n\t staticClass: \"nav navbar-nav navbar-right\"\n\t }, [_vm._t(\"right\")], 2) : _vm._e()])])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-38f0619e\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 131 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(132)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(133)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Option.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-42088116\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-42088116\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Option.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 132 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t\n\texports.default = {\n\t props: { value: null },\n\t data: function data() {\n\t return { loading: true };\n\t },\n\t mounted: function mounted() {\n\t if (this.$parent._select) {\n\t if (!this.$parent.options) {\n\t this.$parent.options = [];\n\t }\n\t var el = {};\n\t el[this.$parent.optionsLabel] = this.$el.innerHTML;\n\t el[this.$parent.optionsValue] = this.value;\n\t this.$parent.options.push(el);\n\t this.loading = false;\n\t } else {\n\t console.warn('options only work inside a select component');\n\t }\n\t }\n\t};\n\n/***/ },\n/* 133 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return (_vm.loading) ? _vm._c('li', [_vm._t(\"default\")], 2) : _vm._e()\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-42088116\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 134 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(135)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(137)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(138)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Panel.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-b1e0461a\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-b1e0461a\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Panel.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 135 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 137 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t header: { type: String },\n\t isOpen: { type: Boolean, default: null },\n\t type: { type: String, default: null }\n\t },\n\t data: function data() {\n\t return {\n\t open: this.isOpen\n\t };\n\t },\n\t\n\t watch: {\n\t isOpen: function isOpen(val) {\n\t this.open = val;\n\t }\n\t },\n\t computed: {\n\t inAccordion: function inAccordion() {\n\t return this.$parent && this.$parent._isAccordion;\n\t },\n\t panelType: function panelType() {\n\t return 'panel-' + (this.type || this.$parent && this.$parent.type || 'default');\n\t }\n\t },\n\t methods: {\n\t toggle: function toggle() {\n\t this.open = !this.open;\n\t if (this.inAccordion) {\n\t this.$parent.openChild(this);\n\t }\n\t },\n\t enter: function enter(el) {\n\t el.style.height = 'auto';\n\t var endWidth = getComputedStyle(el).height;\n\t el.style.height = '0px';\n\t el.offsetHeight; // force repaint\n\t el.style.height = endWidth;\n\t },\n\t afterEnter: function afterEnter(el) {\n\t el.style.height = 'auto';\n\t },\n\t beforeLeave: function beforeLeave(el) {\n\t el.style.height = getComputedStyle(el).height;\n\t el.offsetHeight; // force repaint\n\t el.style.height = '0px';\n\t }\n\t },\n\t created: function created() {\n\t if (this.isOpen === null) {\n\t this.open = !this.inAccordion;\n\t }\n\t }\n\t};\n\n/***/ },\n/* 138 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: ['panel', _vm.panelType]\n\t }, [_vm._c('div', {\n\t class: ['panel-heading', {\n\t 'accordion-toggle': _vm.inAccordion\n\t }],\n\t on: {\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.inAccordion && _vm.toggle()\n\t }\n\t }\n\t }, [_vm._t(\"header\", [_vm._c('h4', {\n\t staticClass: \"panel-title\"\n\t }, [_vm._v(_vm._s(_vm.header))])])], 2), _vm._v(\" \"), _vm._c('transition', {\n\t attrs: {\n\t \"name\": \"collapse\"\n\t },\n\t on: {\n\t \"enter\": _vm.enter,\n\t \"after-enter\": _vm.afterEnter,\n\t \"before-leave\": _vm.beforeLeave\n\t }\n\t }, [(_vm.open) ? _vm._c('div', {\n\t staticClass: \"panel-collapse\"\n\t }, [_vm._c('div', {\n\t staticClass: \"panel-body\"\n\t }, [_vm._t(\"default\")], 2)]) : _vm._e()])], 1)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-b1e0461a\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 139 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(140)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(142)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(144)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Popover.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-2465bf54\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-2465bf54\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Popover.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 140 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 142 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _popoverMixins = __webpack_require__(143);\n\t\n\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t mixins: [_popoverMixins2.default],\n\t props: {\n\t trigger: { type: String, default: 'click' }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 143 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t props: {\n\t content: { type: String },\n\t effect: { type: String, default: 'fade' },\n\t header: { type: Boolean, default: true },\n\t placement: { type: String, default: 'top' },\n\t title: { type: String },\n\t trigger: { type: String }\n\t },\n\t data: function data() {\n\t return {\n\t top: 0,\n\t left: 0,\n\t show: false\n\t };\n\t },\n\t\n\t computed: {\n\t events: function events() {\n\t return { contextmenu: ['contextmenu'], hover: ['mouseleave', 'mouseenter'], focus: ['blur', 'focus'] }[this.trigger] || ['click'];\n\t }\n\t },\n\t methods: {\n\t beforeEnter: function beforeEnter() {\n\t var _this = this;\n\t\n\t this.position();\n\t setTimeout(function () {\n\t return _this.position();\n\t }, 30);\n\t },\n\t position: function position() {\n\t var _this2 = this;\n\t\n\t this.$nextTick(function () {\n\t var popover = _this2.$refs.popover;\n\t var trigger = _this2.$refs.trigger.children[0];\n\t switch (_this2.placement) {\n\t case 'top':\n\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\n\t _this2.top = trigger.offsetTop - popover.offsetHeight;\n\t break;\n\t case 'left':\n\t _this2.left = trigger.offsetLeft - popover.offsetWidth;\n\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\n\t break;\n\t case 'right':\n\t _this2.left = trigger.offsetLeft + trigger.offsetWidth;\n\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\n\t break;\n\t case 'bottom':\n\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\n\t _this2.top = trigger.offsetTop + trigger.offsetHeight;\n\t break;\n\t default:\n\t console.warn('Wrong placement prop');\n\t }\n\t popover.style.top = _this2.top + 'px';\n\t popover.style.left = _this2.left + 'px';\n\t });\n\t },\n\t toggle: function toggle(e) {\n\t if (e && this.trigger === 'contextmenu') e.preventDefault();\n\t this.show = !this.show;\n\t if (this.show) this.beforeEnter();\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this3 = this;\n\t\n\t var trigger = this.$refs.trigger.children[0];\n\t if (!trigger) return console.error('Could not find trigger v-el in your component that uses popoverMixin.');\n\t\n\t if (this.trigger === 'focus' && !~trigger.tabIndex) {\n\t trigger = (0, _NodeList2.default)('a,input,select,textarea,button', trigger);\n\t if (!trigger.length) {\n\t return;\n\t }\n\t }\n\t this.events.forEach(function (event) {\n\t (0, _NodeList2.default)(trigger).on(event, _this3.toggle);\n\t });\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._trigger) (0, _NodeList2.default)(this._trigger).off();\n\t }\n\t};\n\n/***/ },\n/* 144 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', {\n\t ref: \"trigger\"\n\t }, [_vm._t(\"default\"), _vm._v(\" \"), _vm._c('transition', {\n\t attrs: {\n\t \"name\": _vm.effect\n\t }\n\t }, [(_vm.show) ? _vm._c('div', {\n\t ref: \"popover\",\n\t class: ['popover', _vm.placement]\n\t }, [_vm._c('div', {\n\t staticClass: \"arrow\"\n\t }), _vm._v(\" \"), (_vm.title) ? _vm._c('h3', {\n\t staticClass: \"popover-title\"\n\t }, [_vm._t(\"title\", [_vm._v(_vm._s(_vm.title))])], 2) : _vm._e(), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"popover-content\"\n\t }, [_vm._t(\"content\", [_vm._c('span', {\n\t domProps: {\n\t \"innerHTML\": _vm._s(_vm.content)\n\t }\n\t })])], 2)]) : _vm._e()])], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-2465bf54\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 145 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(146)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(147)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Progressbar.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-68aa3375\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-68aa3375\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Progressbar.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 146 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\texports.default = {\n\t props: {\n\t animated: { type: Boolean, default: false },\n\t label: { default: false },\n\t now: { required: true },\n\t striped: { type: Boolean, default: false },\n\t type: { type: String }\n\t },\n\t computed: {\n\t labelBool: function labelBool() {\n\t return _utils.coerce.boolean(this.label);\n\t },\n\t nowNum: function nowNum() {\n\t return _utils.coerce.number(this.now);\n\t }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 147 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: ['progress-bar', 'progress-bar-' + _vm.type, {\n\t active: _vm.animated,\n\t 'progress-bar-striped': _vm.striped\n\t }],\n\t style: ({\n\t width: _vm.nowNum + '%'\n\t }),\n\t domProps: {\n\t \"textContent\": _vm._s(_vm.labelBool ? _vm.nowNum + '%' : null)\n\t }\n\t })\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-68aa3375\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 148 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(149)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(151)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(152)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Radio.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-74cfd92c\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-74cfd92c\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Radio.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 149 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 151 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t button: { type: Boolean, default: false },\n\t checkedValue: { default: true },\n\t disabled: { type: Boolean, default: false },\n\t name: { type: String, default: null },\n\t readonly: { type: Boolean, default: false },\n\t type: { type: String, default: null },\n\t value: { default: false }\n\t },\n\t data: function data() {\n\t return {\n\t check: this.value\n\t };\n\t },\n\t\n\t computed: {\n\t active: function active() {\n\t return this.check === this.checkedValue;\n\t },\n\t parentValue: function parentValue() {\n\t return this._inGroup ? this.$parent.val === this.value : null;\n\t },\n\t buttonStyle: function buttonStyle() {\n\t return this.button || this._inGroup && this.$parent.buttons;\n\t },\n\t typeColor: function typeColor() {\n\t return this.type || this.$parent && this.$parent.type || 'default';\n\t }\n\t },\n\t watch: {\n\t check: function check(val) {\n\t if (this.checkedValue === val) {\n\t this.$emit('input', val);\n\t this.$emit('checked', true);\n\t if (this._inGroup) {\n\t this.$parent.val = val;\n\t }\n\t }\n\t },\n\t parentValue: function parentValue(val) {\n\t if (this.check !== val && this.checkedValue === val) {\n\t this.check = val;\n\t }\n\t },\n\t value: function value(val) {\n\t this.check = this.checkedValue === val ? val : null;\n\t }\n\t },\n\t created: function created() {\n\t var parent = this.$parent;\n\t if (parent && parent._btnGroup && !parent._checkboxGroup) {\n\t this._inGroup = true;\n\t parent._radioGroup = true;\n\t }\n\t if (this.$parent._radioGroup) {\n\t if (this.$parent.val) {\n\t this.check = this.$parent.val === this.checkedValue;\n\t } else if (this.check) {\n\t this.$parent.val = this.checkedValue;\n\t }\n\t }\n\t },\n\t\n\t methods: {\n\t focus: function focus() {\n\t this.$refs.input.focus();\n\t },\n\t toggle: function toggle() {\n\t if (this.disabled) {\n\t return;\n\t }\n\t this.focus();\n\t if (this.readonly) {\n\t return;\n\t }\n\t this.check = this.checkedValue;\n\t if (this._inGroup) {\n\t this.$parent.val = this.checkedValue;\n\t }\n\t }\n\t }\n\t};\n\n/***/ },\n/* 152 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c(_vm.buttonStyle ? 'label' : 'div', {\n\t tag: \"div\",\n\t class: [(_vm.buttonStyle ? 'btn btn-' + _vm.typeColor : 'radio ' + _vm.typeColor), {\n\t active: _vm.active,\n\t disabled: _vm.disabled,\n\t readonly: _vm.readonly\n\t }],\n\t on: {\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }\n\t }\n\t }, [(_vm.buttonStyle) ? [_vm._c('input', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (!_vm.readonly),\n\t expression: \"!readonly\"\n\t }, {\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.check),\n\t expression: \"check\"\n\t }],\n\t ref: \"input\",\n\t attrs: {\n\t \"type\": \"radio\",\n\t \"autocomplete\": \"off\",\n\t \"name\": _vm.name,\n\t \"readonly\": _vm.readonly,\n\t \"disabled\": _vm.disabled\n\t },\n\t domProps: {\n\t \"value\": _vm.checkedValue,\n\t \"checked\": _vm._q(_vm.check, _vm.checkedValue)\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.check = _vm.checkedValue\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._t(\"default\")] : _vm._c('label', {\n\t staticClass: \"open\"\n\t }, [_vm._c('input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.check),\n\t expression: \"check\"\n\t }],\n\t ref: \"input\",\n\t attrs: {\n\t \"type\": \"radio\",\n\t \"autocomplete\": \"off\",\n\t \"name\": _vm.name,\n\t \"readonly\": _vm.readonly,\n\t \"disabled\": _vm.disabled\n\t },\n\t domProps: {\n\t \"value\": _vm.checkedValue,\n\t \"checked\": _vm._q(_vm.check, _vm.checkedValue)\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.check = _vm.checkedValue\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"icon dropdown-toggle\",\n\t class: [_vm.active ? 'btn-' + _vm.typeColor : '', {\n\t bg: _vm.typeColor === 'default'\n\t }]\n\t }), _vm._v(\" \"), (_vm.active && _vm.typeColor === 'default') ? _vm._c('span', {\n\t staticClass: \"icon\"\n\t }) : _vm._e(), _vm._v(\" \"), _vm._t(\"default\")], 2)], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-74cfd92c\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 153 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(154)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(156)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(157)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Select.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t__vue_options__._scopeId = \"data-v-e514dbc6\"\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-e514dbc6\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-e514dbc6\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Select.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 154 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 156 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar _ClickOutside = __webpack_require__(66);\n\t\n\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\tvar timeout = {};\n\texports.default = {\n\t directives: {\n\t ClickOutside: _ClickOutside2.default\n\t },\n\t props: {\n\t clearButton: { type: Boolean, default: false },\n\t closeOnSelect: { type: Boolean, default: false },\n\t disabled: { type: Boolean, default: false },\n\t lang: { type: String, default: navigator.language },\n\t limit: { type: Number, default: 1024 },\n\t minSearch: { type: Number, default: 0 },\n\t multiple: { type: Boolean, default: false },\n\t name: { type: String, default: null },\n\t options: { type: Array, default: function _default() {\n\t return [];\n\t }\n\t },\n\t optionsLabel: { type: String, default: 'label' },\n\t optionsValue: { type: String, default: 'value' },\n\t parent: { default: true },\n\t placeholder: { type: String, default: null },\n\t readonly: { type: Boolean, default: null },\n\t required: { type: Boolean, default: null },\n\t search: { type: Boolean, default: false },\n\t searchText: { type: String, default: null },\n\t url: { type: String, default: null },\n\t value: null\n\t },\n\t data: function data() {\n\t return {\n\t list: [],\n\t loading: null,\n\t searchValue: null,\n\t show: false,\n\t notify: false,\n\t val: null,\n\t valid: null\n\t };\n\t },\n\t\n\t computed: {\n\t canSearch: function canSearch() {\n\t return this.minSearch ? this.list.length >= this.minSearch : this.search;\n\t },\n\t classes: function classes() {\n\t return [{ open: this.show, disabled: this.disabled }, this.class, this.isLi ? 'dropdown' : this.inInput ? 'input-group-btn' : 'btn-group'];\n\t },\n\t filteredOptions: function filteredOptions() {\n\t var _this = this;\n\t\n\t var search = (this.searchValue || '').toLowerCase();\n\t return !search ? this.list : this.list.filter(function (el) {\n\t return ~el[_this.optionsLabel].toLowerCase().search(search);\n\t });\n\t },\n\t hasParent: function hasParent() {\n\t return this.parent instanceof Array ? this.parent.length : this.parent;\n\t },\n\t inInput: function inInput() {\n\t return this.$parent._input;\n\t },\n\t isLi: function isLi() {\n\t return this.$parent._navbar || this.$parent.menu || this.$parent._tabset;\n\t },\n\t limitText: function limitText() {\n\t return this.text.limit.replace('{{limit}}', this.limit);\n\t },\n\t selected: function selected() {\n\t var _this2 = this;\n\t\n\t if (this.list.length === 0) {\n\t return '';\n\t }\n\t var sel = this.values.map(function (val) {\n\t return (_this2.list.find(function (o) {\n\t return o[_this2.optionsValue] === val;\n\t }) || {})[_this2.optionsLabel];\n\t }).filter(function (val) {\n\t return val !== undefined;\n\t });\n\t this.$emit('selected', sel);\n\t return sel.join(', ');\n\t },\n\t showPlaceholder: function showPlaceholder() {\n\t return this.values.length === 0 || !this.hasParent ? this.placeholder || this.text.notSelected : null;\n\t },\n\t text: function text() {\n\t return (0, _utils.translations)(this.lang);\n\t },\n\t values: function values() {\n\t return this.val instanceof Array ? this.val : ~[null, undefined].indexOf(this.val) ? [] : [this.val];\n\t },\n\t valOptions: function valOptions() {\n\t var _this3 = this;\n\t\n\t return this.list.map(function (el) {\n\t return el[_this3.optionsValue];\n\t });\n\t }\n\t },\n\t watch: {\n\t options: function options(_options) {\n\t if (_options instanceof Array) this.setOptions(_options);\n\t },\n\t show: function show(val) {\n\t if (val) {\n\t this.$refs.search ? this.$refs.search.focus() : this.$refs.btn.focus();\n\t // onBlur(this.$refs.select, e => { this.show = false })\n\t } else {\n\t // offBlur(this.$refs.select)\n\t }\n\t },\n\t url: function url() {\n\t this.urlChanged();\n\t },\n\t valid: function valid(val, old) {\n\t this.$emit('isvalid', val);\n\t this.$emit(!val ? 'invalid' : 'valid');\n\t if (val !== old && this._parent) this._parent.validate();\n\t },\n\t value: function value(val, old) {\n\t if (val !== old) {\n\t this.val = val;\n\t }\n\t },\n\t val: function val(_val, old) {\n\t var _this4 = this;\n\t\n\t if (_val === undefined) {\n\t this.val = _val = null;\n\t }\n\t if (_val !== old) {\n\t this.$emit('change', _val);\n\t this.$emit('input', _val);\n\t }\n\t if (_val instanceof Array && _val.length > this.limit) {\n\t this.val = _val.slice(0, this.limit);\n\t this.notify = true;\n\t if (timeout.limit) clearTimeout(timeout.limit);\n\t timeout.limit = setTimeout(function () {\n\t timeout.limit = false;\n\t _this4.notify = false;\n\t }, 1500);\n\t }\n\t this.valid = this.validate();\n\t }\n\t },\n\t methods: {\n\t close: function close() {\n\t this.show = false;\n\t },\n\t checkData: function checkData() {\n\t if (this.multiple) {\n\t if (this.limit < 1) {\n\t this.limit = 1;\n\t }\n\t if (!(this.val instanceof Array)) {\n\t this.val = this.val === null || this.val === undefined ? [] : [this.val];\n\t }\n\t var values = this.valOptions;\n\t this.val = this.val.filter(function (el) {\n\t return ~values.indexOf(el);\n\t });\n\t if (this.values.length > this.limit) {\n\t this.val = this.val.slice(0, this.limit);\n\t }\n\t } else {\n\t if (!~this.valOptions.indexOf(this.val)) {\n\t this.val = null;\n\t }\n\t }\n\t },\n\t clear: function clear() {\n\t if (this.disabled || this.readonly) {\n\t return;\n\t }\n\t this.val = this.val instanceof Array ? [] : null;\n\t this.toggle();\n\t },\n\t clearSearch: function clearSearch() {\n\t this.searchValue = '';\n\t this.$refs.search.focus();\n\t },\n\t isSelected: function isSelected(v) {\n\t return this.values.indexOf(v) > -1;\n\t },\n\t select: function select(v) {\n\t if (this.val instanceof Array) {\n\t var newVal = this.val.slice(0);\n\t if (~newVal.indexOf(v)) {\n\t newVal.splice(newVal.indexOf(v), 1);\n\t } else {\n\t newVal.push(v);\n\t }\n\t this.val = newVal;\n\t if (this.closeOnSelect) {\n\t this.toggle();\n\t }\n\t } else {\n\t this.val = v;\n\t this.toggle();\n\t }\n\t },\n\t setOptions: function setOptions(options) {\n\t var _this5 = this;\n\t\n\t this.list = options.map(function (el) {\n\t if (el instanceof Object) {\n\t return el;\n\t }\n\t var obj = {};\n\t obj[_this5.optionsLabel] = el;\n\t obj[_this5.optionsValue] = el;\n\t return obj;\n\t });\n\t this.$emit('options', this.list);\n\t },\n\t toggle: function toggle() {\n\t this.show = !this.show;\n\t if (!this.show) this.$refs.btn.focus();\n\t },\n\t urlChanged: function urlChanged() {\n\t var _this6 = this;\n\t\n\t if (!this.url || !this.$http) {\n\t return;\n\t }\n\t this.loading = true;\n\t this.$http.get(this.url).then(function (response) {\n\t var data = response.data instanceof Array ? response.data : [];\n\t try {\n\t data = JSON.parse(data);\n\t } catch (e) {}\n\t _this6.setOptions(data);\n\t _this6.loading = false;\n\t _this6.checkData();\n\t }, function (response) {\n\t _this6.loading = false;\n\t });\n\t },\n\t validate: function validate() {\n\t return !this.required ? true : this.val instanceof Array ? this.val.length > 0 : this.val !== null;\n\t }\n\t },\n\t created: function created() {\n\t this.setOptions(this.options);\n\t this.val = this.value;\n\t this._select = true;\n\t if (this.val === undefined || !this.parent) {\n\t this.val = null;\n\t }\n\t if (!this.multiple && this.val instanceof Array) {\n\t this.val = this.val[0];\n\t }\n\t this.checkData();\n\t if (this.url) this.urlChanged();\n\t var parent = this.$parent;\n\t while (parent && !parent._formValidator) {\n\t parent = parent.$parent;\n\t }\n\t if (parent && parent._formValidator) {\n\t parent.children.push(this);\n\t this._parent = parent;\n\t }\n\t },\n\t mounted: function mounted() {\n\t if (this._parent) this._parent.children.push(this);\n\t this.setOptions(this.options);\n\t this.val = this.value;\n\t this.checkData();\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._parent) {\n\t var index = this._parent.children.indexOf(this);\n\t this._parent.children.splice(index, 1);\n\t }\n\t }\n\t};\n\n/***/ },\n/* 157 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t directives: [{\n\t name: \"click-outside\",\n\t rawName: \"v-click-outside\",\n\t value: (_vm.close),\n\t expression: \"close\"\n\t }],\n\t ref: \"select\",\n\t class: _vm.classes\n\t }, [_vm._c('div', {\n\t ref: \"btn\",\n\t staticClass: \"form-control dropdown-toggle\",\n\t attrs: {\n\t \"tabindex\": \"1\",\n\t \"disabled\": _vm.disabled || !_vm.hasParent,\n\t \"readonly\": _vm.readonly\n\t },\n\t on: {\n\t \"blur\": function($event) {\n\t _vm.canSearch ? null : _vm.close()\n\t },\n\t \"click\": function($event) {\n\t _vm.toggle()\n\t },\n\t \"keydown\": [function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t $event.stopPropagation();\n\t $event.preventDefault();\n\t _vm.close($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"space\", 32)) { return; }\n\t $event.stopPropagation();\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"enter\", 13)) { return; }\n\t $event.stopPropagation();\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }]\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"btn-content\",\n\t domProps: {\n\t \"innerHTML\": _vm._s(_vm.loading ? _vm.text.loading : _vm.showPlaceholder || _vm.selected)\n\t }\n\t }), _vm._v(\" \"), (_vm.clearButton && _vm.values.length) ? _vm._c('span', {\n\t staticClass: \"close\",\n\t on: {\n\t \"click\": function($event) {\n\t _vm.clear()\n\t }\n\t }\n\t }, [_vm._v(\"×\")]) : _vm._e()]), _vm._v(\" \"), _vm._c('select', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.val),\n\t expression: \"val\"\n\t }],\n\t ref: \"sel\",\n\t staticClass: \"secret\",\n\t attrs: {\n\t \"name\": _vm.name,\n\t \"multiple\": _vm.multiple,\n\t \"required\": _vm.required,\n\t \"readonly\": _vm.readonly,\n\t \"disabled\": _vm.disabled\n\t },\n\t on: {\n\t \"change\": function($event) {\n\t _vm.val = Array.prototype.filter.call($event.target.options, function(o) {\n\t return o.selected\n\t }).map(function(o) {\n\t var val = \"_value\" in o ? o._value : o.value;\n\t return val\n\t })[0]\n\t }\n\t }\n\t }, [(_vm.required) ? _vm._c('option', {\n\t attrs: {\n\t \"value\": \"\"\n\t }\n\t }) : _vm._e(), _vm._v(\" \"), _vm._l((_vm.list), function(option) {\n\t return _vm._c('option', {\n\t domProps: {\n\t \"value\": option[_vm.optionsValue]\n\t }\n\t }, [_vm._v(_vm._s(option[_vm.optionsLabel]))])\n\t })], 2), _vm._v(\" \"), _vm._c('ul', {\n\t staticClass: \"dropdown-menu\"\n\t }, [(_vm.list.length) ? [(_vm.canSearch) ? _vm._c('li', {\n\t staticClass: \"bs-searchbox\"\n\t }, [_vm._c('input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.searchValue),\n\t expression: \"searchValue\"\n\t }],\n\t ref: \"search\",\n\t staticClass: \"form-control\",\n\t attrs: {\n\t \"type\": \"text\",\n\t \"placeholder\": _vm.searchText || _vm.text.search,\n\t \"autocomplete\": \"off\"\n\t },\n\t domProps: {\n\t \"value\": _vm._s(_vm.searchValue)\n\t },\n\t on: {\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t _vm.close($event)\n\t },\n\t \"input\": function($event) {\n\t if ($event.target.composing) { return; }\n\t _vm.searchValue = $event.target.value\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.searchValue),\n\t expression: \"searchValue\"\n\t }],\n\t staticClass: \"close\",\n\t on: {\n\t \"click\": _vm.clearSearch\n\t }\n\t }, [_vm._v(\"×\")])]) : _vm._e(), _vm._v(\" \"), (_vm.required && !_vm.clearButton) ? _vm._c('li', [_vm._c('a', {\n\t on: {\n\t \"mousedown\": function($event) {\n\t $event.preventDefault();\n\t _vm.clear() && _vm.close()\n\t }\n\t }\n\t }, [_vm._v(_vm._s(_vm.placeholder || _vm.text.notSelected))])]) : _vm._e(), _vm._v(\" \"), _vm._l((_vm.filteredOptions), function(option) {\n\t return _vm._c('li', {\n\t attrs: {\n\t \"id\": option[_vm.optionsValue]\n\t }\n\t }, [_vm._c('a', {\n\t on: {\n\t \"mousedown\": function($event) {\n\t $event.preventDefault();\n\t _vm.select(option[_vm.optionsValue])\n\t }\n\t }\n\t }, [_vm._c('span', {\n\t domProps: {\n\t \"innerHTML\": _vm._s(option[_vm.optionsLabel])\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.isSelected(option[_vm.optionsValue])),\n\t expression: \"isSelected(option[optionsValue])\"\n\t }],\n\t staticClass: \"glyphicon glyphicon-ok check-mark\"\n\t })])])\n\t })] : _vm._e(), _vm._v(\" \"), _vm._t(\"default\"), _vm._v(\" \"), (_vm.notify && !_vm.closeOnSelect) ? _vm._c('transition', {\n\t attrs: {\n\t \"name\": \"fadein\"\n\t }\n\t }, [_vm._c('div', {\n\t staticClass: \"notify in\"\n\t }, [_vm._v(_vm._s(_vm.limitText))])]) : _vm._e()], 2), _vm._v(\" \"), (_vm.notify && _vm.closeOnSelect) ? _vm._c('transition', {\n\t attrs: {\n\t \"name\": \"fadein\"\n\t }\n\t }, [_vm._c('div', {\n\t staticClass: \"notify out\"\n\t }, [_vm._c('div', [_vm._v(_vm._s(_vm.limitText))])])]) : _vm._e()], 1)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-e514dbc6\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 158 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(159)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(160)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Slider.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-32185b82\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-32185b82\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Slider.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 159 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t\n\texports.default = {\n\t computed: {\n\t index: function index() {\n\t return this.$parent.$children.indexOf(this);\n\t },\n\t show: function show() {\n\t return this.$parent.index === this.index;\n\t }\n\t },\n\t mounted: function mounted() {\n\t if (this.$parent.indicator_list) {\n\t this.$parent.indicator_list.push(this.index);\n\t }\n\t\n\t if (this.index === 0) {\n\t this.$el.classList.add('active');\n\t }\n\t }\n\t};\n\n/***/ },\n/* 160 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t staticClass: \"item\"\n\t }, [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-32185b82\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 161 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(162)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(164)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(165)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Spinner.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-8b298e70\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-8b298e70\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Spinner.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 162 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 164 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar MIN_WAIT = 500; // in ms\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t fixed: { type: Boolean, default: false },\n\t global: { type: Boolean, default: false },\n\t size: { type: String, default: 'md' },\n\t text: { type: String, default: '' },\n\t value: { default: false }\n\t },\n\t data: function data() {\n\t return {\n\t active: this.value,\n\t locked: false\n\t };\n\t },\n\t\n\t computed: {\n\t spinnerSize: function spinnerSize() {\n\t return 'spinner-' + (this.size ? this.size : 'sm');\n\t }\n\t },\n\t watch: {\n\t active: function active(val, old) {\n\t if (val !== old) this.$emit('input', val);\n\t },\n\t value: function value(val, old) {\n\t if (val !== old) {\n\t this[val ? 'show' : 'hide']();\n\t }\n\t }\n\t },\n\t methods: {\n\t hide: function hide() {\n\t var delay = 0;\n\t this.active = false;\n\t },\n\t show: function show(options) {\n\t if (options) {\n\t if (options.text) {\n\t this.text = options.text;\n\t }\n\t if (options.size) {\n\t this.size = options.size;\n\t }\n\t if (options.fixed) {\n\t this.fixed = options.fixed;\n\t }\n\t }\n\t // block scrolling when spinner is on\n\t this._body.style.overflowY = 'hidden';\n\t // activate spinner\n\t this._started = new Date();\n\t this.active = true;\n\t this.locked = true;\n\t this._unlock();\n\t }\n\t },\n\t created: function created() {\n\t this._body = document.body;\n\t this._bodyOverflow = document.body.style.overflowY;\n\t this._unlock = (0, _utils.delayer)(function () {\n\t this.locked = false;\n\t this._body.style.overflowY = this._bodyOverflow;\n\t }, MIN_WAIT);\n\t if (this.global) {\n\t if (!this.$root._globalSpinner) {\n\t this.$root._globalSpinner = true;\n\t var self = this;\n\t this._global = {\n\t hide: function hide() {\n\t self.hide();\n\t },\n\t show: function show() {\n\t self.show();\n\t }\n\t };\n\t this.$root.$on('spinner::show', this._global.show);\n\t this.$root.$on('spinner::hide', this._global.hide);\n\t }\n\t }\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._global) {\n\t this.$root.$off('spinner::show', this._global.show);\n\t this.$root.$off('spinner::hide', this._global.hide);\n\t delete this.$root._globalSpinner;\n\t }\n\t clearTimeout(this._spinnerAnimation);\n\t this._body.style.overflowY = this._bodyOverflow;\n\t }\n\t};\n\n/***/ },\n/* 165 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.active || _vm.locked),\n\t expression: \"active||locked\"\n\t }],\n\t class: ['spinner spinner-gritcode', _vm.spinnerSize, {\n\t 'spinner-fixed': _vm.fixed\n\t }]\n\t }, [_vm._c('div', {\n\t staticClass: \"spinner-wrapper\"\n\t }, [_vm._c('div', {\n\t staticClass: \"spinner-circle\"\n\t }), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"spinner-text\"\n\t }, [_vm._v(_vm._s(_vm.text))])])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-8b298e70\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 166 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(167)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(168)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Tab.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-0985e878\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-0985e878\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Tab.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 167 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t disabled: { type: Boolean, default: false },\n\t header: { type: String }\n\t },\n\t data: function data() {\n\t return {\n\t fadein: false\n\t };\n\t },\n\t\n\t computed: {\n\t active: function active() {\n\t var _this = this;\n\t\n\t var active = !this._tabs || this._tabs.show === this;\n\t this.fadein = false;\n\t if (active) {\n\t setTimeout(function () {\n\t _this.fadein = true;\n\t }, 0);\n\t }\n\t return active;\n\t },\n\t index: function index() {\n\t return this._tabs.tabs.indexOf(this);\n\t },\n\t transition: function transition() {\n\t return this._tabs ? this._tabs.effect : null;\n\t }\n\t },\n\t created: function created() {\n\t this._isTab = true;\n\t var tabs = this;\n\t while (!this._tabs && tabs.$parent) {\n\t if (tabs._isTabGroup) {\n\t tabs.tabs.push(this);\n\t this._tabGroup = tabs;\n\t }\n\t if (tabs._isTabs) {\n\t tabs.tabs.push(this);\n\t this._tabs = tabs;\n\t if (!this._tabGroup) tabs.headers.push(this);\n\t }\n\t tabs = tabs.$parent;\n\t }\n\t if (!this._tabs) throw Error('tab depend on tabs.');\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t var _this2 = this;\n\t\n\t if (this._tabGroup) {\n\t this._tabGroup.tabs = this._tabGroup.tabs.filter(function (el) {\n\t return el !== _this2;\n\t });\n\t }\n\t if (this._tabs) {\n\t this._tabs.tabs = this._tabs.tabs.filter(function (el) {\n\t return el !== _this2;\n\t });\n\t }\n\t if (this._tabs) {\n\t if (this._tabs.active === this.index) {\n\t this._tabs.index = 0;\n\t }\n\t if (this._ingroup) {\n\t var id = this.$parent.tabs.indexOf(this);\n\t if (~id) this.$parent.tabs.splice(id, 1);\n\t }\n\t }\n\t if (this._tabs) {\n\t var _id = this._tabs.tabs.indexOf(this);\n\t if (~_id) this._tabs.tabs.splice(_id, 1);\n\t }\n\t }\n\t};\n\n/***/ },\n/* 168 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t ref: \"panel\",\n\t class: ['tab-pane', {\n\t 'active fade': _vm.active,\n\t 'in': _vm.fadein\n\t }],\n\t attrs: {\n\t \"role\": \"tabpanel\"\n\t }\n\t }, [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-0985e878\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 169 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(170)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(172)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(173)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\TabGroup.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-55faf3cb\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-55faf3cb\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] TabGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 170 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 172 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t disabled: { type: Boolean, default: false },\n\t header: { type: String }\n\t },\n\t data: function data() {\n\t return {\n\t show: false,\n\t tabs: []\n\t };\n\t },\n\t\n\t computed: {\n\t active: function active() {\n\t return ~this.tabs.indexOf(this._tabs.show);\n\t }\n\t },\n\t methods: {\n\t blur: function blur() {\n\t this.show = false;\n\t },\n\t toggle: function toggle() {\n\t this.show = !this.show;\n\t }\n\t },\n\t created: function created() {\n\t this._isTabGroup = true;\n\t if (this.$parent) {\n\t if (this.$parent._isTabGroup) throw Error('Can\\'t nest tab-groups.');\n\t if (!this.$parent._isTabs) throw Error('tab-group depend on tabs.');\n\t }\n\t this._tabs = this.$parent;\n\t this._tabs.headers.push(this);\n\t }\n\t};\n\n/***/ },\n/* 173 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-55faf3cb\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 174 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(175)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(177)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(178)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Tabs.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-70100ddf\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-70100ddf\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Tabs.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 175 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 177 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar _Dropdown = __webpack_require__(105);\n\t\n\tvar _Dropdown2 = _interopRequireDefault(_Dropdown);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t components: {\n\t dropdown: _Dropdown2.default\n\t },\n\t props: {\n\t // effect: {type: String, default: 'fadein'},\n\t justified: false,\n\t navStyle: { type: String, default: null },\n\t value: { type: Number, default: 0 }\n\t },\n\t data: function data() {\n\t var index = this.value || 0;\n\t return {\n\t index: index,\n\t headers: [],\n\t tabs: []\n\t };\n\t },\n\t\n\t watch: {\n\t index: function index(val) {\n\t this.$emit('active', val);\n\t this.$emit('input', val);\n\t },\n\t value: function value(val) {\n\t this.index = val;\n\t }\n\t },\n\t computed: {\n\t navStyleClass: function navStyleClass() {\n\t return ['nav', ~['pills', 'stacked'].indexOf(this.navStyle) ? 'nav-' + this.navStyle : 'nav-tabs', {\n\t 'nav-justified': _utils.coerce.boolean(this.justified),\n\t 'nav-pills': this.navStyle === 'stacked'\n\t }];\n\t },\n\t show: function show() {\n\t return this.tabs[this.index] || this.tabs[0];\n\t }\n\t },\n\t methods: {\n\t select: function select(tab) {\n\t if (!tab.disabled) {\n\t this.index = this.tabs.indexOf(tab);\n\t }\n\t }\n\t },\n\t created: function created() {\n\t this._isTabs = true;\n\t }\n\t};\n\n/***/ },\n/* 178 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t attrs: {\n\t \"tabs\": \"\"\n\t }\n\t }, [_vm._c('ul', {\n\t class: _vm.navStyleClass,\n\t attrs: {\n\t \"role\": \"tablist\"\n\t }\n\t }, [_vm._l((_vm.headers), function(header) {\n\t return [(header._isTab) ? _vm._c('li', {\n\t class: {\n\t active: header.active, disabled: header.disabled\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.select(header)\n\t }\n\t }\n\t }, [_vm._t(\"header\", [_vm._c('a', {\n\t attrs: {\n\t \"href\": \"#\"\n\t },\n\t domProps: {\n\t \"innerHTML\": _vm._s(header.header)\n\t }\n\t })])], 2) : _vm._e(), _vm._v(\" \"), (header._isTabGroup) ? _vm._c('dropdown', {\n\t class: {\n\t active: header.active\n\t },\n\t attrs: {\n\t \"text\": header.header,\n\t \"disabled\": header.disabled\n\t }\n\t }, _vm._l((header.tabs), function(tab) {\n\t return _vm._c('li', {\n\t class: {\n\t disabled: tab.disabled\n\t }\n\t }, [_vm._c('a', {\n\t attrs: {\n\t \"href\": \"#\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.select(tab)\n\t }\n\t }\n\t }, [_vm._v(_vm._s(tab.header))])])\n\t })) : _vm._e()]\n\t })], 2), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"tab-content\"\n\t }, [_vm._t(\"default\")], 2)])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-70100ddf\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 179 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(180)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(181)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\ToggleButton.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-f034a5f2\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-f034a5f2\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] ToggleButton.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 180 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\texports.default = {\n\t props: {\n\t disabled: { default: null },\n\t falseType: { default: null },\n\t name: null,\n\t readonly: { default: null },\n\t trueType: { default: 'primary' },\n\t value: false\n\t },\n\t data: function data() {\n\t return {\n\t active: _utils.coerce.boolean(this.value),\n\t types: {\n\t danger: 'btn-danger',\n\t info: 'btn-info',\n\t primary: 'btn-primary',\n\t success: 'btn-success',\n\t warning: 'btn-warning'\n\t }\n\t };\n\t },\n\t\n\t watch: {\n\t active: function active(val, old) {\n\t if (val !== old) {\n\t this.$emit('changed', val);\n\t this.$emit(val ? 'enabled' : 'disabled');\n\t this.$emit('input', val);\n\t }\n\t },\n\t value: function value(val, old) {\n\t if (val !== old) {\n\t this.active = _utils.coerce.boolean(this.value);\n\t }\n\t }\n\t },\n\t computed: {\n\t boolDisabled: function boolDisabled() {\n\t return _utils.coerce.boolean(this.disabled);\n\t },\n\t boolReadonly: function boolReadonly() {\n\t return _utils.coerce.boolean(this.readonly);\n\t },\n\t type: function type() {\n\t return this.types[this.value ? this.trueType : this.falseType] || 'btn-default';\n\t }\n\t },\n\t methods: {\n\t toggle: function toggle() {\n\t if (this.boolDisabled || this.boolReadonly) {\n\t return;\n\t }\n\t this.active = !this.active;\n\t }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 181 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('a', {\n\t class: ['btn', _vm.type, {\n\t readonly: _vm.boolReadonly\n\t }],\n\t attrs: {\n\t \"href\": \"javascript:void(0)\",\n\t \"disabled\": _vm.boolDisabled\n\t },\n\t on: {\n\t \"click\": _vm.toggle\n\t }\n\t }, [_vm._c('span', {\n\t class: ['glyphicon', 'glyphicon-' + (_vm.value ? 'ok' : 'remove')]\n\t }), _vm._v(\" \"), _vm._t(\"default\"), _vm._v(\" \"), (_vm.name) ? _vm._c('input', {\n\t attrs: {\n\t \"type\": \"hidden\",\n\t \"name\": _vm.name\n\t },\n\t domProps: {\n\t \"value\": _vm.active ? 1 : 0\n\t }\n\t }) : _vm._e()], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-f034a5f2\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 182 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(183)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(185)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(186)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Tooltip.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-48fb51b2\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-48fb51b2\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Tooltip.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 183 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 185 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _popoverMixins = __webpack_require__(143);\n\t\n\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t mixins: [_popoverMixins2.default],\n\t props: {\n\t effect: { type: String, default: 'scale' },\n\t trigger: { type: String, default: 'hover' }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 186 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', {\n\t ref: \"trigger\"\n\t }, [_vm._t(\"default\"), _vm._v(\" \"), _vm._c('transition', {\n\t attrs: {\n\t \"name\": _vm.effect\n\t }\n\t }, [(_vm.show) ? _vm._c('div', {\n\t ref: \"popover\",\n\t class: ['tooltip', _vm.placement]\n\t }, [_vm._c('div', {\n\t staticClass: \"tooltip-arrow\"\n\t }), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"tooltip-inner\"\n\t }, [_vm._t(\"content\", [_vm._c('div', {\n\t domProps: {\n\t \"innerHTML\": _vm._s(_vm.content)\n\t }\n\t })])], 2)]) : _vm._e()])], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-48fb51b2\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 187 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(188)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(190)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(206)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Typeahead.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-5b5f5e94\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-5b5f5e94\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Typeahead.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 188 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 190 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof2 = __webpack_require__(191);\n\t\n\tvar _typeof3 = _interopRequireDefault(_typeof2);\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar DELAY = 300; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t async: { type: String },\n\t data: { type: Array },\n\t delay: { type: Number, default: DELAY },\n\t asyncKey: { type: String, default: null },\n\t limit: { type: Number, default: 8 },\n\t matchCase: { type: Boolean, default: false },\n\t matchStart: { type: Boolean, default: false },\n\t onHit: {\n\t type: Function,\n\t default: function _default(item) {\n\t this.reset();\n\t this.value = item;\n\t }\n\t },\n\t placeholder: { type: String },\n\t template: { type: String },\n\t value: { type: String, default: '' }\n\t },\n\t data: function data() {\n\t return {\n\t showDropdown: false,\n\t noResults: true,\n\t current: 0,\n\t items: [],\n\t val: ''\n\t };\n\t },\n\t\n\t computed: {\n\t templateHtml: function templateHtml() {\n\t return typeof this.template === 'string' ? '' + this.template + '' : null;\n\t },\n\t tmpl: function tmpl() {\n\t return this._tmpl;\n\t }\n\t },\n\t watch: {\n\t val: function val(_val, old) {\n\t this.$emit('input', _val);\n\t if (_val !== old) this._update();\n\t },\n\t value: function value(val) {\n\t if (this.val !== val) {\n\t this.val = val;\n\t }\n\t }\n\t },\n\t methods: {\n\t setItems: function setItems(data) {\n\t var _this = this;\n\t\n\t if (this.async) {\n\t this.items = this.asyncKey ? data[this.asyncKey] : data;\n\t this.items = this.items.slice(0, this.limit);\n\t } else {\n\t this.items = (data || []).filter(function (value) {\n\t if ((typeof value === 'undefined' ? 'undefined' : (0, _typeof3.default)(value)) === 'object') {\n\t return true;\n\t }\n\t value = _this.matchCase ? value : value.toLowerCase();\n\t var query = _this.matchCase ? _this.val : _this.val.toLowerCase();\n\t return _this.matchStart ? value.indexOf(query) === 0 : value.indexOf(query) !== -1;\n\t }).slice(0, this.limit);\n\t }\n\t this.showDropdown = this.items.length > 0;\n\t },\n\t reset: function reset() {\n\t this.items = [];\n\t this.val = '';\n\t this.loading = false;\n\t this.showDropdown = false;\n\t },\n\t setActive: function setActive(index) {\n\t this.current = index;\n\t },\n\t isActive: function isActive(index) {\n\t return this.current === index;\n\t },\n\t hit: function hit(e) {\n\t e.preventDefault();\n\t this.onHit(this.items[this.current], this);\n\t },\n\t up: function up() {\n\t if (this.current > 0) this.current--;\n\t },\n\t down: function down() {\n\t if (this.current < this.items.length - 1) this.current++;\n\t }\n\t },\n\t created: function created() {\n\t this.val = this.value;\n\t this._tmpl = {\n\t template: this.templateHtml || '',\n\t props: {\n\t item: { default: null }\n\t }\n\t };\n\t this._update = (0, _utils.delayer)(function () {\n\t var _this2 = this;\n\t\n\t if (!this.val) {\n\t this.reset();\n\t return false;\n\t }\n\t if (this.async) {\n\t (0, _utils.getJSON)(this.async + this.val).then(function (data) {\n\t _this2.setItems(data);\n\t });\n\t } else if (this.data) {\n\t this.setItems(this.data);\n\t }\n\t }, 'delay', DELAY);\n\t this._update();\n\t }\n\t};\n\n/***/ },\n/* 191 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\texports.__esModule = true;\n\t\n\tvar _iterator = __webpack_require__(20);\n\t\n\tvar _iterator2 = _interopRequireDefault(_iterator);\n\t\n\tvar _symbol = __webpack_require__(192);\n\t\n\tvar _symbol2 = _interopRequireDefault(_symbol);\n\t\n\tvar _typeof = typeof _symbol2.default === \"function\" && typeof _iterator2.default === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj; };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = typeof _symbol2.default === \"function\" && _typeof(_iterator2.default) === \"symbol\" ? function (obj) {\n\t return typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n\t} : function (obj) {\n\t return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n\t};\n\n/***/ },\n/* 192 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(193), __esModule: true };\n\n/***/ },\n/* 193 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(194);\n\t__webpack_require__(203);\n\t__webpack_require__(204);\n\t__webpack_require__(205);\n\tmodule.exports = __webpack_require__(7).Symbol;\n\n/***/ },\n/* 194 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// ECMAScript 6 symbols shim\n\tvar global = __webpack_require__(6)\n\t , has = __webpack_require__(29)\n\t , DESCRIPTORS = __webpack_require__(15)\n\t , $export = __webpack_require__(5)\n\t , redefine = __webpack_require__(28)\n\t , META = __webpack_require__(195).KEY\n\t , $fails = __webpack_require__(16)\n\t , shared = __webpack_require__(43)\n\t , setToStringTag = __webpack_require__(47)\n\t , uid = __webpack_require__(44)\n\t , wks = __webpack_require__(48)\n\t , wksExt = __webpack_require__(55)\n\t , wksDefine = __webpack_require__(196)\n\t , keyOf = __webpack_require__(197)\n\t , enumKeys = __webpack_require__(198)\n\t , isArray = __webpack_require__(201)\n\t , anObject = __webpack_require__(12)\n\t , toIObject = __webpack_require__(36)\n\t , toPrimitive = __webpack_require__(18)\n\t , createDesc = __webpack_require__(19)\n\t , _create = __webpack_require__(32)\n\t , gOPNExt = __webpack_require__(60)\n\t , $GOPD = __webpack_require__(202)\n\t , $DP = __webpack_require__(11)\n\t , $keys = __webpack_require__(34)\n\t , gOPD = $GOPD.f\n\t , dP = $DP.f\n\t , gOPN = gOPNExt.f\n\t , $Symbol = global.Symbol\n\t , $JSON = global.JSON\n\t , _stringify = $JSON && $JSON.stringify\n\t , PROTOTYPE = 'prototype'\n\t , HIDDEN = wks('_hidden')\n\t , TO_PRIMITIVE = wks('toPrimitive')\n\t , isEnum = {}.propertyIsEnumerable\n\t , SymbolRegistry = shared('symbol-registry')\n\t , AllSymbols = shared('symbols')\n\t , OPSymbols = shared('op-symbols')\n\t , ObjectProto = Object[PROTOTYPE]\n\t , USE_NATIVE = typeof $Symbol == 'function'\n\t , QObject = global.QObject;\n\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n\tvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\t\n\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n\tvar setSymbolDesc = DESCRIPTORS && $fails(function(){\n\t return _create(dP({}, 'a', {\n\t get: function(){ return dP(this, 'a', {value: 7}).a; }\n\t })).a != 7;\n\t}) ? function(it, key, D){\n\t var protoDesc = gOPD(ObjectProto, key);\n\t if(protoDesc)delete ObjectProto[key];\n\t dP(it, key, D);\n\t if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);\n\t} : dP;\n\t\n\tvar wrap = function(tag){\n\t var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n\t sym._k = tag;\n\t return sym;\n\t};\n\t\n\tvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){\n\t return typeof it == 'symbol';\n\t} : function(it){\n\t return it instanceof $Symbol;\n\t};\n\t\n\tvar $defineProperty = function defineProperty(it, key, D){\n\t if(it === ObjectProto)$defineProperty(OPSymbols, key, D);\n\t anObject(it);\n\t key = toPrimitive(key, true);\n\t anObject(D);\n\t if(has(AllSymbols, key)){\n\t if(!D.enumerable){\n\t if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));\n\t it[HIDDEN][key] = true;\n\t } else {\n\t if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;\n\t D = _create(D, {enumerable: createDesc(0, false)});\n\t } return setSymbolDesc(it, key, D);\n\t } return dP(it, key, D);\n\t};\n\tvar $defineProperties = function defineProperties(it, P){\n\t anObject(it);\n\t var keys = enumKeys(P = toIObject(P))\n\t , i = 0\n\t , l = keys.length\n\t , key;\n\t while(l > i)$defineProperty(it, key = keys[i++], P[key]);\n\t return it;\n\t};\n\tvar $create = function create(it, P){\n\t return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n\t};\n\tvar $propertyIsEnumerable = function propertyIsEnumerable(key){\n\t var E = isEnum.call(this, key = toPrimitive(key, true));\n\t if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;\n\t return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n\t};\n\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){\n\t it = toIObject(it);\n\t key = toPrimitive(key, true);\n\t if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;\n\t var D = gOPD(it, key);\n\t if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;\n\t return D;\n\t};\n\tvar $getOwnPropertyNames = function getOwnPropertyNames(it){\n\t var names = gOPN(toIObject(it))\n\t , result = []\n\t , i = 0\n\t , key;\n\t while(names.length > i){\n\t if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);\n\t } return result;\n\t};\n\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(it){\n\t var IS_OP = it === ObjectProto\n\t , names = gOPN(IS_OP ? OPSymbols : toIObject(it))\n\t , result = []\n\t , i = 0\n\t , key;\n\t while(names.length > i){\n\t if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);\n\t } return result;\n\t};\n\t\n\t// 19.4.1.1 Symbol([description])\n\tif(!USE_NATIVE){\n\t $Symbol = function Symbol(){\n\t if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');\n\t var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n\t var $set = function(value){\n\t if(this === ObjectProto)$set.call(OPSymbols, value);\n\t if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;\n\t setSymbolDesc(this, tag, createDesc(1, value));\n\t };\n\t if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});\n\t return wrap(tag);\n\t };\n\t redefine($Symbol[PROTOTYPE], 'toString', function toString(){\n\t return this._k;\n\t });\n\t\n\t $GOPD.f = $getOwnPropertyDescriptor;\n\t $DP.f = $defineProperty;\n\t __webpack_require__(61).f = gOPNExt.f = $getOwnPropertyNames;\n\t __webpack_require__(200).f = $propertyIsEnumerable;\n\t __webpack_require__(199).f = $getOwnPropertySymbols;\n\t\n\t if(DESCRIPTORS && !__webpack_require__(27)){\n\t redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n\t }\n\t\n\t wksExt.f = function(name){\n\t return wrap(wks(name));\n\t }\n\t}\n\t\n\t$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});\n\t\n\tfor(var symbols = (\n\t // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n\t 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n\t).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);\n\t\n\tfor(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);\n\t\n\t$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n\t // 19.4.2.1 Symbol.for(key)\n\t 'for': function(key){\n\t return has(SymbolRegistry, key += '')\n\t ? SymbolRegistry[key]\n\t : SymbolRegistry[key] = $Symbol(key);\n\t },\n\t // 19.4.2.5 Symbol.keyFor(sym)\n\t keyFor: function keyFor(key){\n\t if(isSymbol(key))return keyOf(SymbolRegistry, key);\n\t throw TypeError(key + ' is not a symbol!');\n\t },\n\t useSetter: function(){ setter = true; },\n\t useSimple: function(){ setter = false; }\n\t});\n\t\n\t$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n\t // 19.1.2.2 Object.create(O [, Properties])\n\t create: $create,\n\t // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n\t defineProperty: $defineProperty,\n\t // 19.1.2.3 Object.defineProperties(O, Properties)\n\t defineProperties: $defineProperties,\n\t // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n\t // 19.1.2.7 Object.getOwnPropertyNames(O)\n\t getOwnPropertyNames: $getOwnPropertyNames,\n\t // 19.1.2.8 Object.getOwnPropertySymbols(O)\n\t getOwnPropertySymbols: $getOwnPropertySymbols\n\t});\n\t\n\t// 24.3.2 JSON.stringify(value [, replacer [, space]])\n\t$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){\n\t var S = $Symbol();\n\t // MS Edge converts symbol values to JSON as {}\n\t // WebKit converts symbol values to JSON as null\n\t // V8 throws on boxed symbols\n\t return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';\n\t})), 'JSON', {\n\t stringify: function stringify(it){\n\t if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined\n\t var args = [it]\n\t , i = 1\n\t , replacer, $replacer;\n\t while(arguments.length > i)args.push(arguments[i++]);\n\t replacer = args[1];\n\t if(typeof replacer == 'function')$replacer = replacer;\n\t if($replacer || !isArray(replacer))replacer = function(key, value){\n\t if($replacer)value = $replacer.call(this, key, value);\n\t if(!isSymbol(value))return value;\n\t };\n\t args[1] = replacer;\n\t return _stringify.apply($JSON, args);\n\t }\n\t});\n\t\n\t// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n\t$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(10)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n\t// 19.4.3.5 Symbol.prototype[@@toStringTag]\n\tsetToStringTag($Symbol, 'Symbol');\n\t// 20.2.1.9 Math[@@toStringTag]\n\tsetToStringTag(Math, 'Math', true);\n\t// 24.3.3 JSON[@@toStringTag]\n\tsetToStringTag(global.JSON, 'JSON', true);\n\n/***/ },\n/* 195 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar META = __webpack_require__(44)('meta')\n\t , isObject = __webpack_require__(13)\n\t , has = __webpack_require__(29)\n\t , setDesc = __webpack_require__(11).f\n\t , id = 0;\n\tvar isExtensible = Object.isExtensible || function(){\n\t return true;\n\t};\n\tvar FREEZE = !__webpack_require__(16)(function(){\n\t return isExtensible(Object.preventExtensions({}));\n\t});\n\tvar setMeta = function(it){\n\t setDesc(it, META, {value: {\n\t i: 'O' + ++id, // object ID\n\t w: {} // weak collections IDs\n\t }});\n\t};\n\tvar fastKey = function(it, create){\n\t // return primitive with prefix\n\t if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n\t if(!has(it, META)){\n\t // can't set metadata to uncaught frozen object\n\t if(!isExtensible(it))return 'F';\n\t // not necessary to add metadata\n\t if(!create)return 'E';\n\t // add missing metadata\n\t setMeta(it);\n\t // return object ID\n\t } return it[META].i;\n\t};\n\tvar getWeak = function(it, create){\n\t if(!has(it, META)){\n\t // can't set metadata to uncaught frozen object\n\t if(!isExtensible(it))return true;\n\t // not necessary to add metadata\n\t if(!create)return false;\n\t // add missing metadata\n\t setMeta(it);\n\t // return hash weak collections IDs\n\t } return it[META].w;\n\t};\n\t// add metadata on freeze-family methods calling\n\tvar onFreeze = function(it){\n\t if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it);\n\t return it;\n\t};\n\tvar meta = module.exports = {\n\t KEY: META,\n\t NEED: false,\n\t fastKey: fastKey,\n\t getWeak: getWeak,\n\t onFreeze: onFreeze\n\t};\n\n/***/ },\n/* 196 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar global = __webpack_require__(6)\n\t , core = __webpack_require__(7)\n\t , LIBRARY = __webpack_require__(27)\n\t , wksExt = __webpack_require__(55)\n\t , defineProperty = __webpack_require__(11).f;\n\tmodule.exports = function(name){\n\t var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n\t if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});\n\t};\n\n/***/ },\n/* 197 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar getKeys = __webpack_require__(34)\n\t , toIObject = __webpack_require__(36);\n\tmodule.exports = function(object, el){\n\t var O = toIObject(object)\n\t , keys = getKeys(O)\n\t , length = keys.length\n\t , index = 0\n\t , key;\n\t while(length > index)if(O[key = keys[index++]] === el)return key;\n\t};\n\n/***/ },\n/* 198 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// all enumerable object keys, includes symbols\n\tvar getKeys = __webpack_require__(34)\n\t , gOPS = __webpack_require__(199)\n\t , pIE = __webpack_require__(200);\n\tmodule.exports = function(it){\n\t var result = getKeys(it)\n\t , getSymbols = gOPS.f;\n\t if(getSymbols){\n\t var symbols = getSymbols(it)\n\t , isEnum = pIE.f\n\t , i = 0\n\t , key;\n\t while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);\n\t } return result;\n\t};\n\n/***/ },\n/* 199 */\n/***/ function(module, exports) {\n\n\texports.f = Object.getOwnPropertySymbols;\n\n/***/ },\n/* 200 */\n/***/ function(module, exports) {\n\n\texports.f = {}.propertyIsEnumerable;\n\n/***/ },\n/* 201 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 7.2.2 IsArray(argument)\n\tvar cof = __webpack_require__(38);\n\tmodule.exports = Array.isArray || function isArray(arg){\n\t return cof(arg) == 'Array';\n\t};\n\n/***/ },\n/* 202 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar pIE = __webpack_require__(200)\n\t , createDesc = __webpack_require__(19)\n\t , toIObject = __webpack_require__(36)\n\t , toPrimitive = __webpack_require__(18)\n\t , has = __webpack_require__(29)\n\t , IE8_DOM_DEFINE = __webpack_require__(14)\n\t , gOPD = Object.getOwnPropertyDescriptor;\n\t\n\texports.f = __webpack_require__(15) ? gOPD : function getOwnPropertyDescriptor(O, P){\n\t O = toIObject(O);\n\t P = toPrimitive(P, true);\n\t if(IE8_DOM_DEFINE)try {\n\t return gOPD(O, P);\n\t } catch(e){ /* empty */ }\n\t if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);\n\t};\n\n/***/ },\n/* 203 */\n/***/ function(module, exports) {\n\n\n\n/***/ },\n/* 204 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(196)('asyncIterator');\n\n/***/ },\n/* 205 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(196)('observable');\n\n/***/ },\n/* 206 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: {\n\t 'open': _vm.showDropdown\n\t },\n\t staticStyle: {\n\t \"position\": \"relative\"\n\t }\n\t }, [_vm._c('input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.val),\n\t expression: \"val\"\n\t }],\n\t staticClass: \"form-control\",\n\t attrs: {\n\t \"type\": \"text\",\n\t \"autocomplete\": \"off\",\n\t \"placeholder\": _vm.placeholder\n\t },\n\t domProps: {\n\t \"value\": _vm._s(_vm.val)\n\t },\n\t on: {\n\t \"blur\": function($event) {\n\t _vm.showDropdown = false\n\t },\n\t \"keydown\": [function($event) {\n\t if (_vm._k($event.keyCode, \"down\", 40)) { return; }\n\t _vm.down($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"enter\", 13)) { return; }\n\t _vm.hit($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t _vm.reset($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"up\", 38)) { return; }\n\t _vm.up($event)\n\t }],\n\t \"input\": function($event) {\n\t if ($event.target.composing) { return; }\n\t _vm.val = $event.target.value\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('ul', {\n\t ref: \"dropdown\",\n\t staticClass: \"dropdown-menu\"\n\t }, _vm._l((_vm.items), function(item, i) {\n\t return _vm._c('li', {\n\t class: {\n\t 'active': _vm.isActive(i)\n\t }\n\t }, [_vm._c('a', {\n\t on: {\n\t \"mousedown\": function($event) {\n\t $event.preventDefault();\n\t _vm.hit($event)\n\t },\n\t \"mousemove\": function($event) {\n\t _vm.setActive(i)\n\t }\n\t }\n\t }, [_vm._c(_vm.tmpl, {\n\t tag: \"component\",\n\t attrs: {\n\t \"item\": item\n\t }\n\t })], 1)])\n\t }))])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-5b5f5e94\", module.exports)\n\t }\n\t}\n\n/***/ }\n/******/ ])\n});\n;\n//# sourceMappingURL=vue-strap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3Z1ZS1zdHJhcC9kaXN0L3Z1ZS1zdHJhcC5qcz9lMTQ3Il0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlZ1ZVN0cmFwXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlZ1ZVN0cmFwXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge30sXG4vKioqKioqLyBcdFx0XHRpZDogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KTtcblx0XG5cdHZhciBfQ2xpY2tPdXRzaWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsaWNrT3V0c2lkZSk7XG5cdFxuXHR2YXIgX1Njcm9sbCA9IF9fd2VicGFja19yZXF1aXJlX18oNjgpO1xuXHRcblx0dmFyIF9TY3JvbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2Nyb2xsKTtcblx0XG5cdHZhciBfQWNjb3JkaW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OSk7XG5cdFxuXHR2YXIgX0FjY29yZGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BY2NvcmRpb24pO1xuXHRcblx0dmFyIF9BZmZpeCA9IF9fd2VicGFja19yZXF1aXJlX18oNzIpO1xuXHRcblx0dmFyIF9BZmZpeDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BZmZpeCk7XG5cdFxuXHR2YXIgX0FsZXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NSk7XG5cdFxuXHR2YXIgX0FsZXJ0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FsZXJ0KTtcblx0XG5cdHZhciBfQXNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyKTtcblx0XG5cdHZhciBfQXNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQXNpZGUpO1xuXHRcblx0dmFyIF9CdXR0b25Hcm91cCA9IF9fd2VicGFja19yZXF1aXJlX18oODcpO1xuXHRcblx0dmFyIF9CdXR0b25Hcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CdXR0b25Hcm91cCk7XG5cdFxuXHR2YXIgX0Nhcm91c2VsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MCk7XG5cdFxuXHR2YXIgX0Nhcm91c2VsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Nhcm91c2VsKTtcblx0XG5cdHZhciBfQ2hlY2tib3ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1KTtcblx0XG5cdHZhciBfQ2hlY2tib3gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2hlY2tib3gpO1xuXHRcblx0dmFyIF9EYXRlcGlja2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDApO1xuXHRcblx0dmFyIF9EYXRlcGlja2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0RhdGVwaWNrZXIpO1xuXHRcblx0dmFyIF9Ecm9wZG93biA9IF9fd2VicGFja19yZXF1aXJlX18oMTA1KTtcblx0XG5cdHZhciBfRHJvcGRvd24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRHJvcGRvd24pO1xuXHRcblx0dmFyIF9Gb3JtR3JvdXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwOCk7XG5cdFxuXHR2YXIgX0Zvcm1Hcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Gb3JtR3JvdXApO1xuXHRcblx0dmFyIF9Gb3JtVmFsaWRhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTEpO1xuXHRcblx0dmFyIF9Gb3JtVmFsaWRhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Zvcm1WYWxpZGF0b3IpO1xuXHRcblx0dmFyIF9JbnB1dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE0KTtcblx0XG5cdHZhciBfSW5wdXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfSW5wdXQpO1xuXHRcblx0dmFyIF9Nb2RhbCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE5KTtcblx0XG5cdHZhciBfTW9kYWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTW9kYWwpO1xuXHRcblx0dmFyIF9OYXZiYXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyOCk7XG5cdFxuXHR2YXIgX05hdmJhcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9OYXZiYXIpO1xuXHRcblx0dmFyIF9PcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMSk7XG5cdFxuXHR2YXIgX09wdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9PcHRpb24pO1xuXHRcblx0dmFyIF9QYW5lbCA9IF9fd2VicGFja19yZXF1aXJlX18oMTM0KTtcblx0XG5cdHZhciBfUGFuZWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFuZWwpO1xuXHRcblx0dmFyIF9Qb3BvdmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzkpO1xuXHRcblx0dmFyIF9Qb3BvdmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BvcG92ZXIpO1xuXHRcblx0dmFyIF9Qcm9ncmVzc2JhciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ1KTtcblx0XG5cdHZhciBfUHJvZ3Jlc3NiYXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUHJvZ3Jlc3NiYXIpO1xuXHRcblx0dmFyIF9SYWRpbyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ4KTtcblx0XG5cdHZhciBfUmFkaW8yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUmFkaW8pO1xuXHRcblx0dmFyIF9TZWxlY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1Myk7XG5cdFxuXHR2YXIgX1NlbGVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TZWxlY3QpO1xuXHRcblx0dmFyIF9TbGlkZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1OCk7XG5cdFxuXHR2YXIgX1NsaWRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TbGlkZXIpO1xuXHRcblx0dmFyIF9TcGlubmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjEpO1xuXHRcblx0dmFyIF9TcGlubmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NwaW5uZXIpO1xuXHRcblx0dmFyIF9UYWIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2Nik7XG5cdFxuXHR2YXIgX1RhYjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWIpO1xuXHRcblx0dmFyIF9UYWJHcm91cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTY5KTtcblx0XG5cdHZhciBfVGFiR3JvdXAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFiR3JvdXApO1xuXHRcblx0dmFyIF9UYWJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzQpO1xuXHRcblx0dmFyIF9UYWJzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYnMpO1xuXHRcblx0dmFyIF9Ub2dnbGVCdXR0b24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3OSk7XG5cdFxuXHR2YXIgX1RvZ2dsZUJ1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ub2dnbGVCdXR0b24pO1xuXHRcblx0dmFyIF9Ub29sdGlwID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODIpO1xuXHRcblx0dmFyIF9Ub29sdGlwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Rvb2x0aXApO1xuXHRcblx0dmFyIF9UeXBlYWhlYWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4Nyk7XG5cdFxuXHR2YXIgX1R5cGVhaGVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UeXBlYWhlYWQpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdC8vIENvbXBvbmVudHNcblx0XG5cdC8vIERpcmVjdGl2ZXNcblx0Ly8gVXRpbHNcblx0dmFyIFZ1ZVN0cmFwID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIENsaWNrT3V0c2lkZTogX0NsaWNrT3V0c2lkZTIuZGVmYXVsdCxcblx0ICAgIFNjcm9sbDogX1Njcm9sbDIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgdXRpbHM6IHtcblx0ICAgICQ6IF9Ob2RlTGlzdDIuZGVmYXVsdCxcblx0ICAgIGNvZXJjZTogX3V0aWxzLmNvZXJjZVxuXHQgIH0sXG5cdCAgLy9jb21wb25lbnRzXG5cdCAgYWNjb3JkaW9uOiBfQWNjb3JkaW9uMi5kZWZhdWx0LFxuXHQgIGFmZml4OiBfQWZmaXgyLmRlZmF1bHQsXG5cdCAgYWxlcnQ6IF9BbGVydDIuZGVmYXVsdCxcblx0ICBhc2lkZTogX0FzaWRlMi5kZWZhdWx0LFxuXHQgIGJ1dHRvbkdyb3VwOiBfQnV0dG9uR3JvdXAyLmRlZmF1bHQsXG5cdCAgY2Fyb3VzZWw6IF9DYXJvdXNlbDIuZGVmYXVsdCxcblx0ICBjaGVja2JveDogX0NoZWNrYm94Mi5kZWZhdWx0LFxuXHQgIGRhdGVwaWNrZXI6IF9EYXRlcGlja2VyMi5kZWZhdWx0LFxuXHQgIGRyb3Bkb3duOiBfRHJvcGRvd24yLmRlZmF1bHQsXG5cdCAgZm9ybUdyb3VwOiBfRm9ybUdyb3VwMi5kZWZhdWx0LFxuXHQgIGZvcm1WYWxpZGF0b3I6IF9Gb3JtVmFsaWRhdG9yMi5kZWZhdWx0LFxuXHQgIGlucHV0OiBfSW5wdXQyLmRlZmF1bHQsXG5cdCAgbW9kYWw6IF9Nb2RhbDIuZGVmYXVsdCxcblx0ICBuYXZiYXI6IF9OYXZiYXIyLmRlZmF1bHQsXG5cdCAgb3B0aW9uOiBfT3B0aW9uMi5kZWZhdWx0LFxuXHQgIHBhbmVsOiBfUGFuZWwyLmRlZmF1bHQsXG5cdCAgcG9wb3ZlcjogX1BvcG92ZXIyLmRlZmF1bHQsXG5cdCAgcHJvZ3Jlc3NiYXI6IF9Qcm9ncmVzc2JhcjIuZGVmYXVsdCxcblx0ICByYWRpbzogX1JhZGlvMi5kZWZhdWx0LFxuXHQgIHNlbGVjdDogX1NlbGVjdDIuZGVmYXVsdCxcblx0ICBzbGlkZXI6IF9TbGlkZXIyLmRlZmF1bHQsXG5cdCAgc3Bpbm5lcjogX1NwaW5uZXIyLmRlZmF1bHQsXG5cdCAgdGFiOiBfVGFiMi5kZWZhdWx0LFxuXHQgIHRhYkdyb3VwOiBfVGFiR3JvdXAyLmRlZmF1bHQsXG5cdCAgdGFiczogX1RhYnMyLmRlZmF1bHQsXG5cdCAgdG9nZ2xlQnV0dG9uOiBfVG9nZ2xlQnV0dG9uMi5kZWZhdWx0LFxuXHQgIHRvb2x0aXA6IF9Ub29sdGlwMi5kZWZhdWx0LFxuXHQgIHR5cGVhaGVhZDogX1R5cGVhaGVhZDIuZGVmYXVsdFxuXHR9O1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBWdWVTdHJhcDtcblxuLyoqKi8gfSxcbi8qIDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9kZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdFxuXHR2YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmluZVByb3BlcnR5KTtcblx0XG5cdHZhciBfaXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcblx0XG5cdHZhciBfaXRlcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXRlcmF0b3IpO1xuXHRcblx0dmFyIF9nZXRPd25Qcm9wZXJ0eU5hbWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Nik7XG5cdFxuXHR2YXIgX2dldE93blByb3BlcnR5TmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0T3duUHJvcGVydHlOYW1lcyk7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9fd2VicGFja19yZXF1aXJlX18oNjIpO1xuXHRcblx0dmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYzKTtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2xhc3MyKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDY0KTtcblx0XG5cdHZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXHR2YXIgbm9kZUVycm9yID0gbmV3IEVycm9yKCdQYXNzZWQgYXJndW1lbnRzIG11c3QgYmUgb2YgTm9kZScpO1xuXHR2YXIgYmx1ckV2ZW50O1xuXHR2YXIgYmx1ckxpc3QgPSBbXTtcblx0dmFyIEV2ZW50cyA9IFtdO1xuXHRcblx0ZnVuY3Rpb24gaXNOb2RlKHZhbCkge1xuXHQgIHJldHVybiB2YWwgaW5zdGFuY2VvZiB3aW5kb3cuTm9kZTtcblx0fVxuXHRmdW5jdGlvbiBpc05vZGVMaXN0KHZhbCkge1xuXHQgIHJldHVybiB2YWwgaW5zdGFuY2VvZiB3aW5kb3cuTm9kZUxpc3QgfHwgdmFsIGluc3RhbmNlb2YgTm9kZUxpc3QgfHwgdmFsIGluc3RhbmNlb2Ygd2luZG93LkhUTUxDb2xsZWN0aW9uIHx8IHZhbCBpbnN0YW5jZW9mIEFycmF5O1xuXHR9XG5cdFxuXHR2YXIgTm9kZUxpc3QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgZnVuY3Rpb24gTm9kZUxpc3QoYXJncykge1xuXHQgICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgTm9kZUxpc3QpO1xuXHRcblx0ICAgIHZhciBub2RlcyA9IGFyZ3M7XG5cdCAgICBpZiAoYXJnc1swXSA9PT0gd2luZG93KSB7XG5cdCAgICAgIG5vZGVzID0gW3dpbmRvd107XG5cdCAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuXHQgICAgICBub2RlcyA9IChhcmdzWzFdIHx8IGRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsKGFyZ3NbMF0pO1xuXHQgICAgICBpZiAoYXJnc1sxXSkge1xuXHQgICAgICAgIHRoaXMub3duZXIgPSBhcmdzWzFdO1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2UgaWYgKDAgaW4gYXJncyAmJiAhaXNOb2RlKGFyZ3NbMF0pICYmIGFyZ3NbMF0gJiYgJ2xlbmd0aCcgaW4gYXJnc1swXSkge1xuXHQgICAgICBub2RlcyA9IGFyZ3NbMF07XG5cdCAgICAgIGlmIChhcmdzWzFdKSB7XG5cdCAgICAgICAgdGhpcy5vd25lciA9IGFyZ3NbMV07XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGlmIChub2Rlcykge1xuXHQgICAgICBmb3IgKHZhciBpIGluIG5vZGVzKSB7XG5cdCAgICAgICAgdGhpc1tpXSA9IG5vZGVzW2ldO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMubGVuZ3RoID0gbm9kZXMubGVuZ3RoO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5sZW5ndGggPSAwO1xuXHQgICAgfVxuXHQgICAgd2luZG93LnBydWViYSA9IHRoaXM7XG5cdCAgfVxuXHRcblx0ICAoMCwgX2NyZWF0ZUNsYXNzMy5kZWZhdWx0KShOb2RlTGlzdCwgW3tcblx0ICAgIGtleTogJ2NvbmNhdCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gY29uY2F0KCkge1xuXHQgICAgICB2YXIgbm9kZXMgPSBBcnJheVByb3RvLnNsaWNlLmNhbGwodGhpcyk7XG5cdCAgICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYXJyKSB7XG5cdCAgICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJyLCBmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChpc05vZGUoZWwpKSB7XG5cdCAgICAgICAgICAgIGlmICghfm5vZGVzLmluZGV4T2YoZWwpKSBub2Rlcy5wdXNoKGVsKTtcblx0ICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlTGlzdChlbCkpIHtcblx0ICAgICAgICAgICAgZmxhdHRlbihlbCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJncywgZnVuY3Rpb24gKGFyZykge1xuXHQgICAgICAgIGlmIChpc05vZGUoYXJnKSkge1xuXHQgICAgICAgICAgaWYgKCF+bm9kZXMuaW5kZXhPZihhcmcpKSBub2Rlcy5wdXNoKGFyZyk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KGFyZykpIHtcblx0ICAgICAgICAgIGZsYXR0ZW4oYXJnKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhyb3cgRXJyb3IoJ0NvbmNhdCBhcmd1bWVudHMgbXVzdCBiZSBvZiBhIE5vZGUsIE5vZGVMaXN0LCBIVE1MQ29sbGVjdGlvbiwgb3IgQXJyYXkgb2YgKE5vZGUsIE5vZGVMaXN0LCBIVE1MQ29sbGVjdGlvbiwgQXJyYXkpJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIE5vZGVMaXN0SlMobm9kZXMsIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2RlbGV0ZScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZSgpIHtcblx0ICAgICAgdmFyIG5vdFJlbW92ZWQgPSBmbGF0dGVuKHRoaXMpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBpZiAoZWwucmVtb3ZlKSB7XG5cdCAgICAgICAgICBlbC5yZW1vdmUoKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGVsLnBhcmVudE5vZGUpIHtcblx0ICAgICAgICAgIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5jb250YWlucyhlbCk7XG5cdCAgICAgIH0pO1xuXHQgICAgICBpZiAobm90UmVtb3ZlZC5sZW5ndGgpIGNvbnNvbGUud2FybignTm9kZUxpc3Q6IFNvbWUgbm9kZXMgY291bGQgbm90IGJlIGRlbGV0ZWQuJyk7XG5cdCAgICAgIHJldHVybiBub3RSZW1vdmVkO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2VhY2gnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGVhY2goKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guYXBwbHkodGhpcywgYXJncyk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZpbHRlcicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZmlsdGVyKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIE5vZGVMaXN0SlMoQXJyYXlQcm90by5maWx0ZXIuYXBwbHkodGhpcywgYXJncyksIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZpbmQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmQoZWxlbWVudCkge1xuXHQgICAgICB2YXIgbm9kZXMgPSBbXTtcblx0ICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykgZmxhdHRlbih0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgbm9kZXMucHVzaChub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudCkpO1xuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKGlzTm9kZShlbGVtZW50KSkgZmxhdHRlbih0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgaWYgKG5vZGUgIT09IGVsZW1lbnQgJiYgbm9kZS5jb250YWlucyhlbGVtZW50KSkgbm9kZXMucHVzaChlbGVtZW50KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmIChpc05vZGVMaXN0KGVsZW1lbnQpKSB7XG5cdCAgICAgICAgdmFyIGVscyA9IGZsYXR0ZW4oZWxlbWVudCk7XG5cdCAgICAgICAgZmxhdHRlbih0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgICBlbHMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgICAgaWYgKG5vZGUgIT09IGVsICYmIG5vZGUuY29udGFpbnMoZWwpKSBub2Rlcy5wdXNoKGVsKTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBmbGF0dGVuKG5vZGVzLCB0aGlzLm93bmVyKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdmb3JFYWNoJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JFYWNoKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdpbmNsdWRlcycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gaW5jbHVkZXMoZWxlbWVudCwgaW5kZXgpIHtcblx0ICAgICAgcmV0dXJuIH50aGlzLmluZGV4T2YoZWxlbWVudCwgaW5kZXgpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ21hcCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuNSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNSksIF9rZXk1ID0gMDsgX2tleTUgPCBfbGVuNTsgX2tleTUrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTVdID0gYXJndW1lbnRzW19rZXk1XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIG1hcHBlZCA9IEFycmF5UHJvdG8ubWFwLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHQgICAgICByZXR1cm4gbWFwcGVkLnNvbWUoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgcmV0dXJuIGlzTm9kZShlbCkgfHwgaXNOb2RlTGlzdChlbCk7XG5cdCAgICAgIH0pID8gZmxhdHRlbihtYXBwZWQsIHRoaXMpIDogbWFwcGVkO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3BhcmVudCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcGFyZW50KCkge1xuXHQgICAgICByZXR1cm4gZmxhdHRlbih0aGlzLm1hcChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwucGFyZW50Tm9kZTtcblx0ICAgICAgfSksIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3BvcCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcG9wKGFtb3VudCkge1xuXHQgICAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHtcblx0ICAgICAgICBhbW91bnQgPSAxO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciBub2RlcyA9IFtdO1xuXHQgICAgICB2YXIgcG9wID0gQXJyYXlQcm90by5wb3AuYmluZCh0aGlzKTtcblx0ICAgICAgd2hpbGUgKGFtb3VudC0tKSB7XG5cdCAgICAgICAgbm9kZXMucHVzaChwb3AoKSk7XG5cdCAgICAgIH1yZXR1cm4gTm9kZUxpc3RKUyhub2RlcywgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncHVzaCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcHVzaCgpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIGZvciAodmFyIF9sZW42ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW42KSwgX2tleTYgPSAwOyBfa2V5NiA8IF9sZW42OyBfa2V5NisrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5Nl0gPSBhcmd1bWVudHNbX2tleTZdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guY2FsbChhcmdzLCBmdW5jdGlvbiAoYXJnKSB7XG5cdCAgICAgICAgaWYgKCFpc05vZGUoYXJnKSkgdGhyb3cgbm9kZUVycm9yO1xuXHQgICAgICAgIGlmICghfl90aGlzLmluZGV4T2YoYXJnKSkgQXJyYXlQcm90by5wdXNoLmNhbGwoX3RoaXMsIGFyZyk7XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzaGlmdCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoYW1vdW50KSB7XG5cdCAgICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgIGFtb3VudCA9IDE7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIG5vZGVzID0gW107XG5cdCAgICAgIHdoaWxlIChhbW91bnQtLSkge1xuXHQgICAgICAgIG5vZGVzLnB1c2goQXJyYXlQcm90by5zaGlmdC5jYWxsKHRoaXMpKTtcblx0ICAgICAgfXJldHVybiBub2Rlcy5sZW5ndGggPT0gMSA/IG5vZGVzWzBdIDogTm9kZUxpc3RKUyhub2RlcywgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnc2xpY2UnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWNlKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuNyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNyksIF9rZXk3ID0gMDsgX2tleTcgPCBfbGVuNzsgX2tleTcrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTddID0gYXJndW1lbnRzW19rZXk3XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIE5vZGVMaXN0SlMoQXJyYXlQcm90by5zbGljZS5hcHBseSh0aGlzLCBhcmdzKSwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnc3BsaWNlJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBzcGxpY2UoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW44ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW44KSwgX2tleTggPSAwOyBfa2V5OCA8IF9sZW44OyBfa2V5OCsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5OF0gPSBhcmd1bWVudHNbX2tleThdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBmb3IgKHZhciBpID0gMiwgbCA9IGFyZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdCAgICAgICAgaWYgKCFpc05vZGUoYXJnc1tpXSkpIHRocm93IG5vZGVFcnJvcjtcblx0ICAgICAgfVxuXHQgICAgICBBcnJheVByb3RvLnNwbGljZS5hcHBseSh0aGlzLCBhcmdzKTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAndW5zaGlmdCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdW5zaGlmdCgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICB2YXIgdW5zaGlmdCA9IEFycmF5UHJvdG8udW5zaGlmdC5iaW5kKHRoaXMpO1xuXHRcblx0ICAgICAgZm9yICh2YXIgX2xlbjkgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjkpLCBfa2V5OSA9IDA7IF9rZXk5IDwgX2xlbjk7IF9rZXk5KyspIHtcblx0ICAgICAgICBhcmdzW19rZXk5XSA9IGFyZ3VtZW50c1tfa2V5OV07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIEFycmF5UHJvdG8uZm9yRWFjaC5jYWxsKGFyZ3MsIGZ1bmN0aW9uIChhcmcpIHtcblx0ICAgICAgICBpZiAoIWlzTm9kZShhcmcpKSB0aHJvdyBub2RlRXJyb3I7XG5cdCAgICAgICAgaWYgKCF+X3RoaXMyLmluZGV4T2YoYXJnKSkgdW5zaGlmdChhcmcpO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnYWRkQ2xhc3MnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZENsYXNzKGNsYXNzZXMpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgdHJ1ZSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncmVtb3ZlQ2xhc3MnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGNsYXNzZXMpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgZmFsc2UpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3RvZ2dsZUNsYXNzJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b2dnbGVDbGFzcyhjbGFzc2VzKSB7XG5cdCAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcblx0XG5cdCAgICAgIHZhciBtZXRob2QgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsID8gJ3RvZ2dsZScgOiB2YWx1ZSA/ICdhZGQnIDogJ3JlbW92ZSc7XG5cdCAgICAgIGlmICh0eXBlb2YgY2xhc3NlcyA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy50cmltKCkucmVwbGFjZSgvXFxzKy8sICcgJykuc3BsaXQoJyAnKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBjbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcblx0ICAgICAgICAgIHJldHVybiBlbC5jbGFzc0xpc3RbbWV0aG9kXShjKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZ2V0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQocHJvcCkge1xuXHQgICAgICB2YXIgYXJyID0gW107XG5cdCAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBpZiAoZWwgIT09IG51bGwpIHtcblx0ICAgICAgICAgIGVsID0gZWxbcHJvcF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiBmbGF0dGVuKGFyciwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnc2V0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQocHJvcCwgdmFsdWUpIHtcblx0ICAgICAgaWYgKHByb3AuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuXHQgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChlbCkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcCkge1xuXHQgICAgICAgICAgICAgIGlmIChrZXkgaW4gZWwpIHtcblx0ICAgICAgICAgICAgICAgIGVsW2tleV0gPSBwcm9wW2tleV07XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKHByb3AgaW4gZWwpIHtcblx0ICAgICAgICAgICAgZWxbcHJvcF0gPSB2YWx1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdjYWxsJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxsKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuMTAgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjEwKSwgX2tleTEwID0gMDsgX2tleTEwIDwgX2xlbjEwOyBfa2V5MTArKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTEwXSA9IGFyZ3VtZW50c1tfa2V5MTBdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgbWV0aG9kID0gQXJyYXlQcm90by5zaGlmdC5jYWxsKGFyZ3MpO1xuXHQgICAgICB2YXIgYXJyID0gW107XG5cdCAgICAgIHZhciByZXR1cm5UaGlzID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbCAmJiBlbFttZXRob2RdIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgICAgICAgIGVsID0gZWxbbWV0aG9kXS5hcHBseShlbCwgYXJncyk7XG5cdCAgICAgICAgICBhcnIucHVzaChlbCk7XG5cdCAgICAgICAgICBpZiAocmV0dXJuVGhpcyAmJiBlbCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVyblRoaXMgPSBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgYXJyLnB1c2godW5kZWZpbmVkKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gcmV0dXJuVGhpcyA/IHRoaXMgOiBmbGF0dGVuKGFyciwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnaXRlbScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gaXRlbShpbmRleCkge1xuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhbdGhpc1tpbmRleF1dLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvbicsXG5cdFxuXHRcblx0ICAgIC8vIGV2ZW50IGhhbmRsZXJzXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb24oZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcblx0ICAgICAgaWYgKHR5cGVvZiBldmVudHMgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgZXZlbnRzID0gZXZlbnRzLnRyaW0oKS5yZXBsYWNlKC9cXHMrLywgJyAnKS5zcGxpdCgnICcpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghdGhpcyB8fCAhdGhpcy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXHQgICAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIGNhbGxiYWNrID0gc2VsZWN0b3I7XG5cdCAgICAgICAgc2VsZWN0b3IgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghY2FsbGJhY2spIHJldHVybiB0aGlzO1xuXHQgICAgICB2YXIgZm4gPSBjYWxsYmFjaztcblx0ICAgICAgY2FsbGJhY2sgPSBzZWxlY3RvciA/IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgdmFyIGVscyA9IE5vZGVMaXN0SlMoc2VsZWN0b3IsIHRoaXMpO1xuXHQgICAgICAgIGlmICghZWxzLmxlbmd0aCkge1xuXHQgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHMuc29tZShmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIHZhciB0YXJnZXQgPSBlbC5jb250YWlucyhlLnRhcmdldCk7XG5cdCAgICAgICAgICBpZiAodGFyZ2V0KSBmbi5jYWxsKGVsLCBlLCBlbCk7XG5cdCAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9IDogZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICBmbi5hcHBseSh0aGlzLCBbZSwgdGhpc10pO1xuXHQgICAgICB9O1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgICBpZiAoZWwgPT09IHdpbmRvdyB8fCBpc05vZGUoZWwpKSB7XG5cdCAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGNhbGxiYWNrLCBmYWxzZSk7XG5cdCAgICAgICAgICAgIEV2ZW50cy5wdXNoKHtcblx0ICAgICAgICAgICAgICBlbDogZWwsXG5cdCAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuXHQgICAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29mZicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb2ZmKGV2ZW50cywgY2FsbGJhY2spIHtcblx0ICAgICAgaWYgKGV2ZW50cyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdCAgICAgICAgY2FsbGJhY2sgPSBldmVudHM7XG5cdCAgICAgICAgZXZlbnRzID0gbnVsbDtcblx0ICAgICAgfVxuXHQgICAgICBldmVudHMgPSBldmVudHMgaW5zdGFuY2VvZiBBcnJheSA/IGV2ZW50cyA6IHR5cGVvZiBldmVudHMgPT09ICdzdHJpbmcnID8gZXZlbnRzLnRyaW0oKS5yZXBsYWNlKC9cXHMrLywgJyAnKS5zcGxpdCgnICcpIDogbnVsbDtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIEV2ZW50cyA9IEV2ZW50cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgIGlmIChlICYmIGUuZWwgPT09IGVsICYmICghY2FsbGJhY2sgfHwgY2FsbGJhY2sgPT09IGUuY2FsbGJhY2spICYmICghZXZlbnRzIHx8IH5ldmVudHMuaW5kZXhPZihlLmV2ZW50KSkpIHtcblx0ICAgICAgICAgICAgZS5lbC5yZW1vdmVFdmVudExpc3RlbmVyKGUuZXZlbnQsIGUuY2FsbGJhY2spO1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uQmx1cicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb25CbHVyKGNhbGxiYWNrKSB7XG5cdCAgICAgIGlmICghdGhpcyB8fCAhdGhpcy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXHQgICAgICBpZiAoIWNhbGxiYWNrKSByZXR1cm4gdGhpcztcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGJsdXJMaXN0LnB1c2goeyBlbDogZWwsIGNhbGxiYWNrOiBjYWxsYmFjayB9KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmICghYmx1ckV2ZW50KSB7XG5cdCAgICAgICAgYmx1ckV2ZW50ID0gZnVuY3Rpb24gYmx1ckV2ZW50KGUpIHtcblx0ICAgICAgICAgIGJsdXJMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcblx0ICAgICAgICAgICAgdmFyIHRhcmdldCA9IGl0ZW0uZWwuY29udGFpbnMoZS50YXJnZXQpIHx8IGl0ZW0uZWwgPT09IGUudGFyZ2V0O1xuXHQgICAgICAgICAgICBpZiAoIXRhcmdldCkgaXRlbS5jYWxsYmFjay5jYWxsKGl0ZW0uZWwsIGUsIGl0ZW0uZWwpO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGJsdXJFdmVudCwgZmFsc2UpO1xuXHQgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBibHVyRXZlbnQsIGZhbHNlKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvZmZCbHVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvZmZCbHVyKGNhbGxiYWNrKSB7XG5cdCAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBibHVyTGlzdCA9IGJsdXJMaXN0LmZpbHRlcihmdW5jdGlvbiAoYmx1cikge1xuXHQgICAgICAgICAgaWYgKGJsdXIgJiYgYmx1ci5lbCA9PT0gZWwgJiYgKCFjYWxsYmFjayB8fCBibHVyLmNhbGxiYWNrID09PSBjYWxsYmFjaykpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgcmV0dXJuIGVsO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnYXNBcnJheScsXG5cdCAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgICAgcmV0dXJuIEFycmF5UHJvdG8uc2xpY2UuY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0ICB9XSk7XG5cdCAgcmV0dXJuIE5vZGVMaXN0O1xuXHR9KCk7XG5cdFxuXHR2YXIgTkwgPSBOb2RlTGlzdC5wcm90b3R5cGU7XG5cdFxuXHRmdW5jdGlvbiBmbGF0dGVuKGFyciwgb3duZXIpIHtcblx0ICB2YXIgbGlzdCA9IFtdO1xuXHQgIEFycmF5UHJvdG8uZm9yRWFjaC5jYWxsKGFyciwgZnVuY3Rpb24gKGVsKSB7XG5cdCAgICBpZiAoaXNOb2RlKGVsKSkge1xuXHQgICAgICBpZiAoIX5saXN0LmluZGV4T2YoZWwpKSBsaXN0LnB1c2goZWwpO1xuXHQgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KGVsKSkge1xuXHQgICAgICBmb3IgKHZhciBpZCBpbiBlbCkge1xuXHQgICAgICAgIGlmICghfmxpc3QuaW5kZXhPZihlbFtpZF0pKSBsaXN0LnB1c2goZWxbaWRdKTtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIGlmIChlbCAhPT0gbnVsbCkge1xuXHQgICAgICBhcnIuZ2V0ID0gTkwuZ2V0O1xuXHQgICAgICBhcnIuc2V0ID0gTkwuc2V0O1xuXHQgICAgICBhcnIuY2FsbCA9IE5MLmNhbGw7XG5cdCAgICAgIGFyci5vd25lciA9IG93bmVyO1xuXHQgICAgICByZXR1cm4gYXJyO1xuXHQgICAgfVxuXHQgIH0pO1xuXHQgIHJldHVybiBOb2RlTGlzdEpTKGxpc3QsIG93bmVyKTtcblx0fVxuXHRcblx0dmFyIGV4Y2VwdGlvbnMgPSBbJ2pvaW4nLCAnY29weVdpdGhpbicsICdmaWxsJywgJ2ZpbmQnLCAnZm9yRWFjaCddO1xuXHQoMCwgX2dldE93blByb3BlcnR5TmFtZXMyLmRlZmF1bHQpKEFycmF5UHJvdG8pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuXHQgIGlmICghfmV4Y2VwdGlvbnMuaW5kZXhPZihrZXkpICYmIE5MW2tleV0gPT09IHVuZGVmaW5lZCkge1xuXHQgICAgTkxba2V5XSA9IEFycmF5UHJvdG9ba2V5XTtcblx0ICB9XG5cdH0pO1xuXHRpZiAod2luZG93LlN5bWJvbCAmJiBfaXRlcmF0b3IyLmRlZmF1bHQpIHtcblx0ICBOTFtfaXRlcmF0b3IyLmRlZmF1bHRdID0gTkwudmFsdWVzID0gQXJyYXlQcm90b1tfaXRlcmF0b3IyLmRlZmF1bHRdO1xuXHR9XG5cdHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0ZnVuY3Rpb24gc2V0dGVyR2V0dGVyKHByb3ApIHtcblx0ICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgaWYgKE5MW3Byb3BdKSByZXR1cm47XG5cdCAgaWYgKGRpdltwcm9wXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdCAgICBOTFtwcm9wXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgZm9yICh2YXIgX2xlbjExID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4xMSksIF9rZXkxMSA9IDA7IF9rZXkxMSA8IF9sZW4xMTsgX2tleTExKyspIHtcblx0ICAgICAgICBhcmdzW19rZXkxMV0gPSBhcmd1bWVudHNbX2tleTExXTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIGFyciA9IFtdO1xuXHQgICAgICB2YXIgcmV0dXJuVGhpcyA9IHRydWU7XG5cdCAgICAgIGZvciAodmFyIGkgaW4gTkwpIHtcblx0ICAgICAgICB2YXIgZWwgPSBOTFtpXTtcblx0ICAgICAgICBpZiAoZWwgJiYgZWxbcHJvcF0gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHQgICAgICAgICAgZWwgPSBlbFtwcm9wXS5hcHBseShlbCwgYXJncyk7XG5cdCAgICAgICAgICBhcnIucHVzaChlbCk7XG5cdCAgICAgICAgICBpZiAocmV0dXJuVGhpcyAmJiBlbCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVyblRoaXMgPSBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgYXJyLnB1c2godW5kZWZpbmVkKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHJldHVyblRoaXMgPyBfdGhpczMgOiBmbGF0dGVuKGFyciwgX3RoaXMzKTtcblx0ICAgIH07XG5cdCAgfSBlbHNlIHtcblx0ICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKE5MLCBwcm9wLCB7XG5cdCAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgICAgIHZhciBhcnIgPSBbXTtcblx0ICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgICBpZiAoZWwgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgZWwgPSBlbFtwcm9wXTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm4gZmxhdHRlbihhcnIsIHRoaXMpO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuXHQgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChlbCAmJiBwcm9wIGluIGVsKSB7XG5cdCAgICAgICAgICAgIGVsW3Byb3BdID0gdmFsdWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHQgIH1cblx0fVxuXHRmb3IgKHZhciBwcm9wIGluIGRpdikge1xuXHQgIHNldHRlckdldHRlcihwcm9wKTtcblx0fWZ1bmN0aW9uIE5vZGVMaXN0SlMoKSB7XG5cdCAgZm9yICh2YXIgX2xlbjEyID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4xMiksIF9rZXkxMiA9IDA7IF9rZXkxMiA8IF9sZW4xMjsgX2tleTEyKyspIHtcblx0ICAgIGFyZ3NbX2tleTEyXSA9IGFyZ3VtZW50c1tfa2V5MTJdO1xuXHQgIH1cblx0XG5cdCAgcmV0dXJuIG5ldyBOb2RlTGlzdChhcmdzKTtcblx0fVxuXHR3aW5kb3cuTkwgPSBOb2RlTGlzdEpTO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gTm9kZUxpc3RKUztcblxuLyoqKi8gfSxcbi8qIDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX193ZWJwYWNrX3JlcXVpcmVfXygzKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0dmFyICRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpLk9iamVjdDtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKXtcblx0ICByZXR1cm4gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0Ly8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcblx0JGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhX193ZWJwYWNrX3JlcXVpcmVfXygxNSksICdPYmplY3QnLCB7ZGVmaW5lUHJvcGVydHk6IF9fd2VicGFja19yZXF1aXJlX18oMTEpLmZ9KTtcblxuLyoqKi8gfSxcbi8qIDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnbG9iYWwgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBjb3JlICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpXG5cdCAgLCBjdHggICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpXG5cdCAgLCBoaWRlICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKVxuXHQgICwgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cdFxuXHR2YXIgJGV4cG9ydCA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHNvdXJjZSl7XG5cdCAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkZcblx0ICAgICwgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuR1xuXHQgICAgLCBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TXG5cdCAgICAsIElTX1BST1RPICA9IHR5cGUgJiAkZXhwb3J0LlBcblx0ICAgICwgSVNfQklORCAgID0gdHlwZSAmICRleHBvcnQuQlxuXHQgICAgLCBJU19XUkFQICAgPSB0eXBlICYgJGV4cG9ydC5XXG5cdCAgICAsIGV4cG9ydHMgICA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pXG5cdCAgICAsIGV4cFByb3RvICA9IGV4cG9ydHNbUFJPVE9UWVBFXVxuXHQgICAgLCB0YXJnZXQgICAgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG5cdCAgICAsIGtleSwgb3duLCBvdXQ7XG5cdCAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG5cdCAgZm9yKGtleSBpbiBzb3VyY2Upe1xuXHQgICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG5cdCAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuXHQgICAgaWYob3duICYmIGtleSBpbiBleHBvcnRzKWNvbnRpbnVlO1xuXHQgICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcblx0ICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG5cdCAgICAvLyBwcmV2ZW50IGdsb2JhbCBwb2xsdXRpb24gZm9yIG5hbWVzcGFjZXNcblx0ICAgIGV4cG9ydHNba2V5XSA9IElTX0dMT0JBTCAmJiB0eXBlb2YgdGFyZ2V0W2tleV0gIT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZVtrZXldXG5cdCAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuXHQgICAgOiBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbClcblx0ICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2UgdGhlbSBpbiBsaWJyYXJ5XG5cdCAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uKEMpe1xuXHQgICAgICB2YXIgRiA9IGZ1bmN0aW9uKGEsIGIsIGMpe1xuXHQgICAgICAgIGlmKHRoaXMgaW5zdGFuY2VvZiBDKXtcblx0ICAgICAgICAgIHN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtcblx0ICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEM7XG5cdCAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDKGEpO1xuXHQgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQyhhLCBiKTtcblx0ICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuXHQgICAgICAgIH0gcmV0dXJuIEMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgfTtcblx0ICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuXHQgICAgICByZXR1cm4gRjtcblx0ICAgIC8vIG1ha2Ugc3RhdGljIHZlcnNpb25zIGZvciBwcm90b3R5cGUgbWV0aG9kc1xuXHQgICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuXHQgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLm1ldGhvZHMuJU5BTUUlXG5cdCAgICBpZihJU19QUk9UTyl7XG5cdCAgICAgIChleHBvcnRzLnZpcnR1YWwgfHwgKGV4cG9ydHMudmlydHVhbCA9IHt9KSlba2V5XSA9IG91dDtcblx0ICAgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSVcblx0ICAgICAgaWYodHlwZSAmICRleHBvcnQuUiAmJiBleHBQcm90byAmJiAhZXhwUHJvdG9ba2V5XSloaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXHQvLyB0eXBlIGJpdG1hcFxuXHQkZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuXHQkZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuXHQkZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuXHQkZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG5cdCRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuXHQkZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcblx0JGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG5cdCRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YCBcblx0bW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuXG4vKioqLyB9LFxuLyogNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcblx0dmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG5cdCAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHRpZih0eXBlb2YgX19nID09ICdudW1iZXInKV9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4vKioqLyB9LFxuLyogNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHt2ZXJzaW9uOiAnMi40LjAnfTtcblx0aWYodHlwZW9mIF9fZSA9PSAnbnVtYmVyJylfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbi8qKiovIH0sXG4vKiA4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcblx0dmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCl7XG5cdCAgYUZ1bmN0aW9uKGZuKTtcblx0ICBpZih0aGF0ID09PSB1bmRlZmluZWQpcmV0dXJuIGZuO1xuXHQgIHN3aXRjaChsZW5ndGgpe1xuXHQgICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYSl7XG5cdCAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuXHQgICAgfTtcblx0ICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEsIGIpe1xuXHQgICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcblx0ICAgIH07XG5cdCAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbihhLCBiLCBjKXtcblx0ICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG5cdCAgICB9O1xuXHQgIH1cblx0ICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7XG5cdCAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgaWYodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGRQICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuXHQgICwgY3JlYXRlRGVzYyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpID8gZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcblx0ICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuXHR9IDogZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcblx0ICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuXHQgIHJldHVybiBvYmplY3Q7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGFuT2JqZWN0ICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcblx0ICAsIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNClcblx0ICAsIHRvUHJpbWl0aXZlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0ICAsIGRQICAgICAgICAgICAgID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXHRcblx0ZXhwb3J0cy5mID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKXtcblx0ICBhbk9iamVjdChPKTtcblx0ICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG5cdCAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG5cdCAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcblx0ICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcblx0ICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG5cdCAgaWYoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKXRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG5cdCAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKU9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuXHQgIHJldHVybiBPO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9ICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXygxNikoZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19yZXF1aXJlX18oMTcpKCdkaXYnKSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcblx0fSk7XG5cbi8qKiovIH0sXG4vKiAxNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxuXHRtb2R1bGUuZXhwb3J0cyA9ICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KShmdW5jdGlvbigpe1xuXHQgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG5cdH0pO1xuXG4vKioqLyB9LFxuLyogMTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYyl7XG5cdCAgdHJ5IHtcblx0ICAgIHJldHVybiAhIWV4ZWMoKTtcblx0ICB9IGNhdGNoKGUpe1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpXG5cdCAgLCBkb2N1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNikuZG9jdW1lbnRcblx0ICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcblx0ICAsIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuXHR2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblx0Ly8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcblx0Ly8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XG5cdCAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gaXQ7XG5cdCAgdmFyIGZuLCB2YWw7XG5cdCAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuXHQgIGlmKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcblx0ICBpZighUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuXHQgIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuXHQgIHJldHVybiB7XG5cdCAgICBlbnVtZXJhYmxlICA6ICEoYml0bWFwICYgMSksXG5cdCAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG5cdCAgICB3cml0YWJsZSAgICA6ICEoYml0bWFwICYgNCksXG5cdCAgICB2YWx1ZSAgICAgICA6IHZhbHVlXG5cdCAgfTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDIwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oMjEpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cbi8qKiovIH0sXG4vKiAyMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMik7XG5cdF9fd2VicGFja19yZXF1aXJlX18oNTEpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTUpLmYoJ2l0ZXJhdG9yJyk7XG5cbi8qKiovIH0sXG4vKiAyMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgJGF0ICA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpKHRydWUpO1xuXHRcblx0Ly8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbihpdGVyYXRlZCl7XG5cdCAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuXHQgIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG5cdC8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcblx0fSwgZnVuY3Rpb24oKXtcblx0ICB2YXIgTyAgICAgPSB0aGlzLl90XG5cdCAgICAsIGluZGV4ID0gdGhpcy5faVxuXHQgICAgLCBwb2ludDtcblx0ICBpZihpbmRleCA+PSBPLmxlbmd0aClyZXR1cm4ge3ZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWV9O1xuXHQgIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcblx0ICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcblx0ICByZXR1cm4ge3ZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2V9O1xuXHR9KTtcblxuLyoqKi8gfSxcbi8qIDIzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNClcblx0ICAsIGRlZmluZWQgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpO1xuXHQvLyB0cnVlICAtPiBTdHJpbmcjYXRcblx0Ly8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVE9fU1RSSU5HKXtcblx0ICByZXR1cm4gZnVuY3Rpb24odGhhdCwgcG9zKXtcblx0ICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpXG5cdCAgICAgICwgaSA9IHRvSW50ZWdlcihwb3MpXG5cdCAgICAgICwgbCA9IHMubGVuZ3RoXG5cdCAgICAgICwgYSwgYjtcblx0ICAgIGlmKGkgPCAwIHx8IGkgPj0gbClyZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG5cdCAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuXHQgICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcblx0ICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcblx0ICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG5cdCAgfTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDI0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyA3LjEuNCBUb0ludGVnZXJcblx0dmFyIGNlaWwgID0gTWF0aC5jZWlsXG5cdCAgLCBmbG9vciA9IE1hdGguZmxvb3I7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIGlmKGl0ID09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG5cdCAgcmV0dXJuIGl0O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0dmFyIExJQlJBUlkgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNylcblx0ICAsICRleHBvcnQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KVxuXHQgICwgcmVkZWZpbmUgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KVxuXHQgICwgaGlkZSAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKVxuXHQgICwgaGFzICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgSXRlcmF0b3JzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKVxuXHQgICwgJGl0ZXJDcmVhdGUgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMxKVxuXHQgICwgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KVxuXHQgICwgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5KVxuXHQgICwgSVRFUkFUT1IgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgnaXRlcmF0b3InKVxuXHQgICwgQlVHR1kgICAgICAgICAgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSkgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuXHQgICwgRkZfSVRFUkFUT1IgICAgPSAnQEBpdGVyYXRvcidcblx0ICAsIEtFWVMgICAgICAgICAgID0gJ2tleXMnXG5cdCAgLCBWQUxVRVMgICAgICAgICA9ICd2YWx1ZXMnO1xuXHRcblx0dmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKXtcblx0ICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cdCAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpe1xuXHQgICAgaWYoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pcmV0dXJuIHByb3RvW2tpbmRdO1xuXHQgICAgc3dpdGNoKGtpbmQpe1xuXHQgICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG5cdCAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG5cdCAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG5cdCAgfTtcblx0ICB2YXIgVEFHICAgICAgICA9IE5BTUUgKyAnIEl0ZXJhdG9yJ1xuXHQgICAgLCBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVNcblx0ICAgICwgVkFMVUVTX0JVRyA9IGZhbHNlXG5cdCAgICAsIHByb3RvICAgICAgPSBCYXNlLnByb3RvdHlwZVxuXHQgICAgLCAkbmF0aXZlICAgID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdXG5cdCAgICAsICRkZWZhdWx0ICAgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKVxuXHQgICAgLCAkZW50cmllcyAgID0gREVGQVVMVCA/ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKSA6IHVuZGVmaW5lZFxuXHQgICAgLCAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZVxuXHQgICAgLCBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuXHQgIC8vIEZpeCBuYXRpdmVcblx0ICBpZigkYW55TmF0aXZlKXtcblx0ICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKSk7XG5cdCAgICBpZihJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSl7XG5cdCAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcblx0ICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG5cdCAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuXHQgICAgICBpZighTElCUkFSWSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuXHQgICAgfVxuXHQgIH1cblx0ICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG5cdCAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKXtcblx0ICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuXHQgICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcblx0ICB9XG5cdCAgLy8gRGVmaW5lIGl0ZXJhdG9yXG5cdCAgaWYoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpe1xuXHQgICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcblx0ICB9XG5cdCAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuXHQgIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuXHQgIEl0ZXJhdG9yc1tUQUddICA9IHJldHVyblRoaXM7XG5cdCAgaWYoREVGQVVMVCl7XG5cdCAgICBtZXRob2RzID0ge1xuXHQgICAgICB2YWx1ZXM6ICBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcblx0ICAgICAga2V5czogICAgSVNfU0VUICAgICA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuXHQgICAgICBlbnRyaWVzOiAkZW50cmllc1xuXHQgICAgfTtcblx0ICAgIGlmKEZPUkNFRClmb3Ioa2V5IGluIG1ldGhvZHMpe1xuXHQgICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcblx0ICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG5cdCAgfVxuXHQgIHJldHVybiBtZXRob2RzO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gdHJ1ZTtcblxuLyoqKi8gfSxcbi8qIDI4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXG4vKioqLyB9LFxuLyogMjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdHZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuXHQgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8qKiovIH0sXG4vKiAzMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgY3JlYXRlICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyKVxuXHQgICwgZGVzY3JpcHRvciAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KVxuXHQgICwgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KVxuXHQgICwgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblx0XG5cdC8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTApKEl0ZXJhdG9yUHJvdG90eXBlLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgnaXRlcmF0b3InKSwgZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH0pO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCl7XG5cdCAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7bmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KX0pO1xuXHQgIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuXHR2YXIgYW5PYmplY3QgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKVxuXHQgICwgZFBzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzKVxuXHQgICwgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1KVxuXHQgICwgSUVfUFJPVE8gICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyKSgnSUVfUFJPVE8nKVxuXHQgICwgRW1wdHkgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XG5cdCAgLCBQUk9UT1RZUEUgICA9ICdwcm90b3R5cGUnO1xuXHRcblx0Ly8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxuXHR2YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XG5cdCAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcblx0ICB2YXIgaWZyYW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNykoJ2lmcmFtZScpXG5cdCAgICAsIGkgICAgICA9IGVudW1CdWdLZXlzLmxlbmd0aFxuXHQgICAgLCBsdCAgICAgPSAnPCdcblx0ICAgICwgZ3QgICAgID0gJz4nXG5cdCAgICAsIGlmcmFtZURvY3VtZW50O1xuXHQgIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHQgIF9fd2VicGFja19yZXF1aXJlX18oNDYpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG5cdCAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuXHQgIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG5cdCAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuXHQgIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG5cdCAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuXHQgIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcblx0ICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuXHQgIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuXHQgIHdoaWxlKGktLSlkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcblx0ICByZXR1cm4gY3JlYXRlRGljdCgpO1xuXHR9O1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKXtcblx0ICB2YXIgcmVzdWx0O1xuXHQgIGlmKE8gIT09IG51bGwpe1xuXHQgICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuXHQgICAgcmVzdWx0ID0gbmV3IEVtcHR5O1xuXHQgICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG5cdCAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG5cdCAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcblx0ICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuXHQgIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMzMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBkUCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG5cdCAgLCBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpXG5cdCAgLCBnZXRLZXlzICA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKXtcblx0ICBhbk9iamVjdChPKTtcblx0ICB2YXIga2V5cyAgID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKVxuXHQgICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuXHQgICAgLCBpID0gMFxuXHQgICAgLCBQO1xuXHQgIHdoaWxlKGxlbmd0aCA+IGkpZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcblx0ICByZXR1cm4gTztcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcblx0dmFyICRrZXlzICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNSlcblx0ICAsIGVudW1CdWdLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NSk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTyl7XG5cdCAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgaGFzICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIHRvSU9iamVjdCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCBhcnJheUluZGV4T2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM5KShmYWxzZSlcblx0ICAsIElFX1BST1RPICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpKCdJRV9QUk9UTycpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIG5hbWVzKXtcblx0ICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcblx0ICAgICwgaSAgICAgID0gMFxuXHQgICAgLCByZXN1bHQgPSBbXVxuXHQgICAgLCBrZXk7XG5cdCAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuXHQgIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcblx0ICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XG5cdCAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuXHQgIH1cblx0ICByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xuXHR2YXIgSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzcpXG5cdCAgLCBkZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xuXHR2YXIgY29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOCk7XG5cdG1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdHZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG5cdC8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG5cdHZhciB0b0lPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2KVxuXHQgICwgdG9MZW5ndGggID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MClcblx0ICAsIHRvSW5kZXggICA9IF9fd2VicGFja19yZXF1aXJlX18oNDEpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcblx0ICByZXR1cm4gZnVuY3Rpb24oJHRoaXMsIGVsLCBmcm9tSW5kZXgpe1xuXHQgICAgdmFyIE8gICAgICA9IHRvSU9iamVjdCgkdGhpcylcblx0ICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcblx0ICAgICAgLCBpbmRleCAgPSB0b0luZGV4KGZyb21JbmRleCwgbGVuZ3RoKVxuXHQgICAgICAsIHZhbHVlO1xuXHQgICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuXHQgICAgaWYoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpd2hpbGUobGVuZ3RoID4gaW5kZXgpe1xuXHQgICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG5cdCAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuXHQgICAgLy8gQXJyYXkjdG9JbmRleCBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuXHQgICAgfSBlbHNlIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTyl7XG5cdCAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcblx0ICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMS4xNSBUb0xlbmd0aFxuXHR2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNClcblx0ICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxuXHR9O1xuXG4vKioqLyB9LFxuLyogNDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KVxuXHQgICwgbWF4ICAgICAgID0gTWF0aC5tYXhcblx0ICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGluZGV4LCBsZW5ndGgpe1xuXHQgIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcblx0ICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MykoJ2tleXMnKVxuXHQgICwgdWlkICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcblx0ICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJ1xuXHQgICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG5cdCAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB7fSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA0NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIGlkID0gMFxuXHQgICwgcHggPSBNYXRoLnJhbmRvbSgpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG5cdCAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQ1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5cdG1vZHVsZS5leHBvcnRzID0gKFxuXHQgICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG5cdCkuc3BsaXQoJywnKTtcblxuLyoqKi8gfSxcbi8qIDQ2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNikuZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4vKioqLyB9LFxuLyogNDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBkZWYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKS5mXG5cdCAgLCBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgVEFHID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OCkoJ3RvU3RyaW5nVGFnJyk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuXHQgIGlmKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpZGVmKGl0LCBUQUcsIHtjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWd9KTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQ4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgc3RvcmUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDMpKCd3a3MnKVxuXHQgICwgdWlkICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDQpXG5cdCAgLCBTeW1ib2wgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KS5TeW1ib2xcblx0ICAsIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cdFxuXHR2YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuXHQgIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuXHQgICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcblx0fTtcblx0XG5cdCRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG5cbi8qKiovIH0sXG4vKiA0OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcblx0dmFyIGhhcyAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIHRvT2JqZWN0ICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MClcblx0ICAsIElFX1BST1RPICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MikoJ0lFX1BST1RPJylcblx0ICAsIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uKE8pe1xuXHQgIE8gPSB0b09iamVjdChPKTtcblx0ICBpZihoYXMoTywgSUVfUFJPVE8pKXJldHVybiBPW0lFX1BST1RPXTtcblx0ICBpZih0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKXtcblx0ICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblx0ICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcblx0dmFyIGRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1Mik7XG5cdHZhciBnbG9iYWwgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KVxuXHQgICwgaGlkZSAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG5cdCAgLCBJdGVyYXRvcnMgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMClcblx0ICAsIFRPX1NUUklOR19UQUcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgndG9TdHJpbmdUYWcnKTtcblx0XG5cdGZvcih2YXIgY29sbGVjdGlvbnMgPSBbJ05vZGVMaXN0JywgJ0RPTVRva2VuTGlzdCcsICdNZWRpYUxpc3QnLCAnU3R5bGVTaGVldExpc3QnLCAnQ1NTUnVsZUxpc3QnXSwgaSA9IDA7IGkgPCA1OyBpKyspe1xuXHQgIHZhciBOQU1FICAgICAgID0gY29sbGVjdGlvbnNbaV1cblx0ICAgICwgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXVxuXHQgICAgLCBwcm90byAgICAgID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcblx0ICBpZihwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10paGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG5cdCAgSXRlcmF0b3JzW05BTUVdID0gSXRlcmF0b3JzLkFycmF5O1xuXHR9XG5cbi8qKiovIH0sXG4vKiA1MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oNTMpXG5cdCAgLCBzdGVwICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NClcblx0ICAsIEl0ZXJhdG9ycyAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKVxuXHQgICwgdG9JT2JqZWN0ICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpO1xuXHRcblx0Ly8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuXHQvLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuXHQvLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG5cdC8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG5cdCAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuXHQgIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG5cdCAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcblx0Ly8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG5cdH0sIGZ1bmN0aW9uKCl7XG5cdCAgdmFyIE8gICAgID0gdGhpcy5fdFxuXHQgICAgLCBraW5kICA9IHRoaXMuX2tcblx0ICAgICwgaW5kZXggPSB0aGlzLl9pKys7XG5cdCAgaWYoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpe1xuXHQgICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcblx0ICAgIHJldHVybiBzdGVwKDEpO1xuXHQgIH1cblx0ICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGluZGV4KTtcblx0ICBpZihraW5kID09ICd2YWx1ZXMnKXJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcblx0ICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG5cdH0sICd2YWx1ZXMnKTtcblx0XG5cdC8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcblx0SXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblx0XG5cdGFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcblx0YWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5cdGFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcblxuLyoqKi8gfSxcbi8qIDUzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH07XG5cbi8qKiovIH0sXG4vKiA1NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkb25lLCB2YWx1ZSl7XG5cdCAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cy5mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OCk7XG5cbi8qKiovIH0sXG4vKiA1NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3KSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogNTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oNTgpO1xuXHR2YXIgJE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNykuT2JqZWN0O1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuXHQgIHJldHVybiAkT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG5cdF9fd2VicGFja19yZXF1aXJlX18oNTkpKCdnZXRPd25Qcm9wZXJ0eU5hbWVzJywgZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg2MCkuZjtcblx0fSk7XG5cbi8qKiovIH0sXG4vKiA1OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG5cdHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KVxuXHQgICwgY29yZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcblx0ICAsIGZhaWxzICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVksIGV4ZWMpe1xuXHQgIHZhciBmbiAgPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV1cblx0ICAgICwgZXhwID0ge307XG5cdCAgZXhwW0tFWV0gPSBleGVjKGZuKTtcblx0ICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uKCl7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA2MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xuXHR2YXIgdG9JT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIGdPUE4gICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNjEpLmZcblx0ICAsIHRvU3RyaW5nICA9IHt9LnRvU3RyaW5nO1xuXHRcblx0dmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcblx0ICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblx0XG5cdHZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uKGl0KXtcblx0ICB0cnkge1xuXHQgICAgcmV0dXJuIGdPUE4oaXQpO1xuXHQgIH0gY2F0Y2goZSl7XG5cdCAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcblx0ICB9XG5cdH07XG5cdFxuXHRtb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG5cdCAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogZ09QTih0b0lPYmplY3QoaXQpKTtcblx0fTtcblxuXG4vKioqLyB9LFxuLyogNjEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcblx0dmFyICRrZXlzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1KVxuXHQgICwgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXHRcblx0ZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKXtcblx0ICByZXR1cm4gJGtleXMoTywgaGlkZGVuS2V5cyk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA2MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuXHQgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG5cdCAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDYzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdFxuXHR2YXIgX2RlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0XG5cdHZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcblx0ICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcblx0ICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuXHQgICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG5cdCAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG5cdCAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuXHQgICAgfVxuXHQgIH1cblx0XG5cdCAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcblx0ICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG5cdCAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcblx0ICAgIHJldHVybiBDb25zdHJ1Y3Rvcjtcblx0ICB9O1xuXHR9KCk7XG5cbi8qKiovIH0sXG4vKiA2NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0LyoqXHJcblx0ICogQXJyYXkuZmluZFxyXG5cdCAqL1xuXHRpZiAoIUFycmF5LnByb3RvdHlwZS5maW5kKSB7XG5cdCAgQXJyYXkucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG5cdCAgICAndXNlIHN0cmljdCc7XG5cdFxuXHQgICAgaWYgKHRoaXMgPT0gbnVsbCkge1xuXHQgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUuZmluZCBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQnKTtcblx0ICAgIH1cblx0ICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblx0ICAgIH1cblx0ICAgIHZhciBsaXN0ID0gT2JqZWN0KHRoaXMpO1xuXHQgICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoID4+PiAwO1xuXHQgICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07XG5cdCAgICB2YXIgdmFsdWU7XG5cdFxuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuXHQgICAgICB2YWx1ZSA9IGxpc3RbaV07XG5cdCAgICAgIGlmIChwcmVkaWNhdGUuY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaSwgbGlzdCkpIHtcblx0ICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiB1bmRlZmluZWQ7XG5cdCAgfTtcblx0fVxuXHRcblx0LypcclxuXHQgKiBjbGFzc0xpc3QuanM6IENyb3NzLWJyb3dzZXIgZnVsbCBlbGVtZW50LmNsYXNzTGlzdCBpbXBsZW1lbnRhdGlvbi5cclxuXHQgKiAxLjEuMjAxNTAzMTJcclxuXHQgKlxyXG5cdCAqIEJ5IEVsaSBHcmV5LCBodHRwOi8vZWxpZ3JleS5jb21cclxuXHQgKiBMaWNlbnNlOiBEZWRpY2F0ZWQgdG8gdGhlIHB1YmxpYyBkb21haW4uXHJcblx0ICogICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvY2xhc3NMaXN0LmpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UubWRcclxuXHQgKi9cblx0LypnbG9iYWwgc2VsZiwgZG9jdW1lbnQsIERPTUV4Y2VwdGlvbiAqL1xuXHQvKiEgQHNvdXJjZSBodHRwOi8vcHVybC5lbGlncmV5LmNvbS9naXRodWIvY2xhc3NMaXN0LmpzL2Jsb2IvbWFzdGVyL2NsYXNzTGlzdC5qcyAqL1xuXHRpZiAoXCJkb2N1bWVudFwiIGluIHNlbGYpIHtcblx0ICAvLyBGdWxsIHBvbHlmaWxsIGZvciBicm93c2VycyB3aXRoIG5vIGNsYXNzTGlzdCBzdXBwb3J0XG5cdCAgLy8gSW5jbHVkaW5nIElFIDwgRWRnZSBtaXNzaW5nIFNWR0VsZW1lbnQuY2xhc3NMaXN0XG5cdCAgaWYgKCEoXCJjbGFzc0xpc3RcIiBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiX1wiKSkgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TICYmICEoXCJjbGFzc0xpc3RcIiBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIikpKSB7XG5cdFxuXHQgICAgKGZ1bmN0aW9uICh2aWV3KSB7XG5cdFxuXHQgICAgICBcInVzZSBzdHJpY3RcIjtcblx0XG5cdCAgICAgIGlmICghKCdFbGVtZW50JyBpbiB2aWV3KSkgcmV0dXJuO1xuXHRcblx0ICAgICAgdmFyIGNsYXNzTGlzdFByb3AgPSBcImNsYXNzTGlzdFwiLFxuXHQgICAgICAgICAgcHJvdG9Qcm9wID0gXCJwcm90b3R5cGVcIixcblx0ICAgICAgICAgIGVsZW1DdHJQcm90byA9IHZpZXcuRWxlbWVudFtwcm90b1Byb3BdLFxuXHQgICAgICAgICAgb2JqQ3RyID0gT2JqZWN0LFxuXHQgICAgICAgICAgc3RyVHJpbSA9IFN0cmluZ1twcm90b1Byb3BdLnRyaW0gfHwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoL15cXHMrfFxccyskL2csIFwiXCIpO1xuXHQgICAgICB9LFxuXHQgICAgICAgICAgYXJySW5kZXhPZiA9IEFycmF5W3Byb3RvUHJvcF0uaW5kZXhPZiB8fCBmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgICAgIHZhciBpID0gMCxcblx0ICAgICAgICAgICAgbGVuID0gdGhpcy5sZW5ndGg7XG5cdCAgICAgICAgZm9yICg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgaWYgKGkgaW4gdGhpcyAmJiB0aGlzW2ldID09PSBpdGVtKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gLTE7XG5cdCAgICAgIH1cblx0ICAgICAgLy8gVmVuZG9yczogcGxlYXNlIGFsbG93IGNvbnRlbnQgY29kZSB0byBpbnN0YW50aWF0ZSBET01FeGNlcHRpb25zXG5cdCAgICAgICxcblx0ICAgICAgICAgIERPTUV4ID0gZnVuY3Rpb24gRE9NRXgodHlwZSwgbWVzc2FnZSkge1xuXHQgICAgICAgIHRoaXMubmFtZSA9IHR5cGU7XG5cdCAgICAgICAgdGhpcy5jb2RlID0gRE9NRXhjZXB0aW9uW3R5cGVdO1xuXHQgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBjaGVja1Rva2VuQW5kR2V0SW5kZXggPSBmdW5jdGlvbiBjaGVja1Rva2VuQW5kR2V0SW5kZXgoY2xhc3NMaXN0LCB0b2tlbikge1xuXHQgICAgICAgIGlmICh0b2tlbiA9PT0gXCJcIikge1xuXHQgICAgICAgICAgdGhyb3cgbmV3IERPTUV4KFwiU1lOVEFYX0VSUlwiLCBcIkFuIGludmFsaWQgb3IgaWxsZWdhbCBzdHJpbmcgd2FzIHNwZWNpZmllZFwiKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKC9cXHMvLnRlc3QodG9rZW4pKSB7XG5cdCAgICAgICAgICB0aHJvdyBuZXcgRE9NRXgoXCJJTlZBTElEX0NIQVJBQ1RFUl9FUlJcIiwgXCJTdHJpbmcgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXJcIik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBhcnJJbmRleE9mLmNhbGwoY2xhc3NMaXN0LCB0b2tlbik7XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBDbGFzc0xpc3QgPSBmdW5jdGlvbiBDbGFzc0xpc3QoZWxlbSkge1xuXHQgICAgICAgIHZhciB0cmltbWVkQ2xhc3NlcyA9IHN0clRyaW0uY2FsbChlbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpLFxuXHQgICAgICAgICAgICBjbGFzc2VzID0gdHJpbW1lZENsYXNzZXMgPyB0cmltbWVkQ2xhc3Nlcy5zcGxpdCgvXFxzKy8pIDogW10sXG5cdCAgICAgICAgICAgIGkgPSAwLFxuXHQgICAgICAgICAgICBsZW4gPSBjbGFzc2VzLmxlbmd0aDtcblx0ICAgICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICB0aGlzLnB1c2goY2xhc3Nlc1tpXSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy50b1N0cmluZygpKTtcblx0ICAgICAgICB9O1xuXHQgICAgICB9LFxuXHQgICAgICAgICAgY2xhc3NMaXN0UHJvdG8gPSBDbGFzc0xpc3RbcHJvdG9Qcm9wXSA9IFtdLFxuXHQgICAgICAgICAgY2xhc3NMaXN0R2V0dGVyID0gZnVuY3Rpb24gY2xhc3NMaXN0R2V0dGVyKCkge1xuXHQgICAgICAgIHJldHVybiBuZXcgQ2xhc3NMaXN0KHRoaXMpO1xuXHQgICAgICB9O1xuXHQgICAgICAvLyBNb3N0IERPTUV4Y2VwdGlvbiBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgYWxsb3cgY2FsbGluZyBET01FeGNlcHRpb24ncyB0b1N0cmluZygpXG5cdCAgICAgIC8vIG9uIG5vbi1ET01FeGNlcHRpb25zLiBFcnJvcidzIHRvU3RyaW5nKCkgaXMgc3VmZmljaWVudCBoZXJlLlxuXHQgICAgICBET01FeFtwcm90b1Byb3BdID0gRXJyb3JbcHJvdG9Qcm9wXTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8uaXRlbSA9IGZ1bmN0aW9uIChpKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXNbaV0gfHwgbnVsbDtcblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8uY29udGFpbnMgPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICB0b2tlbiArPSBcIlwiO1xuXHQgICAgICAgIHJldHVybiBjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pICE9PSAtMTtcblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8uYWRkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0b2tlbnMgPSBhcmd1bWVudHMsXG5cdCAgICAgICAgICAgIGkgPSAwLFxuXHQgICAgICAgICAgICBsID0gdG9rZW5zLmxlbmd0aCxcblx0ICAgICAgICAgICAgdG9rZW4sXG5cdCAgICAgICAgICAgIHVwZGF0ZWQgPSBmYWxzZTtcblx0ICAgICAgICBkbyB7XG5cdCAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXSArIFwiXCI7XG5cdCAgICAgICAgICBpZiAoY2hlY2tUb2tlbkFuZEdldEluZGV4KHRoaXMsIHRva2VuKSA9PT0gLTEpIHtcblx0ICAgICAgICAgICAgdGhpcy5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSB3aGlsZSAoKytpIDwgbCk7XG5cdFxuXHQgICAgICAgIGlmICh1cGRhdGVkKSB7XG5cdCAgICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIGNsYXNzTGlzdFByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgdG9rZW5zID0gYXJndW1lbnRzLFxuXHQgICAgICAgICAgICBpID0gMCxcblx0ICAgICAgICAgICAgbCA9IHRva2Vucy5sZW5ndGgsXG5cdCAgICAgICAgICAgIHRva2VuLFxuXHQgICAgICAgICAgICB1cGRhdGVkID0gZmFsc2UsXG5cdCAgICAgICAgICAgIGluZGV4O1xuXHQgICAgICAgIGRvIHtcblx0ICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldICsgXCJcIjtcblx0ICAgICAgICAgIGluZGV4ID0gY2hlY2tUb2tlbkFuZEdldEluZGV4KHRoaXMsIHRva2VuKTtcblx0ICAgICAgICAgIHdoaWxlIChpbmRleCAhPT0gLTEpIHtcblx0ICAgICAgICAgICAgdGhpcy5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gd2hpbGUgKCsraSA8IGwpO1xuXHRcblx0ICAgICAgICBpZiAodXBkYXRlZCkge1xuXHQgICAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by50b2dnbGUgPSBmdW5jdGlvbiAodG9rZW4sIGZvcmNlKSB7XG5cdCAgICAgICAgdG9rZW4gKz0gXCJcIjtcblx0XG5cdCAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuY29udGFpbnModG9rZW4pLFxuXHQgICAgICAgICAgICBtZXRob2QgPSByZXN1bHQgPyBmb3JjZSAhPT0gdHJ1ZSAmJiBcInJlbW92ZVwiIDogZm9yY2UgIT09IGZhbHNlICYmIFwiYWRkXCI7XG5cdFxuXHQgICAgICAgIGlmIChtZXRob2QpIHtcblx0ICAgICAgICAgIHRoaXNbbWV0aG9kXSh0b2tlbik7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICBpZiAoZm9yY2UgPT09IHRydWUgfHwgZm9yY2UgPT09IGZhbHNlKSB7XG5cdCAgICAgICAgICByZXR1cm4gZm9yY2U7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHJldHVybiAhcmVzdWx0O1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuam9pbihcIiBcIik7XG5cdCAgICAgIH07XG5cdFxuXHQgICAgICBpZiAob2JqQ3RyLmRlZmluZVByb3BlcnR5KSB7XG5cdCAgICAgICAgdmFyIGNsYXNzTGlzdFByb3BEZXNjID0ge1xuXHQgICAgICAgICAgZ2V0OiBjbGFzc0xpc3RHZXR0ZXIsXG5cdCAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KGVsZW1DdHJQcm90bywgY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0UHJvcERlc2MpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG5cdCAgICAgICAgICAvLyBJRSA4IGRvZXNuJ3Qgc3VwcG9ydCBlbnVtZXJhYmxlOnRydWVcblx0ICAgICAgICAgIGlmIChleC5udW1iZXIgPT09IC0weDdGRjVFQzU0KSB7XG5cdCAgICAgICAgICAgIGNsYXNzTGlzdFByb3BEZXNjLmVudW1lcmFibGUgPSBmYWxzZTtcblx0ICAgICAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KGVsZW1DdHJQcm90bywgY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0UHJvcERlc2MpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIGlmIChvYmpDdHJbcHJvdG9Qcm9wXS5fX2RlZmluZUdldHRlcl9fKSB7XG5cdCAgICAgICAgZWxlbUN0clByb3RvLl9fZGVmaW5lR2V0dGVyX18oY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0R2V0dGVyKTtcblx0ICAgICAgfVxuXHQgICAgfSkoc2VsZik7XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vIFRoZXJlIGlzIGZ1bGwgb3IgcGFydGlhbCBuYXRpdmUgY2xhc3NMaXN0IHN1cHBvcnQsIHNvIGp1c3QgY2hlY2sgaWYgd2UgbmVlZFxuXHQgICAgLy8gdG8gbm9ybWFsaXplIHRoZSBhZGQvcmVtb3ZlIGFuZCB0b2dnbGUgQVBJcy5cblx0XG5cdCAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICBcInVzZSBzdHJpY3RcIjtcblx0XG5cdCAgICAgIHZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJfXCIpO1xuXHRcblx0ICAgICAgdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImMxXCIsIFwiYzJcIik7XG5cdFxuXHQgICAgICAvLyBQb2x5ZmlsbCBmb3IgSUUgMTAvMTEgYW5kIEZpcmVmb3ggPDI2LCB3aGVyZSBjbGFzc0xpc3QuYWRkIGFuZFxuXHQgICAgICAvLyBjbGFzc0xpc3QucmVtb3ZlIGV4aXN0IGJ1dCBzdXBwb3J0IG9ubHkgb25lIGFyZ3VtZW50IGF0IGEgdGltZS5cblx0ICAgICAgaWYgKCF0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjMlwiKSkge1xuXHQgICAgICAgIHZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiBjcmVhdGVNZXRob2QobWV0aG9kKSB7XG5cdCAgICAgICAgICB2YXIgb3JpZ2luYWwgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlW21ldGhvZF07XG5cdFxuXHQgICAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgIHZhciBpLFxuXHQgICAgICAgICAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblx0XG5cdCAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICAgIHRva2VuID0gYXJndW1lbnRzW2ldO1xuXHQgICAgICAgICAgICAgIG9yaWdpbmFsLmNhbGwodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgY3JlYXRlTWV0aG9kKCdhZGQnKTtcblx0ICAgICAgICBjcmVhdGVNZXRob2QoJ3JlbW92ZScpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKFwiYzNcIiwgZmFsc2UpO1xuXHRcblx0ICAgICAgLy8gUG9seWZpbGwgZm9yIElFIDEwIGFuZCBGaXJlZm94IDwyNCwgd2hlcmUgY2xhc3NMaXN0LnRvZ2dsZSBkb2VzIG5vdFxuXHQgICAgICAvLyBzdXBwb3J0IHRoZSBzZWNvbmQgYXJndW1lbnQuXG5cdCAgICAgIGlmICh0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjM1wiKSkge1xuXHQgICAgICAgIHZhciBfdG9nZ2xlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGU7XG5cdFxuXHQgICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKHRva2VuLCBmb3JjZSkge1xuXHQgICAgICAgICAgaWYgKDEgaW4gYXJndW1lbnRzICYmICF0aGlzLmNvbnRhaW5zKHRva2VuKSA9PT0gIWZvcmNlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmb3JjZTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiBfdG9nZ2xlLmNhbGwodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHRlc3RFbGVtZW50ID0gbnVsbDtcblx0ICAgIH0pKCk7XG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA2NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdGV4cG9ydHMuZ2V0SlNPTiA9IGdldEpTT047XG5cdGV4cG9ydHMuZ2V0U2Nyb2xsQmFyV2lkdGggPSBnZXRTY3JvbGxCYXJXaWR0aDtcblx0ZXhwb3J0cy50cmFuc2xhdGlvbnMgPSB0cmFuc2xhdGlvbnM7XG5cdGV4cG9ydHMuZGVsYXllciA9IGRlbGF5ZXI7XG5cdGV4cG9ydHMuVnVlRml4ZXIgPSBWdWVGaXhlcjtcblx0Ly8gY29lcmNlIGNvbnZlcnQgc29tIHR5cGVzIG9mIGRhdGEgaW50byBhbm90aGVyIHR5cGVcblx0dmFyIGNvZXJjZSA9IGV4cG9ydHMuY29lcmNlID0ge1xuXHQgIC8vIENvbnZlcnQgYSBzdHJpbmcgdG8gYm9vbGVhbS4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHZhbHVlIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBzbyBpZiBpcyBub3QgYm9vbGVhbiwgVnVlIHRocm93IGEgd2FybmluZy5cblx0ICBib29sZWFuOiBmdW5jdGlvbiBib29sZWFuKHZhbCkge1xuXHQgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gdmFsID09PSAnJyB8fCB2YWwgPT09ICd0cnVlJyA/IHRydWUgOiB2YWwgPT09ICdmYWxzZScgfHwgdmFsID09PSAnbnVsbCcgfHwgdmFsID09PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogdmFsIDogdmFsO1xuXHQgIH0sXG5cdCAgLy8gQXR0ZW1wdCB0byBjb252ZXJ0IGEgc3RyaW5nIHZhbHVlIHRvIGEgTnVtYmVyLiBPdGhlcndpc2UsIHJldHVybiAwLlxuXHQgIG51bWJlcjogZnVuY3Rpb24gbnVtYmVyKHZhbCkge1xuXHQgICAgdmFyIGFsdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcblx0ICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyA/IHZhbCA6IHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCB8fCBpc05hTihOdW1iZXIodmFsKSkgPyBhbHQgOiBOdW1iZXIodmFsKTtcblx0ICB9LFxuXHQgIC8vIEF0dGVtcHQgdG8gY29udmVydCB0byBzdHJpbmcgYW55IHZhbHVlLCBleGNlcHQgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuXHQgIHN0cmluZzogZnVuY3Rpb24gc3RyaW5nKHZhbCkge1xuXHQgICAgcmV0dXJuIHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCA/ICcnIDogdmFsICsgJyc7XG5cdCAgfSxcblx0ICAvLyBQYXR0ZXJuIGFjY2VwdCBSZWdFeHAsIGZ1bmN0aW9uLCBvciBzdHJpbmcgKGNvbnZlcnRlZCB0byBSZWdFeHApLiBPdGhlcndpc2UgcmV0dXJuIG51bGwuXG5cdCAgcGF0dGVybjogZnVuY3Rpb24gcGF0dGVybih2YWwpIHtcblx0ICAgIHJldHVybiB2YWwgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB2YWwgaW5zdGFuY2VvZiBSZWdFeHAgPyB2YWwgOiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IG5ldyBSZWdFeHAodmFsKSA6IG51bGw7XG5cdCAgfVxuXHR9O1xuXHRcblx0ZnVuY3Rpb24gZ2V0SlNPTih1cmwpIHtcblx0ICB2YXIgcmVxdWVzdCA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblx0ICB2YXIgZGF0YSA9IHt9O1xuXHQgIC8vIHAgKC1zaW11bGF0ZWQtIHByb21pc2UpXG5cdCAgdmFyIHAgPSB7XG5cdCAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKGZuMSwgZm4yKSB7XG5cdCAgICAgIHJldHVybiBwLmRvbmUoZm4xKS5mYWlsKGZuMik7XG5cdCAgICB9LFxuXHQgICAgY2F0Y2g6IGZ1bmN0aW9uIF9jYXRjaChmbikge1xuXHQgICAgICByZXR1cm4gcC5mYWlsKGZuKTtcblx0ICAgIH0sXG5cdCAgICBhbHdheXM6IGZ1bmN0aW9uIGFsd2F5cyhmbikge1xuXHQgICAgICByZXR1cm4gcC5kb25lKGZuKS5mYWlsKGZuKTtcblx0ICAgIH1cblx0ICB9O1xuXHQgIFsnZG9uZScsICdmYWlsJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuXHQgICAgZGF0YVtuYW1lXSA9IFtdO1xuXHQgICAgcFtuYW1lXSA9IGZ1bmN0aW9uIChmbikge1xuXHQgICAgICBpZiAoZm4gaW5zdGFuY2VvZiBGdW5jdGlvbikgZGF0YVtuYW1lXS5wdXNoKGZuKTtcblx0ICAgICAgcmV0dXJuIHA7XG5cdCAgICB9O1xuXHQgIH0pO1xuXHQgIHAuZG9uZShKU09OLnBhcnNlKTtcblx0ICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgPT09IDQpIHtcblx0ICAgICAgdmFyIHJlc3BvbnNlO1xuXHQgICAgICB2YXIgaTtcblx0ICAgICAgdmFyIHZhbHVlO1xuXHRcblx0ICAgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgZSA9IHsgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyB9O1xuXHQgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG5cdCAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICByZXNwb25zZSA9IHJlcXVlc3QucmVzcG9uc2VUZXh0O1xuXHRcblx0ICAgICAgICAgICAgZm9yIChpIGluIGRhdGEuZG9uZSkge1xuXHQgICAgICAgICAgICAgIHZhbHVlID0gZGF0YS5kb25lW2ldKHJlc3BvbnNlKTtcblx0XG5cdCAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgZGF0YS5mYWlsLmZvckVhY2goZnVuY3Rpb24gKGZhaWwpIHtcblx0ICAgICAgICAgICAgICByZXR1cm4gZmFpbChlcnIpO1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgZGF0YS5mYWlsLmZvckVhY2goZnVuY3Rpb24gKGZhaWwpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhaWwoZSk7XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pKCk7XG5cdCAgICB9XG5cdCAgfTtcblx0ICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHVybCk7XG5cdCAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuXHQgIHJlcXVlc3Quc2VuZCgpO1xuXHQgIHJldHVybiBwO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBnZXRTY3JvbGxCYXJXaWR0aCgpIHtcblx0ICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCA8PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7XG5cdCAgICByZXR1cm4gMDtcblx0ICB9XG5cdCAgdmFyIGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuXHQgIGlubmVyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuXHQgIGlubmVyLnN0eWxlLmhlaWdodCA9ICcyMDBweCc7XG5cdFxuXHQgIHZhciBvdXRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHQgIG91dGVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0ICBvdXRlci5zdHlsZS50b3AgPSAnMHB4Jztcblx0ICBvdXRlci5zdHlsZS5sZWZ0ID0gJzBweCc7XG5cdCAgb3V0ZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuXHQgIG91dGVyLnN0eWxlLndpZHRoID0gJzIwMHB4Jztcblx0ICBvdXRlci5zdHlsZS5oZWlnaHQgPSAnMTUwcHgnO1xuXHQgIG91dGVyLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cdCAgb3V0ZXIuYXBwZW5kQ2hpbGQoaW5uZXIpO1xuXHRcblx0ICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyKTtcblx0ICB2YXIgdzEgPSBpbm5lci5vZmZzZXRXaWR0aDtcblx0ICBvdXRlci5zdHlsZS5vdmVyZmxvdyA9ICdzY3JvbGwnO1xuXHQgIHZhciB3MiA9IGlubmVyLm9mZnNldFdpZHRoO1xuXHQgIGlmICh3MSA9PT0gdzIpIHcyID0gb3V0ZXIuY2xpZW50V2lkdGg7XG5cdFxuXHQgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQob3V0ZXIpO1xuXHRcblx0ICByZXR1cm4gdzEgLSB3Mjtcblx0fVxuXHRcblx0Ly8gcmV0dXJuIGFsbCB0aGUgdHJhbnNsYXRpb25zIG9yIHRoZSBkZWZhdWx0IGxhbmd1YWdlIChlbmdsaXNoKVxuXHRmdW5jdGlvbiB0cmFuc2xhdGlvbnMoKSB7XG5cdCAgdmFyIGxhbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdlbic7XG5cdFxuXHQgIHZhciB0ZXh0ID0ge1xuXHQgICAgZGF5c09mV2VlazogWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddLFxuXHQgICAgbGltaXQ6ICdMaW1pdCByZWFjaGVkICh7e2xpbWl0fX0gaXRlbXMgbWF4KS4nLFxuXHQgICAgbG9hZGluZzogJ0xvYWRpbmcuLi4nLFxuXHQgICAgbWluTGVuZ3RoOiAnTWluLiBMZW5ndGgnLFxuXHQgICAgbW9udGhzOiBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXSxcblx0ICAgIG5vdFNlbGVjdGVkOiAnTm90aGluZyBTZWxlY3RlZCcsXG5cdCAgICByZXF1aXJlZDogJ1JlcXVpcmVkJyxcblx0ICAgIHNlYXJjaDogJ1NlYXJjaCdcblx0ICB9O1xuXHQgIHJldHVybiB3aW5kb3cuVnVlU3RyYXBMYW5nID8gd2luZG93LlZ1ZVN0cmFwTGFuZyhsYW5nKSA6IHRleHQ7XG5cdH1cblx0XG5cdC8vIGRlbGF5ZXI6IHNldCBhIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZSBhZnRlciBhIGRlbGF5XG5cdC8vIEBwYXJhbXMgKGZ1bmN0aW9uLCBkZWxheV9wcm9wIG9yIHZhbHVlLCBkZWZhdWx0X3ZhbHVlKVxuXHRmdW5jdGlvbiBkZWxheWVyKGZuLCB2YXJUaW1lcikge1xuXHQgIHZhciBpZk5hTiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMTAwO1xuXHRcblx0ICBmdW5jdGlvbiB0b0ludChlbCkge1xuXHQgICAgcmV0dXJuICgvXlswLTldKyQvLnRlc3QoZWwpID8gTnVtYmVyKGVsKSB8fCAxIDogbnVsbFxuXHQgICAgKTtcblx0ICB9XG5cdCAgdmFyIHRpbWVySWQ7XG5cdCAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcblx0ICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcblx0ICAgIH1cblx0XG5cdCAgICBpZiAodGltZXJJZCkgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuXHQgICAgdGltZXJJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICBmbi5hcHBseShfdGhpcywgYXJncyk7XG5cdCAgICB9LCB0b0ludCh2YXJUaW1lcikgfHwgdG9JbnQodGhpc1t2YXJUaW1lcl0pIHx8IGlmTmFOKTtcblx0ICB9O1xuXHR9XG5cdFxuXHQvLyBGaXggYSB2dWUgaW5zdGFuY2UgTGlmZWN5Y2xlIHRvIHZ1ZSAxLzIgKGp1c3QgdGhlIGJhc2ljIGVsZW1lbnRzLCBpcyBub3QgYSByZWFsIHBhcnNlciwgc28gdGhpcyB3b3JrIG9ubHkgaWYgeW91ciBjb2RlIGlzIGNvbXBhdGlibGUgd2l0aCBib3RoKVxuXHQvLyAoV2FpdGluZyBmb3IgdGVzdGluZylcblx0ZnVuY3Rpb24gVnVlRml4ZXIodnVlKSB7XG5cdCAgdmFyIHZ1ZTIgPSAhd2luZG93LlZ1ZSB8fCAhd2luZG93LlZ1ZS5wYXJ0aWFsO1xuXHQgIHZhciBtaXhpbiA9IHtcblx0ICAgIGNvbXB1dGVkOiB7XG5cdCAgICAgIHZ1ZTI6IGZ1bmN0aW9uIHZ1ZTIoKSB7XG5cdCAgICAgICAgcmV0dXJuICF0aGlzLiRkaXNwYXRjaDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH07XG5cdCAgaWYgKCF2dWUyKSB7XG5cdCAgICAvL3RyYW5zbGF0ZSB2dWUyIGF0dHJpYnV0ZXMgdG8gdnVlMVxuXHQgICAgaWYgKHZ1ZS5iZWZvcmVDcmVhdGUpIHtcblx0ICAgICAgbWl4aW4uY3JlYXRlID0gdnVlLmJlZm9yZUNyZWF0ZTtcblx0ICAgICAgZGVsZXRlIHZ1ZS5iZWZvcmVDcmVhdGU7XG5cdCAgICB9XG5cdCAgICBpZiAodnVlLmJlZm9yZU1vdW50KSB7XG5cdCAgICAgIHZ1ZS5iZWZvcmVDb21waWxlID0gdnVlLmJlZm9yZU1vdW50O1xuXHQgICAgICBkZWxldGUgdnVlLmJlZm9yZU1vdW50O1xuXHQgICAgfVxuXHQgICAgaWYgKHZ1ZS5tb3VudGVkKSB7XG5cdCAgICAgIHZ1ZS5yZWFkeSA9IHZ1ZS5tb3VudGVkO1xuXHQgICAgICBkZWxldGUgdnVlLm1vdW50ZWQ7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vdHJhbnNsYXRlIHZ1ZTEgYXR0cmlidXRlcyB0byB2dWUyXG5cdCAgICBpZiAodnVlLmJlZm9yZUNvbXBpbGUpIHtcblx0ICAgICAgdnVlLmJlZm9yZU1vdW50ID0gdnVlLmJlZm9yZUNvbXBpbGU7XG5cdCAgICAgIGRlbGV0ZSB2dWUuYmVmb3JlQ29tcGlsZTtcblx0ICAgIH1cblx0ICAgIGlmICh2dWUuY29tcGlsZWQpIHtcblx0ICAgICAgbWl4aW4uY29tcGlsZWQgPSB2dWUuY29tcGlsZWQ7XG5cdCAgICAgIGRlbGV0ZSB2dWUuY29tcGlsZWQ7XG5cdCAgICB9XG5cdCAgICBpZiAodnVlLnJlYWR5KSB7XG5cdCAgICAgIHZ1ZS5tb3VudGVkID0gdnVlLnJlYWR5O1xuXHQgICAgICBkZWxldGUgdnVlLnJlYWR5O1xuXHQgICAgfVxuXHQgIH1cblx0ICBpZiAoIXZ1ZS5taXhpbnMpIHtcblx0ICAgIHZ1ZS5taXhpbnMgPSBbXTtcblx0ICB9XG5cdCAgdnVlLm1peGlucy51bnNoaWZ0KG1peGluKTtcblx0ICByZXR1cm4gdnVlO1xuXHR9XG5cbi8qKiovIH0sXG4vKiA2NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKHByb2Nlc3MpIHsndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0LyoqXHJcblx0ICogQ2xpY2sgb3V0c2lkZSBkaXJlY3RpdmVcclxuXHQgKi9cblx0dmFyIGJpbmRlZCA9IFtdO1xuXHRcblx0ZnVuY3Rpb24gaGFuZGxlcihlKSB7XG5cdCAgYmluZGVkLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICBpZiAoIWVsLm5vZGUuY29udGFpbnMoZS50YXJnZXQpKSBlbC5jYWxsYmFjayhlKTtcblx0ICB9KTtcblx0fVxuXHRcblx0ZnVuY3Rpb24gYWRkTGlzdGVuZXIobm9kZSwgY2FsbGJhY2spIHtcblx0ICBpZiAoIWJpbmRlZC5sZW5ndGgpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlciwgZmFsc2UpO1xuXHQgIGJpbmRlZC5wdXNoKHsgbm9kZTogbm9kZSwgY2FsbGJhY2s6IGNhbGxiYWNrIH0pO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihub2RlLCBjYWxsYmFjaykge1xuXHQgIGJpbmRlZCA9IGJpbmRlZC5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICByZXR1cm4gZWwubm9kZSAhPT0gbm9kZSA/IHRydWUgOiAhY2FsbGJhY2sgPyBmYWxzZSA6IGVsLmNhbGxiYWNrICE9PSBjYWxsYmFjaztcblx0ICB9KTtcblx0ICBpZiAoIWJpbmRlZC5sZW5ndGgpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlciwgZmFsc2UpO1xuXHR9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgYmluZDogZnVuY3Rpb24gYmluZChlbCwgYmluZGluZykge1xuXHQgICAgcmVtb3ZlTGlzdGVuZXIoZWwsIGJpbmRpbmcudmFsdWUpO1xuXHQgICAgaWYgKHR5cGVvZiBiaW5kaW5nLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG5cdCAgICAgICAgVnVlLnV0aWwud2FybignQ2xpY2tPdXRzaWRlIG9ubHkgd29yayB3aXRoIGEgZnVuY3Rpb24sIHJlY2VpdmVkOiB2LScgKyBiaW5kaW5nLm5hbWUgKyAnPVwiJyArIGJpbmRpbmcuZXhwcmVzc2lvbiArICdcIicpO1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBhZGRMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShlbCwgYmluZGluZykge1xuXHQgICAgaWYgKGJpbmRpbmcudmFsdWUgIT09IGJpbmRpbmcub2xkVmFsdWUpIHtcblx0ICAgICAgcmVtb3ZlTGlzdGVuZXIoZWwsIGJpbmRpbmcub2xkVmFsdWUpO1xuXHQgICAgICBhZGRMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB1bmJpbmQ6IGZ1bmN0aW9uIHVuYmluZChlbCwgYmluZGluZykge1xuXHQgICAgcmVtb3ZlTGlzdGVuZXIoZWwsIGJpbmRpbmcudmFsdWUpO1xuXHQgIH1cblx0fTtcblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oNjcpKSlcblxuLyoqKi8gfSxcbi8qIDY3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblx0dmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXHRcblx0Ly8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG5cdC8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuXHQvLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG5cdC8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cdFxuXHR2YXIgY2FjaGVkU2V0VGltZW91dDtcblx0dmFyIGNhY2hlZENsZWFyVGltZW91dDtcblx0XG5cdGZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcblx0fVxuXHRmdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG5cdH1cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIHRyeSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuXHQgICAgICAgIH1cblx0ICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG5cdCAgICB9XG5cdH0gKCkpXG5cdGZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG5cdCAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuXHQgICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuXHQgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgICB9XG5cdCAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXHQgICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG5cdCAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG5cdCAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuXHQgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgICB9IGNhdGNoKGUpe1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG5cdCAgICAgICAgfSBjYXRjaChlKXtcblx0ICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3Jcblx0ICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0XG5cdFxuXHR9XG5cdGZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcblx0ICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuXHQgICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuXHQgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH1cblx0ICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcblx0ICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuXHQgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcblx0ICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgICB9XG5cdCAgICB0cnkge1xuXHQgICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3Ncblx0ICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgICB9IGNhdGNoIChlKXtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGUpe1xuXHQgICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cblx0ICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdFxuXHRcblx0XG5cdH1cblx0dmFyIHF1ZXVlID0gW107XG5cdHZhciBkcmFpbmluZyA9IGZhbHNlO1xuXHR2YXIgY3VycmVudFF1ZXVlO1xuXHR2YXIgcXVldWVJbmRleCA9IC0xO1xuXHRcblx0ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuXHQgICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgZHJhaW5pbmcgPSBmYWxzZTtcblx0ICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuXHQgICAgfVxuXHQgICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuXHQgICAgICAgIGRyYWluUXVldWUoKTtcblx0ICAgIH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcblx0ICAgIGlmIChkcmFpbmluZykge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuXHQgICAgZHJhaW5pbmcgPSB0cnVlO1xuXHRcblx0ICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG5cdCAgICB3aGlsZShsZW4pIHtcblx0ICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcblx0ICAgICAgICBxdWV1ZSA9IFtdO1xuXHQgICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcblx0ICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuXHQgICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcblx0ICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG5cdCAgICB9XG5cdCAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuXHQgICAgZHJhaW5pbmcgPSBmYWxzZTtcblx0ICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0fVxuXHRcblx0cHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcblx0ICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcblx0ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG5cdCAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuXHQgICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG5cdCAgICB9XG5cdH07XG5cdFxuXHQvLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5cdGZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuXHQgICAgdGhpcy5mdW4gPSBmdW47XG5cdCAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG5cdH1cblx0SXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG5cdH07XG5cdHByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5cdHByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5cdHByb2Nlc3MuZW52ID0ge307XG5cdHByb2Nlc3MuYXJndiA9IFtdO1xuXHRwcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcblx0cHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXHRcblx0ZnVuY3Rpb24gbm9vcCgpIHt9XG5cdFxuXHRwcm9jZXNzLm9uID0gbm9vcDtcblx0cHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5cdHByb2Nlc3Mub25jZSA9IG5vb3A7XG5cdHByb2Nlc3Mub2ZmID0gbm9vcDtcblx0cHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5cdHByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcblx0cHJvY2Vzcy5lbWl0ID0gbm9vcDtcblx0XG5cdHByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG5cdH07XG5cdFxuXHRwcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xuXHRwcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcblx0fTtcblx0cHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG4vKioqLyB9LFxuLyogNjggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqLyhmdW5jdGlvbihwcm9jZXNzKSB7J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8qKlxyXG5cdCAqIENsaWNrIG91dHNpZGUgZGlyZWN0aXZlXHJcblx0ICovXG5cdHZhciBIQU5ETEVSID0gJ192dWVfc2Nyb2xsX2hhbmRsZXInO1xuXHR2YXIgZXZlbnRzID0gWydyZXNpemUnLCAnc2Nyb2xsJ107XG5cdFxuXHRmdW5jdGlvbiBiaW5kKGVsLCBiaW5kaW5nKSB7XG5cdCAgdW5iaW5kKGVsKTtcblx0XG5cdCAgdmFyIGNhbGxiYWNrID0gYmluZGluZy52YWx1ZTtcblx0ICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuXHQgICAgICBWdWUudXRpbC53YXJuKCdDbGlja091dHNpZGUgb25seSB3b3JrIHdpdGggYSBmdW5jdGlvbiB2YWx1ZSwgcmVjZWl2ZWQ6IHYtJyArIGJpbmRpbmcubmFtZSArICc9XCInICsgYmluZGluZy5leHByZXNzaW9uICsgJ1wiJyk7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIGVsW0hBTkRMRVJdID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgY2FsbGJhY2soZSk7XG5cdCAgICB9O1xuXHQgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZSwgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICAgIH0pO1xuXHQgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGVsW0hBTkRMRVJdLCBmYWxzZSk7XG5cdCAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgZWxbSEFORExFUl0oKTtcblx0ICAgIH0sIDApO1xuXHQgIH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gdW5iaW5kKGVsKSB7XG5cdCAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcblx0ICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGUsIGVsW0hBTkRMRVJdLCBmYWxzZSk7XG5cdCAgfSk7XG5cdCAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIGVsW0hBTkRMRVJdLCBmYWxzZSk7XG5cdCAgZGVsZXRlIGVsW0hBTkRMRVJdO1xuXHR9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgYmluZDogYmluZCxcblx0ICB1bmJpbmQ6IHVuYmluZCxcblx0ICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShlbCwgYmluZGluZykge1xuXHQgICAgaWYgKGJpbmRpbmcudmFsdWUgIT09IGJpbmRpbmcub2xkVmFsdWUpIGJpbmQoZWwsIGJpbmRpbmcpO1xuXHQgIH1cblx0fTtcblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oNjcpKSlcblxuLyoqKi8gfSxcbi8qIDY5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEFjY29yZGlvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtZDRiNzVhOTJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWQ0Yjc1YTkyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQWNjb3JkaW9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDcwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgdHlwZToge1xuXHQgICAgICB0eXBlOiBTdHJpbmcsXG5cdCAgICAgIGRlZmF1bHQ6IG51bGxcblx0ICAgIH0sXG5cdCAgICBvbmVBdEF0aW1lOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IGZhbHNlXG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBvcGVuQ2hpbGQ6IGZ1bmN0aW9uIG9wZW5DaGlsZChjaGlsZCkge1xuXHQgICAgICBpZiAodGhpcy5vbmVBdEF0aW1lKSB7XG5cdCAgICAgICAgdGhpcy4kY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgICAgICAgaWYgKGNoaWxkICE9PSBpdGVtKSB7XG5cdCAgICAgICAgICAgIGl0ZW0ub3BlbiA9IGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5faXNBY2NvcmRpb24gPSB0cnVlO1xuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDcxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLWdyb3VwXCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LWQ0Yjc1YTkyXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogNzIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzMpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzQpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQWZmaXgudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTVlYmRkZWJmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi01ZWJkZGViZlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEFmZml4LnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDczICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfU2Nyb2xsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OCk7XG5cdFxuXHR2YXIgX1Njcm9sbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TY3JvbGwpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBkaXJlY3RpdmVzOiB7XG5cdCAgICBTY3JvbGw6IF9TY3JvbGwyLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICBvZmZzZXQ6IHtcblx0ICAgICAgdHlwZTogTnVtYmVyLFxuXHQgICAgICBkZWZhdWx0OiAwXG5cdCAgICB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgYWZmaXhlZDogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHRvcDogZnVuY3Rpb24gdG9wKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5vZmZzZXQgPiAwID8gdGhpcy5vZmZzZXQgKyAncHgnIDogbnVsbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIC8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9ibG9iL21hc3Rlci9jb21wb25lbnRzL2FmZml4L2luZGV4LmpzeCNMMjBcblx0ICAgIGNoZWNrU2Nyb2xsOiBmdW5jdGlvbiBjaGVja1Njcm9sbCgpIHtcblx0ICAgICAgLy8gaWYgaXMgaGlkZGVuIGRvbid0IGNhbGN1bGF0ZSBhbnl0aGluZ1xuXHQgICAgICBpZiAoISh0aGlzLiRlbC5vZmZzZXRXaWR0aCB8fCB0aGlzLiRlbC5vZmZzZXRIZWlnaHQgfHwgdGhpcy4kZWwuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIC8vIGdldCB3aW5kb3cgc2Nyb2xsIGFuZCBlbGVtZW50IHBvc2l0aW9uIHRvIGRldGVjdCBpZiBoYXZlIHRvIGJlIG5vcm1hbCBvciBhZmZpeGVkXG5cdCAgICAgIHZhciBzY3JvbGwgPSB7fTtcblx0ICAgICAgdmFyIGVsZW1lbnQgPSB7fTtcblx0ICAgICAgdmFyIHJlY3QgPSB0aGlzLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0ICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXHQgICAgICB2YXIgX2FyciA9IFsnVG9wJywgJ0xlZnQnXTtcblx0ICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IF9hcnIubGVuZ3RoOyBfaSsrKSB7XG5cdCAgICAgICAgdmFyIHR5cGUgPSBfYXJyW19pXTtcblx0ICAgICAgICB2YXIgdCA9IHR5cGUudG9Mb3dlckNhc2UoKTtcblx0ICAgICAgICB2YXIgcmV0ID0gd2luZG93WydwYWdlJyArICh0eXBlID09PSAnVG9wJyA/ICdZJyA6ICdYJykgKyAnT2Zmc2V0J107XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9ICdzY3JvbGwnICsgdHlwZTtcblx0ICAgICAgICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcblx0ICAgICAgICAgIC8vIGllNiw3LDggc3RhbmRhcmQgbW9kZVxuXHQgICAgICAgICAgcmV0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W21ldGhvZF07XG5cdCAgICAgICAgICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcblx0ICAgICAgICAgICAgLy8gcXVpcmtzIG1vZGVcblx0ICAgICAgICAgICAgcmV0ID0gZG9jdW1lbnQuYm9keVttZXRob2RdO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBzY3JvbGxbdF0gPSByZXQ7XG5cdCAgICAgICAgZWxlbWVudFt0XSA9IHNjcm9sbFt0XSArIHJlY3RbdF0gLSAodGhpcy4kZWxbJ2NsaWVudCcgKyB0eXBlXSB8fCBib2R5WydjbGllbnQnICsgdHlwZV0gfHwgMCk7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIGZpeCA9IHNjcm9sbC50b3AgPiBlbGVtZW50LnRvcCAtIHRoaXMub2Zmc2V0O1xuXHQgICAgICBpZiAodGhpcy5hZmZpeGVkICE9PSBmaXgpIHtcblx0ICAgICAgICB0aGlzLmFmZml4ZWQgPSBmaXg7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiA3NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJoaWRkZW4tcHJpbnQgaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG5cdCAgfSwgW192bS5fYygnbmF2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzY3JvbGxcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNjcm9sbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jaGVja1Njcm9sbCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY2hlY2tTY3JvbGxcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJicy1kb2NzLXNpZGViYXJcIixcblx0ICAgIGNsYXNzOiB7XG5cdCAgICAgIGFmZml4OiBfdm0uYWZmaXhlZFxuXHQgICAgfSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICBtYXJnaW5Ub3A6IF92bS50b3Bcblx0ICAgIH0pXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTVlYmRkZWJmXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogNzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oNzYpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MClcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxBbGVydC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtYWY3YzFmNmFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWFmN2MxZjZhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQWxlcnQudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogNzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc3KTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1hZjdjMWY2YSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQWxlcnQudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1hZjdjMWY2YSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQWxlcnQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogNzcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmZhZGUtZW50ZXItYWN0aXZlLFxcclxcbi5mYWRlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4zcyBlYXNlO1xcbn1cXG4uZmFkZS1lbnRlcixcXHJcXG4uZmFkZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgaGVpZ2h0OiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXG59XFxuLmFsZXJ0LnRvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDMwcHg7XFxyXFxuICBtYXJnaW46IDAgYXV0bztcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNTA7XFxufVxcbi5hbGVydC50b3AtcmlnaHQge1xcclxcbiAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgdG9wOiAzMHB4O1xcclxcbiAgcmlnaHQ6IDUwcHg7XFxyXFxuICB6LWluZGV4OiAxMDUwO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0FsZXJ0LnZ1ZT83MWE5MWMxYVwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBb0RBOztFQUVBLDZCQUFBO0NBQ0E7QUFDQTs7RUFFQSxVQUFBO0VBQ0EsV0FBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtFQUNBLFVBQUE7RUFDQSxlQUFBO0VBQ0EsUUFBQTtFQUNBLFNBQUE7RUFDQSxjQUFBO0NBQ0E7QUFDQTtFQUNBLGdCQUFBO0VBQ0EsVUFBQTtFQUNBLFlBQUE7RUFDQSxjQUFBO0NBQ0FcIixcImZpbGVcIjpcIkFsZXJ0LnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8dHJhbnNpdGlvbiBuYW1lPVxcXCJmYWRlXFxcIj5cXHJcXG4gICAgPGRpdiB2LXNob3c9XFxcInZhbFxcXCIgOmNsYXNzPVxcXCJbJ2FsZXJ0JywgJ2FsZXJ0LScrdHlwZSwgcGxhY2VtZW50XVxcXCIgOnN0eWxlPVxcXCJ7d2lkdGg6d2lkdGh9XFxcIiByb2xlPVxcXCJhbGVydFxcXCI+XFxyXFxuICAgICAgPGJ1dHRvbiB2LXNob3c9XFxcImRpc21pc3NhYmxlXFxcIiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJ2YWwgPSBmYWxzZVxcXCI+XFxyXFxuICAgICAgICA8c3Bhbj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgIDwvYnV0dG9uPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L3RyYW5zaXRpb24+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Y29lcmNlLCBkZWxheWVyfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xcclxcblxcclxcbnZhciBEVVJBVElPTiA9IDBcXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBkaXNtaXNzYWJsZToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZHVyYXRpb246IHtkZWZhdWx0OiBEVVJBVElPTn0sXFxyXFxuICAgIHBsYWNlbWVudDoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICB2YWx1ZToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcXHJcXG4gICAgd2lkdGg6IHt0eXBlOiBTdHJpbmd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgdmFsOiB0aGlzLnZhbHVlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBkdXJhdGlvbk51bSAoKSB7IHJldHVybiBjb2VyY2UubnVtYmVyKHRoaXMuZHVyYXRpb24sIERVUkFUSU9OKSB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgdmFsICh2YWwpIHtcXHJcXG4gICAgICBpZiAodmFsICYmIHRoaXMuZHVyYXRpb25OdW0gPiAwKSB7IHRoaXMuX2RlbGF5Q2xvc2UoKSB9XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB2YWxcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5fZGVsYXlDbG9zZSA9IGRlbGF5ZXIoZnVuY3Rpb24gKCkge1xcclxcbiAgICAgIHRoaXMudmFsID0gZmFsc2VcXHJcXG4gICAgfSwgJ2R1cmF0aW9uTnVtJylcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi5mYWRlLWVudGVyLWFjdGl2ZSxcXHJcXG4uZmFkZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTtcXHJcXG59XFxyXFxuLmZhZGUtZW50ZXIsXFxyXFxuLmZhZGUtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIGhlaWdodDogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxufVxcclxcbi5hbGVydC50b3Age1xcclxcbiAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgdG9wOiAzMHB4O1xcclxcbiAgbWFyZ2luOiAwIGF1dG87XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICB6LWluZGV4OiAxMDUwO1xcclxcbn1cXHJcXG4uYWxlcnQudG9wLXJpZ2h0IHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMzBweDtcXHJcXG4gIHJpZ2h0OiA1MHB4O1xcclxcbiAgei1pbmRleDogMTA1MDtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDc4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKlxyXG5cdFx0TUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcclxuXHRcdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcclxuXHQqL1xyXG5cdC8vIGNzcyBiYXNlIGNvZGUsIGluamVjdGVkIGJ5IHRoZSBjc3MtbG9hZGVyXHJcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBsaXN0ID0gW107XHJcblx0XHJcblx0XHQvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXHJcblx0XHRsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XHJcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcclxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaXRlbSA9IHRoaXNbaV07XHJcblx0XHRcdFx0aWYoaXRlbVsyXSkge1xyXG5cdFx0XHRcdFx0cmVzdWx0LnB1c2goXCJAbWVkaWEgXCIgKyBpdGVtWzJdICsgXCJ7XCIgKyBpdGVtWzFdICsgXCJ9XCIpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXN1bHQucHVzaChpdGVtWzFdKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHJlc3VsdC5qb2luKFwiXCIpO1xyXG5cdFx0fTtcclxuXHRcclxuXHRcdC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XHJcblx0XHRsaXN0LmkgPSBmdW5jdGlvbihtb2R1bGVzLCBtZWRpYVF1ZXJ5KSB7XHJcblx0XHRcdGlmKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKVxyXG5cdFx0XHRcdG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIFwiXCJdXTtcclxuXHRcdFx0dmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcclxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaWQgPSB0aGlzW2ldWzBdO1xyXG5cdFx0XHRcdGlmKHR5cGVvZiBpZCA9PT0gXCJudW1iZXJcIilcclxuXHRcdFx0XHRcdGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IoaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0dmFyIGl0ZW0gPSBtb2R1bGVzW2ldO1xyXG5cdFx0XHRcdC8vIHNraXAgYWxyZWFkeSBpbXBvcnRlZCBtb2R1bGVcclxuXHRcdFx0XHQvLyB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCAxMDAlIHBlcmZlY3QgZm9yIHdlaXJkIG1lZGlhIHF1ZXJ5IGNvbWJpbmF0aW9uc1xyXG5cdFx0XHRcdC8vICB3aGVuIGEgbW9kdWxlIGlzIGltcG9ydGVkIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IG1lZGlhIHF1ZXJpZXMuXHJcblx0XHRcdFx0Ly8gIEkgaG9wZSB0aGlzIHdpbGwgbmV2ZXIgb2NjdXIgKEhleSB0aGlzIHdheSB3ZSBoYXZlIHNtYWxsZXIgYnVuZGxlcylcclxuXHRcdFx0XHRpZih0eXBlb2YgaXRlbVswXSAhPT0gXCJudW1iZXJcIiB8fCAhYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xyXG5cdFx0XHRcdFx0aWYobWVkaWFRdWVyeSAmJiAhaXRlbVsyXSkge1xyXG5cdFx0XHRcdFx0XHRpdGVtWzJdID0gbWVkaWFRdWVyeTtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZihtZWRpYVF1ZXJ5KSB7XHJcblx0XHRcdFx0XHRcdGl0ZW1bMl0gPSBcIihcIiArIGl0ZW1bMl0gKyBcIikgYW5kIChcIiArIG1lZGlhUXVlcnkgKyBcIilcIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxpc3QucHVzaChpdGVtKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0XHRyZXR1cm4gbGlzdDtcclxuXHR9O1xyXG5cblxuLyoqKi8gfSxcbi8qIDc5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKlxuXHRcdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG5cdFx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuXHQqL1xuXHR2YXIgc3R5bGVzSW5Eb20gPSB7fSxcblx0XHRtZW1vaXplID0gZnVuY3Rpb24oZm4pIHtcblx0XHRcdHZhciBtZW1vO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBtZW1vID09PSBcInVuZGVmaW5lZFwiKSBtZW1vID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHRcdFx0cmV0dXJuIG1lbW87XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0aXNPbGRJRSA9IG1lbW9pemUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gL21zaWUgWzYtOV1cXGIvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSk7XG5cdFx0fSksXG5cdFx0Z2V0SGVhZEVsZW1lbnQgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXTtcblx0XHR9KSxcblx0XHRzaW5nbGV0b25FbGVtZW50ID0gbnVsbCxcblx0XHRzaW5nbGV0b25Db3VudGVyID0gMCxcblx0XHRzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcCA9IFtdO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihsaXN0LCBvcHRpb25zKSB7XG5cdFx0aWYoZmFsc2UpIHtcblx0XHRcdGlmKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0eWxlLWxvYWRlciBjYW5ub3QgYmUgdXNlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xuXHRcdH1cblx0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0Ly8gRm9yY2Ugc2luZ2xlLXRhZyBzb2x1dGlvbiBvbiBJRTYtOSwgd2hpY2ggaGFzIGEgaGFyZCBsaW1pdCBvbiB0aGUgIyBvZiA8c3R5bGU+XG5cdFx0Ly8gdGFncyBpdCB3aWxsIGFsbG93IG9uIGEgcGFnZVxuXHRcdGlmICh0eXBlb2Ygb3B0aW9ucy5zaW5nbGV0b24gPT09IFwidW5kZWZpbmVkXCIpIG9wdGlvbnMuc2luZ2xldG9uID0gaXNPbGRJRSgpO1xuXHRcblx0XHQvLyBCeSBkZWZhdWx0LCBhZGQgPHN0eWxlPiB0YWdzIHRvIHRoZSBib3R0b20gb2YgPGhlYWQ+LlxuXHRcdGlmICh0eXBlb2Ygb3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJ1bmRlZmluZWRcIikgb3B0aW9ucy5pbnNlcnRBdCA9IFwiYm90dG9tXCI7XG5cdFxuXHRcdHZhciBzdHlsZXMgPSBsaXN0VG9TdHlsZXMobGlzdCk7XG5cdFx0YWRkU3R5bGVzVG9Eb20oc3R5bGVzLCBvcHRpb25zKTtcblx0XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG5cdFx0XHR2YXIgbWF5UmVtb3ZlID0gW107XG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xuXHRcdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblx0XHRcdFx0ZG9tU3R5bGUucmVmcy0tO1xuXHRcdFx0XHRtYXlSZW1vdmUucHVzaChkb21TdHlsZSk7XG5cdFx0XHR9XG5cdFx0XHRpZihuZXdMaXN0KSB7XG5cdFx0XHRcdHZhciBuZXdTdHlsZXMgPSBsaXN0VG9TdHlsZXMobmV3TGlzdCk7XG5cdFx0XHRcdGFkZFN0eWxlc1RvRG9tKG5ld1N0eWxlcywgb3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgbWF5UmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciBkb21TdHlsZSA9IG1heVJlbW92ZVtpXTtcblx0XHRcdFx0aWYoZG9tU3R5bGUucmVmcyA9PT0gMCkge1xuXHRcdFx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKylcblx0XHRcdFx0XHRcdGRvbVN0eWxlLnBhcnRzW2pdKCk7XG5cdFx0XHRcdFx0ZGVsZXRlIHN0eWxlc0luRG9tW2RvbVN0eWxlLmlkXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGFkZFN0eWxlc1RvRG9tKHN0eWxlcywgb3B0aW9ucykge1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xuXHRcdFx0dmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF07XG5cdFx0XHRpZihkb21TdHlsZSkge1xuXHRcdFx0XHRkb21TdHlsZS5yZWZzKys7XG5cdFx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdGRvbVN0eWxlLnBhcnRzW2pdKGl0ZW0ucGFydHNbal0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvcig7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0ZG9tU3R5bGUucGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBwYXJ0cyA9IFtdO1xuXHRcdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdHBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlc0luRG9tW2l0ZW0uaWRdID0ge2lkOiBpdGVtLmlkLCByZWZzOiAxLCBwYXJ0czogcGFydHN9O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gbGlzdFRvU3R5bGVzKGxpc3QpIHtcblx0XHR2YXIgc3R5bGVzID0gW107XG5cdFx0dmFyIG5ld1N0eWxlcyA9IHt9O1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IGxpc3RbaV07XG5cdFx0XHR2YXIgaWQgPSBpdGVtWzBdO1xuXHRcdFx0dmFyIGNzcyA9IGl0ZW1bMV07XG5cdFx0XHR2YXIgbWVkaWEgPSBpdGVtWzJdO1xuXHRcdFx0dmFyIHNvdXJjZU1hcCA9IGl0ZW1bM107XG5cdFx0XHR2YXIgcGFydCA9IHtjc3M6IGNzcywgbWVkaWE6IG1lZGlhLCBzb3VyY2VNYXA6IHNvdXJjZU1hcH07XG5cdFx0XHRpZighbmV3U3R5bGVzW2lkXSlcblx0XHRcdFx0c3R5bGVzLnB1c2gobmV3U3R5bGVzW2lkXSA9IHtpZDogaWQsIHBhcnRzOiBbcGFydF19KTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0bmV3U3R5bGVzW2lkXS5wYXJ0cy5wdXNoKHBhcnQpO1xuXHRcdH1cblx0XHRyZXR1cm4gc3R5bGVzO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgc3R5bGVFbGVtZW50KSB7XG5cdFx0dmFyIGhlYWQgPSBnZXRIZWFkRWxlbWVudCgpO1xuXHRcdHZhciBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcCA9IHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wW3N0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wLmxlbmd0aCAtIDFdO1xuXHRcdGlmIChvcHRpb25zLmluc2VydEF0ID09PSBcInRvcFwiKSB7XG5cdFx0XHRpZighbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3ApIHtcblx0XHRcdFx0aGVhZC5pbnNlcnRCZWZvcmUoc3R5bGVFbGVtZW50LCBoZWFkLmZpcnN0Q2hpbGQpO1xuXHRcdFx0fSBlbHNlIGlmKGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wLm5leHRTaWJsaW5nKSB7XG5cdFx0XHRcdGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlRWxlbWVudCwgbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AubmV4dFNpYmxpbmcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpO1xuXHRcdFx0fVxuXHRcdFx0c3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3AucHVzaChzdHlsZUVsZW1lbnQpO1xuXHRcdH0gZWxzZSBpZiAob3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJib3R0b21cIikge1xuXHRcdFx0aGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgJ2luc2VydEF0Jy4gTXVzdCBiZSAndG9wJyBvciAnYm90dG9tJy5cIik7XG5cdFx0fVxuXHR9XG5cdFxuXHRmdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG5cdFx0c3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcblx0XHR2YXIgaWR4ID0gc3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3AuaW5kZXhPZihzdHlsZUVsZW1lbnQpO1xuXHRcdGlmKGlkeCA+PSAwKSB7XG5cdFx0XHRzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcC5zcGxpY2UoaWR4LCAxKTtcblx0XHR9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKSB7XG5cdFx0dmFyIHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblx0XHRzdHlsZUVsZW1lbnQudHlwZSA9IFwidGV4dC9jc3NcIjtcblx0XHRpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgc3R5bGVFbGVtZW50KTtcblx0XHRyZXR1cm4gc3R5bGVFbGVtZW50O1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBhZGRTdHlsZShvYmosIG9wdGlvbnMpIHtcblx0XHR2YXIgc3R5bGVFbGVtZW50LCB1cGRhdGUsIHJlbW92ZTtcblx0XG5cdFx0aWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XG5cdFx0XHR2YXIgc3R5bGVJbmRleCA9IHNpbmdsZXRvbkNvdW50ZXIrKztcblx0XHRcdHN0eWxlRWxlbWVudCA9IHNpbmdsZXRvbkVsZW1lbnQgfHwgKHNpbmdsZXRvbkVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucykpO1xuXHRcdFx0dXBkYXRlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCwgc3R5bGVJbmRleCwgZmFsc2UpO1xuXHRcdFx0cmVtb3ZlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCwgc3R5bGVJbmRleCwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN0eWxlRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKTtcblx0XHRcdHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQpO1xuXHRcdFx0cmVtb3ZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuXHRcdFx0fTtcblx0XHR9XG5cdFxuXHRcdHVwZGF0ZShvYmopO1xuXHRcblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlU3R5bGUobmV3T2JqKSB7XG5cdFx0XHRpZihuZXdPYmopIHtcblx0XHRcdFx0aWYobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwKVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0dXBkYXRlKG9iaiA9IG5ld09iaik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZW1vdmUoKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cdFxuXHR2YXIgcmVwbGFjZVRleHQgPSAoZnVuY3Rpb24gKCkge1xuXHRcdHZhciB0ZXh0U3RvcmUgPSBbXTtcblx0XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIChpbmRleCwgcmVwbGFjZW1lbnQpIHtcblx0XHRcdHRleHRTdG9yZVtpbmRleF0gPSByZXBsYWNlbWVudDtcblx0XHRcdHJldHVybiB0ZXh0U3RvcmUuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ1xcbicpO1xuXHRcdH07XG5cdH0pKCk7XG5cdFxuXHRmdW5jdGlvbiBhcHBseVRvU2luZ2xldG9uVGFnKHN0eWxlRWxlbWVudCwgaW5kZXgsIHJlbW92ZSwgb2JqKSB7XG5cdFx0dmFyIGNzcyA9IHJlbW92ZSA/IFwiXCIgOiBvYmouY3NzO1xuXHRcblx0XHRpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcblx0XHRcdHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSByZXBsYWNlVGV4dChpbmRleCwgY3NzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpO1xuXHRcdFx0dmFyIGNoaWxkTm9kZXMgPSBzdHlsZUVsZW1lbnQuY2hpbGROb2Rlcztcblx0XHRcdGlmIChjaGlsZE5vZGVzW2luZGV4XSkgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaW5kZXhdKTtcblx0XHRcdGlmIChjaGlsZE5vZGVzLmxlbmd0aCkge1xuXHRcdFx0XHRzdHlsZUVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNzc05vZGUsIGNoaWxkTm9kZXNbaW5kZXhdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChjc3NOb2RlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGFwcGx5VG9UYWcoc3R5bGVFbGVtZW50LCBvYmopIHtcblx0XHR2YXIgY3NzID0gb2JqLmNzcztcblx0XHR2YXIgbWVkaWEgPSBvYmoubWVkaWE7XG5cdFx0dmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG5cdFxuXHRcdGlmIChtZWRpYSkge1xuXHRcdFx0c3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIG1lZGlhKTtcblx0XHR9XG5cdFxuXHRcdGlmIChzb3VyY2VNYXApIHtcblx0XHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZGV2dG9vbHMvZG9jcy9qYXZhc2NyaXB0LWRlYnVnZ2luZ1xuXHRcdFx0Ly8gdGhpcyBtYWtlcyBzb3VyY2UgbWFwcyBpbnNpZGUgc3R5bGUgdGFncyB3b3JrIHByb3Blcmx5IGluIENocm9tZVxuXHRcdFx0Y3NzICs9ICdcXG4vKiMgc291cmNlVVJMPScgKyBzb3VyY2VNYXAuc291cmNlc1swXSArICcgKi8nO1xuXHRcdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjY2MDM4NzVcblx0XHRcdGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpICsgXCIgKi9cIjtcblx0XHR9XG5cdFxuXHRcdGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuXHRcdFx0c3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0d2hpbGUoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcblx0XHRcdFx0c3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcblx0XHRcdH1cblx0XHRcdHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcblx0XHR9XG5cdH1cblxuXG4vKioqLyB9LFxuLyogODAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIERVUkFUSU9OID0gMDsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzbWlzc2FibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGR1cmF0aW9uOiB7IGRlZmF1bHQ6IERVUkFUSU9OIH0sXG5cdCAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuXHQgICAgd2lkdGg6IHsgdHlwZTogU3RyaW5nIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWw6IHRoaXMudmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGR1cmF0aW9uTnVtOiBmdW5jdGlvbiBkdXJhdGlvbk51bSgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UubnVtYmVyKHRoaXMuZHVyYXRpb24sIERVUkFUSU9OKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsKSB7XG5cdCAgICAgIGlmIChfdmFsICYmIHRoaXMuZHVyYXRpb25OdW0gPiAwKSB7XG5cdCAgICAgICAgdGhpcy5fZGVsYXlDbG9zZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5fZGVsYXlDbG9zZSA9ICgwLCBfdXRpbHMuZGVsYXllcikoZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLnZhbCA9IGZhbHNlO1xuXHQgICAgfSwgJ2R1cmF0aW9uTnVtJyk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogODEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImZhZGVcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIGNsYXNzOiBbJ2FsZXJ0JywgJ2FsZXJ0LScgKyBfdm0udHlwZSwgX3ZtLnBsYWNlbWVudF0sXG5cdCAgICBzdHlsZTogKHtcblx0ICAgICAgd2lkdGg6IF92bS53aWR0aFxuXHQgICAgfSksXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJhbGVydFwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmRpc21pc3NhYmxlKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJkaXNtaXNzYWJsZVwiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNsb3NlXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInR5cGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbCA9IGZhbHNlXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywgW192bS5fdihcIsOXXCIpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtYWY3YzFmNmFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA4MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg4Mylcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg2KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEFzaWRlLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0zYTRiZGUyN1wiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtM2E0YmRlMjdcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBBc2lkZS52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiA4MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oODQpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTNhNGJkZTI3IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Bc2lkZS52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTNhNGJkZTI3IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Bc2lkZS52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiA4NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYXNpZGUtb3BlbiB7XFxyXFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcztcXG59XFxuLmFzaWRlLW9wZW4uaGFzLXB1c2gtcmlnaHQge1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zMDBweCk7XFxufVxcbi5hc2lkZSB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICBib3R0b206IDA7XFxyXFxuICB6LWluZGV4OiAxMDQ5O1xcclxcbiAgb3ZlcmZsb3c6IGF1dG87XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcbn1cXG4uYXNpZGUubGVmdCB7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgcmlnaHQ6IGF1dG87XFxufVxcbi5hc2lkZS5yaWdodCB7XFxyXFxuICBsZWZ0OiBhdXRvO1xcclxcbiAgcmlnaHQ6IDA7XFxufVxcbi5zbGlkZWxlZnQtZW50ZXIge1xcclxcbiAgdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO1xcbn1cXG4uc2xpZGVsZWZ0LWVudGVyLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LWluIC4zcztcXG59XFxuLnNsaWRlbGVmdC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlbGVmdC1vdXQgLjNzO1xcbn1cXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1pbiB7XFxuMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG59XFxuQGtleWZyYW1lcyBzbGlkZWxlZnQtb3V0IHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbn1cXG4uc2xpZGVyaWdodC1lbnRlci1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtaW4gLjNzO1xcbn1cXG4uc2xpZGVyaWdodC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtb3V0IC4zcztcXG59XFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LWluIHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXG59XFxufVxcbkBrZXlmcmFtZXMgc2xpZGVyaWdodC1vdXQge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG59XFxuLmFzaWRlOmZvY3VzIHtcXHJcXG4gICAgb3V0bGluZTogMDtcXG59XFxuQG1lZGlhIChtYXgtd2lkdGg6IDk5MXB4KSB7XFxuLmFzaWRlIHtcXHJcXG4gICAgbWluLXdpZHRoOiAyNDBweDtcXG59XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIge1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XFxyXFxuICBtaW4taGVpZ2h0OiAxNi40M3B4O1xcclxcbiAgcGFkZGluZzogNnB4IDE1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjMzM3YWI3O1xcclxcbiAgY29sb3I6ICNmZmY7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIgLmNsb3NlIHtcXHJcXG4gIG1hcmdpbi1yaWdodDogLThweDtcXHJcXG4gIHBhZGRpbmc6IDRweCA4cHg7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG4gIGZvbnQtc2l6ZTogMjVweDtcXHJcXG4gIG9wYWNpdHk6IC44O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtYm9keSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nOiAxNXB4O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIHtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxyXFxuICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTVlNWU1O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWdyb3VwIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogLTFweDtcXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWJsb2NrKy5idG4tYmxvY2sge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDA7XFxufVxcbi5hc2lkZS1iYWNrZHJvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICB6LWluZGV4OiAxMDQwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2U7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwO1xcbn1cXG4uYXNpZGUtYmFja2Ryb3AuaW4ge1xcclxcbiAgb3BhY2l0eTogLjU7XFxyXFxuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0FzaWRlLnZ1ZT81NzM5NjIxZlwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBa0ZBO0VBQ0EsMkJBQUE7Q0FDQTtBQUNBO0VBQ0EsOEJBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7RUFDQSxPQUFBO0VBQ0EsVUFBQTtFQUNBLGNBQUE7RUFDQSxlQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBO0VBQ0EsUUFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7Q0FDQTtBQUNBO0VBQ0EsMkJBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSw2QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EseUJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EsNkJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7Q0FDQTtBQUNBO0VBQ0EsNkJBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSw0QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EseUJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EsNEJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLGlCQUFBO0NBQ0E7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7RUFDQSxvQkFBQTtFQUNBLGtCQUFBO0VBQ0Esb0JBQUE7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsaUJBQUE7RUFDQSxZQUFBO0VBQ0EsZ0JBQUE7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxjQUFBO0VBQ0Esa0JBQUE7RUFDQSw4QkFBQTtDQUNBO0FBQ0E7RUFDQSxpQkFBQTtFQUNBLGlCQUFBO0NBQ0E7QUFDQTtFQUNBLGtCQUFBO0NBQ0E7QUFDQTtFQUNBLGVBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFVBQUE7RUFDQSxRQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUFDQSw2QkFBQTtFQUNBLHVCQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7RUFDQSwwQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJBc2lkZS52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPHRyYW5zaXRpb24gOm5hbWU9XFxcIidzbGlkZScgKyBwbGFjZW1lbnRcXFwiPlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZVxcXCIgdi1pZj1cXFwic2hvd1xcXCIgOnN0eWxlPVxcXCJ7d2lkdGg6d2lkdGgrJ3B4J31cXFwiIDpjbGFzcz1cXFwicGxhY2VtZW50XFxcIj5cXHJcXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZS1kaWFsb2dcXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXNpZGUtY29udGVudFxcXCI+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlLWhlYWRlclxcXCI+XFxyXFxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPSd0cmlnZ2VyX2Nsb3NlJz48c3Bhbj4mdGltZXM7PC9zcGFuPjwvYnV0dG9uPlxcclxcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwiYXNpZGUtdGl0bGVcXFwiPjxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+e3sgaGVhZGVyIH19PC9zbG90PjwvaDQ+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZS1ib2R5XFxcIj48c2xvdD48L3Nsb3Q+PC9kaXY+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L3RyYW5zaXRpb24+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Z2V0U2Nyb2xsQmFyV2lkdGh9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBwbGFjZW1lbnQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdyaWdodCd9LFxcclxcbiAgICBzaG93OiB7dHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWV9LFxcclxcbiAgICB3aWR0aDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMzIwfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIHNob3cgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgICAgdGhpcy4kZW1pdCh0aGlzLnNob3cgPyAnb3BlbicgOiAnY2xvc2UnKVxcclxcbiAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5XFxyXFxuICAgICAgY29uc3Qgc2Nyb2xsQmFyV2lkdGggPSBnZXRTY3JvbGxCYXJXaWR0aCgpXFxyXFxuICAgICAgaWYgKHZhbCkge1xcclxcbiAgICAgICAgaWYgKCF0aGlzLl9iYWNrZHJvcCkge1xcclxcbiAgICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnXFxyXFxuICAgICAgICBib2R5LmFwcGVuZENoaWxkKHRoaXMuX2JhY2tkcm9wKVxcclxcbiAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJylcXHJcXG4gICAgICAgIGlmIChzY3JvbGxCYXJXaWR0aCAhPT0gMCkge1xcclxcbiAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoICsgJ3B4J1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxcclxcbiAgICAgICAgdmFyIHggPSB0aGlzLl9iYWNrZHJvcC5jbGllbnRIZWlnaHRcXHJcXG4gICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTGlzdC5hZGQoJ2luJylcXHJcXG4gICAgICAgICQodGhpcy5fYmFja2Ryb3ApLm9uKCdjbGljaycsICgpID0+IHRoaXMudHJpZ2dlcl9jbG9zZSgpKVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5vbigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcXHJcXG4gICAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkub2ZmKClcXHJcXG4gICAgICAgICAgdHJ5IHtcXHJcXG4gICAgICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKVxcclxcbiAgICAgICAgICAgIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJzAnXFxyXFxuICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZCh0aGlzLl9iYWNrZHJvcClcXHJcXG4gICAgICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IG51bGxcXHJcXG4gICAgICAgICAgfSBjYXRjaCAoZSkge31cXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnXFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICB0cmlnZ2VyICgpIHtcXHJcXG4gICAgICByZXR1cm4ge1xcclxcbiAgICAgICAgY2xvc2U6ICgpID0+IHRoaXMudHJpZ2dlcl9jbG9zZSgpLFxcclxcbiAgICAgICAgb3BlbjogKCkgPT4gdGhpcy50cmlnZ2VyX29wZW4oKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdHJpZ2dlcl9jbG9zZSAoKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCggJ2Nsb3NlJyApXFxyXFxuICAgIH0sXFxyXFxuICAgIHRyaWdnZXJfb3BlbigpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCAnb3BlbicgKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbW91bnRlZCAoKSB7XFxyXFxuICAgIHRoaXMuJGVtaXQoJ3RyaWdnZXInLCAoKSA9PiB0aGlzLnRyaWdnZXIpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uYXNpZGUtb3BlbiB7XFxyXFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcztcXHJcXG59XFxyXFxuLmFzaWRlLW9wZW4uaGFzLXB1c2gtcmlnaHQge1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zMDBweCk7XFxyXFxufVxcclxcbi5hc2lkZSB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICBib3R0b206IDA7XFxyXFxuICB6LWluZGV4OiAxMDQ5O1xcclxcbiAgb3ZlcmZsb3c6IGF1dG87XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbn1cXHJcXG4uYXNpZGUubGVmdCB7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgcmlnaHQ6IGF1dG87XFxyXFxufVxcclxcbi5hc2lkZS5yaWdodCB7XFxyXFxuICBsZWZ0OiBhdXRvO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxufVxcclxcbi5zbGlkZWxlZnQtZW50ZXIge1xcclxcbiAgdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO1xcclxcbn1cXHJcXG4uc2xpZGVsZWZ0LWVudGVyLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LWluIC4zcztcXHJcXG59XFxyXFxuLnNsaWRlbGVmdC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlbGVmdC1vdXQgLjNzO1xcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1pbiB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLnNsaWRlcmlnaHQtZW50ZXItYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZXJpZ2h0LWluIC4zcztcXHJcXG59XFxyXFxuLnNsaWRlcmlnaHQtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZXJpZ2h0LW91dCAuM3M7XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVyaWdodC1pbiB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVyaWdodC1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG4uYXNpZGU6Zm9jdXMge1xcclxcbiAgICBvdXRsaW5lOiAwO1xcclxcbn1cXHJcXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcXHJcXG4gIC5hc2lkZSB7XFxyXFxuICAgIG1pbi13aWR0aDogMjQwcHg7XFxyXFxuICB9XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIge1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XFxyXFxuICBtaW4taGVpZ2h0OiAxNi40M3B4O1xcclxcbiAgcGFkZGluZzogNnB4IDE1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjMzM3YWI3O1xcclxcbiAgY29sb3I6ICNmZmY7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIgLmNsb3NlIHtcXHJcXG4gIG1hcmdpbi1yaWdodDogLThweDtcXHJcXG4gIHBhZGRpbmc6IDRweCA4cHg7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG4gIGZvbnQtc2l6ZTogMjVweDtcXHJcXG4gIG9wYWNpdHk6IC44O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtYm9keSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nOiAxNXB4O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIHtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxyXFxuICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTVlNWU1O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMDtcXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWdyb3VwIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogLTFweDtcXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWJsb2NrKy5idG4tYmxvY2sge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDA7XFxyXFxufVxcclxcbi5hc2lkZS1iYWNrZHJvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICB6LWluZGV4OiAxMDQwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2U7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwO1xcclxcbn1cXHJcXG4uYXNpZGUtYmFja2Ryb3AuaW4ge1xcclxcbiAgb3BhY2l0eTogLjU7XFxyXFxuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogODUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBoZWFkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAncmlnaHQnIH0sXG5cdCAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH0sXG5cdCAgICB3aWR0aDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDMyMCB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyh2YWwsIG9sZCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KHRoaXMuc2hvdyA/ICdvcGVuJyA6ICdjbG9zZScpO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIHZhciBzY3JvbGxCYXJXaWR0aCA9ICgwLCBfdXRpbHMuZ2V0U2Nyb2xsQmFyV2lkdGgpKCk7XG5cdCAgICAgIGlmICh2YWwpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuX2JhY2tkcm9wKSB7XG5cdCAgICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnO1xuXHQgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fYmFja2Ryb3ApO1xuXHQgICAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpO1xuXHQgICAgICAgIGlmIChzY3JvbGxCYXJXaWR0aCAhPT0gMCkge1xuXHQgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBzY3JvbGxCYXJXaWR0aCArICdweCc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIHJlcXVlc3QgcHJvcGVydHkgdGhhdCByZXF1aXJlcyBsYXlvdXQgdG8gZm9yY2UgYSBsYXlvdXRcblx0ICAgICAgICB2YXIgeCA9IHRoaXMuX2JhY2tkcm9wLmNsaWVudEhlaWdodDtcblx0ICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc0xpc3QuYWRkKCdpbicpO1xuXHQgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRoaXMuX2JhY2tkcm9wKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICByZXR1cm4gX3RoaXMudHJpZ2dlcl9jbG9zZSgpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRoaXMuX2JhY2tkcm9wKS5vbigndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKF90aGlzLl9iYWNrZHJvcCkub2ZmKCk7XG5cdCAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTtcblx0ICAgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMCc7XG5cdCAgICAgICAgICAgIGJvZHkucmVtb3ZlQ2hpbGQoX3RoaXMuX2JhY2tkcm9wKTtcblx0ICAgICAgICAgICAgX3RoaXMuX2JhY2tkcm9wID0gbnVsbDtcblx0ICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lID0gJ2FzaWRlLWJhY2tkcm9wJztcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdHJpZ2dlcjogZnVuY3Rpb24gdHJpZ2dlcigpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpczIudHJpZ2dlcl9jbG9zZSgpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgb3BlbjogZnVuY3Rpb24gb3BlbigpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpczIudHJpZ2dlcl9vcGVuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgfSxcblx0ICAgIHRyaWdnZXJfY2xvc2U6IGZ1bmN0aW9uIHRyaWdnZXJfY2xvc2UoKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2Nsb3NlJyk7XG5cdCAgICB9LFxuXHQgICAgdHJpZ2dlcl9vcGVuOiBmdW5jdGlvbiB0cmlnZ2VyX29wZW4oKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ29wZW4nKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgICB0aGlzLiRlbWl0KCd0cmlnZ2VyJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gX3RoaXMzLnRyaWdnZXI7XG5cdCAgICB9KTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiA4NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6ICdzbGlkZScgKyBfdm0ucGxhY2VtZW50XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlXCIsXG5cdCAgICBjbGFzczogX3ZtLnBsYWNlbWVudCxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLndpZHRoICsgJ3B4J1xuXHQgICAgfSlcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJhc2lkZS1kaWFsb2dcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWhlYWRlclwiXG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udHJpZ2dlcl9jbG9zZVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCBbX3ZtLl92KFwiw5dcIildKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2g0Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtdGl0bGVcIlxuXHQgIH0sIFtfdm0uX3QoXCJoZWFkZXJcIiwgW192bS5fdihfdm0uX3MoX3ZtLmhlYWRlcikpXSldLCAyKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWJvZHlcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKV0pXSkgOiBfdm0uX2UoKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTNhNGJkZTI3XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogODcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODgpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODkpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQnV0dG9uR3JvdXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTEyNWViMGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0xMjVlYjBjOFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEJ1dHRvbkdyb3VwLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDg4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYnV0dG9uczogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBqdXN0aWZpZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZlcnRpY2FsOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICB0aGlzLl9idG5Hcm91cCA9IHRydWU7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWw6IHRoaXMudmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiA4OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczoge1xuXHQgICAgICAnYnRuLWdyb3VwJzogX3ZtLmJ1dHRvbnMsICdidG4tZ3JvdXAtanVzdGlmaWVkJzogX3ZtLmp1c3RpZmllZCwgJ2J0bi1ncm91cC12ZXJ0aWNhbCc6IF92bS52ZXJ0aWNhbFxuXHQgICAgfSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiZGF0YS10b2dnbGVcIjogX3ZtLmJ1dHRvbnMgJiYgJ2J1dHRvbnMnXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0xMjVlYjBjOFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDkwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDkxKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTMpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTQpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQ2Fyb3VzZWwudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRfX3Z1ZV9vcHRpb25zX18uX3Njb3BlSWQgPSBcImRhdGEtdi0zMjJkZWU0MVwiXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzIyZGVlNDFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTMyMmRlZTQxXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQ2Fyb3VzZWwudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogOTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0zMjJkZWU0MSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2Fyb3VzZWwudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0zMjJkZWU0MSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2Fyb3VzZWwudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogOTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmNhcm91c2VsLWNvbnRyb2xbZGF0YS12LTMyMmRlZTQxXSB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQ2Fyb3VzZWwudnVlPzJmNDQ2MzQyXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUE0R0E7RUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJDYXJvdXNlbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbjxkaXYgY2xhc3M9XFxcImNhcm91c2VsIHNsaWRlXFxcIiBkYXRhLXJpZGU9XFxcImNhcm91c2VsXFxcIj5cXHJcXG4gIDwhLS0gSW5kaWNhdG9ycyAtLT5cXHJcXG4gIDxvbCBjbGFzcz1cXFwiY2Fyb3VzZWwtaW5kaWNhdG9yc1xcXCIgdi1zaG93PVxcXCJpbmRpY2F0b3JzXFxcIj5cXHJcXG4gICAgPGxpIHYtZm9yPVxcXCIoaW5kaWNhdG9yLGkpIGluIGluZGljYXRvcl9saXN0XFxcIiBAY2xpY2s9XFxcImluZGljYXRvckNsaWNrKGkpXFxcIiA6Y2xhc3M9XFxcInthY3RpdmU6aSA9PT0gaW5kZXh9XFxcIj48c3Bhbj48L3NwYW4+PC9saT5cXHJcXG4gIDwvb2w+XFxyXFxuICA8IS0tIFdyYXBwZXIgZm9yIHNsaWRlcyAtLT5cXHJcXG4gIDxkaXYgY2xhc3M9XFxcImNhcm91c2VsLWlubmVyXFxcIiByb2xlPVxcXCJsaXN0Ym94XFxcIj5cXHJcXG4gICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgPC9kaXY+XFxyXFxuICA8IS0tIENvbnRyb2xzIC0tPlxcclxcbiAgPGRpdiB2LXNob3c9XFxcImNvbnRyb2xzXFxcIiBjbGFzcz1cXFwiY2Fyb3VzZWwtY29udHJvbHMgaGlkZGVuLXhzXFxcIj5cXHJcXG4gICAgPGEgY2xhc3M9XFxcImxlZnQgY2Fyb3VzZWwtY29udHJvbFxcXCIgcm9sZT1cXFwiYnV0dG9uXFxcIiBAY2xpY2s9XFxcInByZXZcXFwiPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tbGVmdFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvc3Bhbj5cXHJcXG4gICAgPC9hPlxcclxcbiAgICA8YSBjbGFzcz1cXFwicmlnaHQgY2Fyb3VzZWwtY29udHJvbFxcXCIgcm9sZT1cXFwiYnV0dG9uXFxcIiBAY2xpY2s9XFxcIm5leHRcXFwiPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tcmlnaHRcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgIDwvYT5cXHJcXG4gIDwvZGl2PlxcclxcbjwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xcclxcbi8vIGxldCBjb2VyY2UgPSB7XFxyXFxuLy8gICBpbnRlcnZhbDogJ251bWJlcidcXHJcXG4vLyB9XFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgaW5kaWNhdG9yczoge1xcclxcbiAgICAgIHR5cGU6IEJvb2xlYW4sXFxyXFxuICAgICAgZGVmYXVsdDogdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICBjb250cm9sczoge1xcclxcbiAgICAgIHR5cGU6IEJvb2xlYW4sXFxyXFxuICAgICAgZGVmYXVsdDogdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICBpbnRlcnZhbDoge1xcclxcbiAgICAgIHR5cGU6IE51bWJlcixcXHJcXG4gICAgICBkZWZhdWx0OiA1MDAwXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBpbmRpY2F0b3JfbGlzdDogW10sXFxyXFxuICAgICAgaW5kZXg6IDAsXFxyXFxuICAgICAgaXNBbmltYXRpbmc6IGZhbHNlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBpbmRleCAobmV3VmFsLCBvbGRWYWwpIHtcXHJcXG4gICAgICB0aGlzLnNsaWRlKG5ld1ZhbCA+IG9sZFZhbCA/ICdsZWZ0JyA6ICdyaWdodCcsIG5ld1ZhbCwgb2xkVmFsKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBpbmRpY2F0b3JDbGljayAoaW5kZXgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5pc0FuaW1hdGluZyB8fCB0aGlzLmluZGV4ID09PSBpbmRleCkgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmluZGV4ID0gaW5kZXhcXHJcXG4gICAgfSxcXHJcXG4gICAgc2xpZGUgKGRpcmVjdGlvbiwgbmV4dCwgcHJldikge1xcclxcbiAgICAgIGlmICghdGhpcy4kZWwpIHsgcmV0dXJuIH1cXHJcXG4gICAgICBjb25zdCAkc2xpZGVyID0gJCgnLml0ZW0nLCB0aGlzLiRlbClcXHJcXG4gICAgICBpZiAoISRzbGlkZXIubGVuZ3RoKSB7IHJldHVybiB9XFxyXFxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSAkc2xpZGVyW25leHRdIHx8ICRzbGlkZXJbMF1cXHJcXG4gICAgICAkKHNlbGVjdGVkKS5hZGRDbGFzcyhkaXJlY3Rpb24gPT09ICdsZWZ0JyA/ICduZXh0JyA6ICdwcmV2JylcXHJcXG4gICAgICAvLyByZXF1ZXN0IHByb3BlcnR5IHRoYXQgcmVxdWlyZXMgbGF5b3V0IHRvIGZvcmNlIGEgbGF5b3V0XFxyXFxuICAgICAgdmFyIHggPSBzZWxlY3RlZC5jbGllbnRIZWlnaHRcXHJcXG4gICAgICAkKFskc2xpZGVyW3ByZXZdLCBzZWxlY3RlZF0pLmFkZENsYXNzKGRpcmVjdGlvbikub24oJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB7XFxyXFxuICAgICAgICAkc2xpZGVyLm9mZigndHJhbnNpdGlvbmVuZCcpLmNsYXNzTmFtZSA9ICdpdGVtJ1xcclxcbiAgICAgICAgJChzZWxlY3RlZCkuYWRkQ2xhc3MoJ2FjdGl2ZScpXFxyXFxuICAgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2VcXHJcXG4gICAgICB9KVxcclxcbiAgICB9LFxcclxcbiAgICBuZXh0ICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuJGVsIHx8IHRoaXMuaXNBbmltYXRpbmcpIHsgcmV0dXJuIGZhbHNlIH1cXHJcXG4gICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZVxcclxcbiAgICAgIHRoaXMuaW5kZXggKyAxIDwgJCgnLml0ZW0nLCB0aGlzLiRlbCkubGVuZ3RoID8gdGhpcy5pbmRleCArPSAxIDogdGhpcy5pbmRleCA9IDBcXHJcXG4gICAgfSxcXHJcXG4gICAgcHJldiAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmluZGV4ID09PSAwID8gdGhpcy5pbmRleCA9ICQoJy5pdGVtJywgdGhpcy4kZWwpLmxlbmd0aCAtIDEgOiB0aGlzLmluZGV4IC09IDFcXHJcXG4gICAgfSxcXHJcXG4gICAgdG9nZ2xlSW50ZXJ2YWwgKHZhbCkge1xcclxcbiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgeyB2YWwgPSB0aGlzLl9pbnRlcnZhbElEIH1cXHJcXG4gICAgICBpZih0aGlzLl9pbnRlcnZhbElEKSB7XFxyXFxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsSUQpXFxyXFxuICAgICAgICBkZWxldGUgdGhpcy5faW50ZXJ2YWxJRFxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZih2YWwgJiYgdGhpcy5pbnRlcnZhbCA+IDApIHtcXHJcXG4gICAgICAgIHRoaXMuX2ludGVydmFsSUQgPSBzZXRJbnRlcnZhbCh0aGlzLm5leHQsIHRoaXMuaW50ZXJ2YWwpXFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbW91bnRlZCAoKSB7XFxyXFxuICAgIHRoaXMudG9nZ2xlSW50ZXJ2YWwodHJ1ZSlcXHJcXG4gICAgJCh0aGlzLiRlbCkub24oJ21vdXNlZW50ZXInLCAoKSA9PiB0aGlzLnRvZ2dsZUludGVydmFsKGZhbHNlKSkub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB0aGlzLnRvZ2dsZUludGVydmFsKHRydWUpKVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICB0aGlzLnRvZ2dsZUludGVydmFsKGZhbHNlKVxcclxcbiAgICAkKHRoaXMuJGVsKS5vZmYoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZSBzY29wZWQ+XFxyXFxuLmNhcm91c2VsLWNvbnRyb2wge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogOTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvLyBsZXQgY29lcmNlID0ge1xuXHQvLyAgIGludGVydmFsOiAnbnVtYmVyJ1xuXHQvLyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGluZGljYXRvcnM6IHtcblx0ICAgICAgdHlwZTogQm9vbGVhbixcblx0ICAgICAgZGVmYXVsdDogdHJ1ZVxuXHQgICAgfSxcblx0ICAgIGNvbnRyb2xzOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IHRydWVcblx0ICAgIH0sXG5cdCAgICBpbnRlcnZhbDoge1xuXHQgICAgICB0eXBlOiBOdW1iZXIsXG5cdCAgICAgIGRlZmF1bHQ6IDUwMDBcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBpbmRpY2F0b3JfbGlzdDogW10sXG5cdCAgICAgIGluZGV4OiAwLFxuXHQgICAgICBpc0FuaW1hdGluZzogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleChuZXdWYWwsIG9sZFZhbCkge1xuXHQgICAgICB0aGlzLnNsaWRlKG5ld1ZhbCA+IG9sZFZhbCA/ICdsZWZ0JyA6ICdyaWdodCcsIG5ld1ZhbCwgb2xkVmFsKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGluZGljYXRvckNsaWNrOiBmdW5jdGlvbiBpbmRpY2F0b3JDbGljayhpbmRleCkge1xuXHQgICAgICBpZiAodGhpcy5pc0FuaW1hdGluZyB8fCB0aGlzLmluZGV4ID09PSBpbmRleCkgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuXHQgICAgfSxcblx0ICAgIHNsaWRlOiBmdW5jdGlvbiBzbGlkZShkaXJlY3Rpb24sIG5leHQsIHByZXYpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIGlmICghdGhpcy4kZWwpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdmFyICRzbGlkZXIgPSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnLml0ZW0nLCB0aGlzLiRlbCk7XG5cdCAgICAgIGlmICghJHNsaWRlci5sZW5ndGgpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIHNlbGVjdGVkID0gJHNsaWRlcltuZXh0XSB8fCAkc2xpZGVyWzBdO1xuXHQgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KShzZWxlY3RlZCkuYWRkQ2xhc3MoZGlyZWN0aW9uID09PSAnbGVmdCcgPyAnbmV4dCcgOiAncHJldicpO1xuXHQgICAgICAvLyByZXF1ZXN0IHByb3BlcnR5IHRoYXQgcmVxdWlyZXMgbGF5b3V0IHRvIGZvcmNlIGEgbGF5b3V0XG5cdCAgICAgIHZhciB4ID0gc2VsZWN0ZWQuY2xpZW50SGVpZ2h0O1xuXHQgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KShbJHNsaWRlcltwcmV2XSwgc2VsZWN0ZWRdKS5hZGRDbGFzcyhkaXJlY3Rpb24pLm9uKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICRzbGlkZXIub2ZmKCd0cmFuc2l0aW9uZW5kJykuY2xhc3NOYW1lID0gJ2l0ZW0nO1xuXHQgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHNlbGVjdGVkKS5hZGRDbGFzcygnYWN0aXZlJyk7XG5cdCAgICAgICAgX3RoaXMuaXNBbmltYXRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSk7XG5cdCAgICB9LFxuXHQgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcblx0ICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLmluZGV4ICsgMSA8ICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCcuaXRlbScsIHRoaXMuJGVsKS5sZW5ndGggPyB0aGlzLmluZGV4ICs9IDEgOiB0aGlzLmluZGV4ID0gMDtcblx0ICAgIH0sXG5cdCAgICBwcmV2OiBmdW5jdGlvbiBwcmV2KCkge1xuXHQgICAgICBpZiAoIXRoaXMuJGVsIHx8IHRoaXMuaXNBbmltYXRpbmcpIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7XG5cdCAgICAgIHRoaXMuaW5kZXggPT09IDAgPyB0aGlzLmluZGV4ID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5pdGVtJywgdGhpcy4kZWwpLmxlbmd0aCAtIDEgOiB0aGlzLmluZGV4IC09IDE7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlSW50ZXJ2YWw6IGZ1bmN0aW9uIHRvZ2dsZUludGVydmFsKHZhbCkge1xuXHQgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICB2YWwgPSB0aGlzLl9pbnRlcnZhbElEO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9pbnRlcnZhbElEKSB7XG5cdCAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbElEKTtcblx0ICAgICAgICBkZWxldGUgdGhpcy5faW50ZXJ2YWxJRDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodmFsICYmIHRoaXMuaW50ZXJ2YWwgPiAwKSB7XG5cdCAgICAgICAgdGhpcy5faW50ZXJ2YWxJRCA9IHNldEludGVydmFsKHRoaXMubmV4dCwgdGhpcy5pbnRlcnZhbCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICB0aGlzLnRvZ2dsZUludGVydmFsKHRydWUpO1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy4kZWwpLm9uKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gX3RoaXMyLnRvZ2dsZUludGVydmFsKGZhbHNlKTtcblx0ICAgIH0pLm9uKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gX3RoaXMyLnRvZ2dsZUludGVydmFsKHRydWUpO1xuXHQgICAgfSk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgdGhpcy50b2dnbGVJbnRlcnZhbChmYWxzZSk7XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLiRlbCkub2ZmKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnKTtcblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiA5NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbCBzbGlkZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJkYXRhLXJpZGVcIjogXCJjYXJvdXNlbFwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnb2wnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uaW5kaWNhdG9ycyksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiaW5kaWNhdG9yc1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNhcm91c2VsLWluZGljYXRvcnNcIlxuXHQgIH0sIF92bS5fbCgoX3ZtLmluZGljYXRvcl9saXN0KSwgZnVuY3Rpb24oaW5kaWNhdG9yLCBpKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICBhY3RpdmU6IGkgPT09IF92bS5pbmRleFxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICBfdm0uaW5kaWNhdG9yQ2xpY2soaSlcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX2MoJ3NwYW4nKV0pXG5cdCAgfSkpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNhcm91c2VsLWlubmVyXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJsaXN0Ym94XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jb250cm9scyksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY29udHJvbHNcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbC1jb250cm9scyBoaWRkZW4teHNcIlxuXHQgIH0sIFtfdm0uX2MoJ2EnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJsZWZ0IGNhcm91c2VsLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0ucHJldlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tbGVmdFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfVxuXHQgIH0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnYScsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInJpZ2h0IGNhcm91c2VsLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0ubmV4dFxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tcmlnaHRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KV0pXSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0zMjJkZWU0MVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDk1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDk2KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTgpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTkpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQ2hlY2tib3gudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRfX3Z1ZV9vcHRpb25zX18uX3Njb3BlSWQgPSBcImRhdGEtdi02OTIyYmYyNFwiXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNjkyMmJmMjRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTY5MjJiZjI0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQ2hlY2tib3gudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogOTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3KTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02OTIyYmYyNCZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2hlY2tib3gudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02OTIyYmYyNCZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2hlY2tib3gudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogOTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxubGFiZWwuY2hlY2tib3hbZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDE4cHg7XFxufVxcbmxhYmVsLmNoZWNrYm94ID4gaW5wdXRbZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgei1pbmRleDogLTE7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIG1hcmdpbjogMDtcXG59XFxubGFiZWwuY2hlY2tib3ggPiAuaWNvbltkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogLjJyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICBsaW5lLWhlaWdodDoxcmVtO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBib3JkZXItcmFkaXVzOiAuMzVyZW07XFxyXFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTtcXG59XFxubGFiZWwuY2hlY2tib3g6bm90KC5hY3RpdmUpID4gLmljb25bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2JiYjtcXG59XFxubGFiZWwuY2hlY2tib3ggPiBpbnB1dDpmb2N1cyB+IC5pY29uW2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcbn1cXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgPiAuaWNvbltkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogMXJlbSAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqeHpkbWNnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUIzYVdSMGFEMGlOeUlnYUdWcFoyaDBQU0kzSWo0OGNHRjBhQ0JtYVd4c1BTSWpabVptSWlCa1BTSnROUzQzTXl3d0xqVXliQzB6TGpFeU5ESXlMRE11TXpReE5qRnNMVEV1TXpNNE9UVXNMVEV1TkRNeU1USnNMVEV1TWpRNU5qa3NNUzR6TXpZMk5Xd3lMalU0T0RZekxESXVOelk0Tnpac05DNHpOek01TEMwMExqWTNPREkyYkMweExqSTBPVFk1TEMweExqTXpOalkxYkRBc01Hd3dMakF3TURBeUxEQXVNREF3TURGNklpOCtQQzl6ZG1jKyk7XFxufVxcbmxhYmVsLmNoZWNrYm94LmFjdGl2ZSAuYnRuLWRlZmF1bHRbZGF0YS12LTY5MjJiZjI0XSB7IGZpbHRlcjogYnJpZ2h0bmVzcyg3NSUpO1xcbn1cXG5sYWJlbC5jaGVja2JveC5kaXNhYmxlZFtkYXRhLXYtNjkyMmJmMjRdLFxcclxcbmxhYmVsLmNoZWNrYm94LnJlYWRvbmx5W2RhdGEtdi02OTIyYmYyNF0sXFxyXFxuLmJ0bi5yZWFkb25seVtkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcbn1cXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPWNoZWNrYm94XVtkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9DaGVja2JveC52dWU/MWMwNDQxMGJcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQXlGQTtFQUNBLG1CQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtFQUNBLFlBQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTtFQUNBLFVBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsUUFBQTtFQUNBLGVBQUE7RUFDQSxjQUFBO0VBQ0EsZUFBQTtFQUNBLGlCQUFBO0VBQ0EsbUJBQUE7RUFDQSxrQkFBQTtFQUNBLHNCQUFBO0VBQ0EsNkJBQUE7RUFDQSxtQ0FBQTtFQUNBLHlCQUFBO0NBQ0E7QUFDQTtFQUNBLHVCQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtFQUNBLDBCQUFBO0VBQ0EsMEVBQUE7Q0FDQTtBQUNBO0VBQ0EsMkJBQUE7RUFDQSxrWkFBQTtDQUNBO0FBQ0Esc0RBQUEsd0JBQUE7Q0FBQTtBQUVBOzs7RUFHQSwwQkFBQTtFQUNBLGlCQUFBO0VBQ0EsYUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2hlY2tib3gudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxhIDppcz1cXFwiaXNCdXR0b24/J2EnOidsYWJlbCdcXFwiIEBjbGljaz1cXFwidG9nZ2xlXFxcIiA6Y2xhc3M9XFxcIltpc0J1dHRvbj8nYnRuIGJ0bi0nK3R5cGVDb2xvcjonb3BlbiBjaGVja2JveCAnK3R5cGVDb2xvcix7YWN0aXZlOmNoZWNrZWQsZGlzYWJsZWQ6ZGlzYWJsZWQscmVhZG9ubHk6cmVhZG9ubHl9XVxcXCI+XFxyXFxuICAgIDxpbnB1dCB2LWlmPVxcXCJuYW1lXFxcIiB0eXBlPVxcXCJoaWRkZW5cXFwiIDpuYW1lPVxcXCJuYW1lXFxcIiA6dmFsdWU9XFxcImNoZWNrZWQ/dHJ1ZVZhbHVlOmZhbHNlVmFsdWVcXFwiIC8+XFxyXFxuICAgIDxzcGFuIHYtaWY9XFxcIiFpc0J1dHRvblxcXCIgY2xhc3M9XFxcImljb24gZHJvcGRvd24tdG9nZ2xlXFxcIiA6Y2xhc3M9XFxcIltjaGVja2VkPydidG4tJyt0eXBlQ29sb3I6Jycse2JnOnR5cGVDb2xvcj09PSdkZWZhdWx0J31dXFxcIj48L3NwYW4+XFxyXFxuICAgIDxzcGFuIHYtaWY9XFxcIiFpc0J1dHRvbiYmY2hlY2tlZCYmdHlwZUNvbG9yPT09J2RlZmF1bHQnXFxcIiBjbGFzcz1cXFwiaWNvblxcXCI+PC9zcGFuPlxcclxcbiAgICA8c2xvdD48L3Nsb3Q+XFxyXFxuICA8L2E+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZGlzYWJsZWQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGZhbHNlVmFsdWU6IHtkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIG5hbWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgdHJ1ZVZhbHVlOiB7ZGVmYXVsdDogdHJ1ZX0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGNoZWNrZWQ6ICh0aGlzLnZhbHVlID09PSB0aGlzLnRydWVWYWx1ZSlcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGlzQnV0dG9uICgpIHsgcmV0dXJuIHRoaXMuYnV0dG9uIHx8ICh0aGlzLl9pbkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zKSB9LFxcclxcbiAgICBpc0ZhbHNlICgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPT09IHRoaXMuZmFsc2VWYWx1ZSB9LFxcclxcbiAgICBpc1RydWUgKCkgeyByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWUgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKCkgeyByZXR1cm4gdGhpcy5faW5ncm91cCAmJiB0aGlzLiRwYXJlbnQudmFsIH0sXFxyXFxuICAgIHR5cGVDb2xvciAoKSB7IHJldHVybiAodGhpcy50eXBlIHx8ICh0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUpKSB8fCAnZGVmYXVsdCcgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIGNoZWNrZWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdmFyIHZhbHVlID0gdmFsID8gdGhpcy50cnVlVmFsdWUgOiB0aGlzLmZhbHNlVmFsdWVcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdjaGVja2VkJywgdmFsKVxcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpXFxyXFxuICAgICAgdGhpcy5ldmFsKClcXHJcXG4gICAgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWRcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWRcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9idG5Hcm91cCAmJiAhcGFyZW50Ll9yYWRpb0dyb3VwKSB7XFxyXFxuICAgICAgdGhpcy5faW5Hcm91cCA9IHRydWVcXHJcXG4gICAgICBwYXJlbnQuX2NoZWNrYm94R3JvdXAgPSB0cnVlXFxyXFxuICAgICAgaWYgKCEocGFyZW50LnZhbCBpbnN0YW5jZW9mIEFycmF5KSkgeyBwYXJlbnQudmFsID0gW10gfVxcclxcbiAgICAgIHRoaXMuZXZhbCgpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgaWYgKCF0aGlzLiRwYXJlbnQuX2NoZWNrYm94R3JvdXAgfHwgdHlwZW9mIHRoaXMudmFsdWUgPT09ICdib29sZWFuJykgeyByZXR1cm4gfVxcclxcbiAgICBpZiAodGhpcy4kcGFyZW50LnZhbC5sZW5ndGgpIHtcXHJcXG4gICAgICAvLyB0aGlzLmNoZWNrZWQgPSB+dGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudmFsdWUpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnY2hlY2tlZCcsIH50aGlzLiRwYXJlbnQudmFsLmluZGV4T2YodGhpcy52YWx1ZSkpXFxyXFxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2VkKSB7XFxyXFxuICAgICAgdGhpcy4kcGFyZW50LnZhbC5wdXNoKHRoaXMudmFsdWUpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIGV2YWwgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLl9pbkdyb3VwKSB7XFxyXFxuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmNoZWNrZWQgPyB0aGlzLmlzVHJ1ZSA6IHRoaXMuaXNGYWxzZVxcclxcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHZhbHVlKVxcclxcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tlZCAmJiAhfmluZGV4KSB0aGlzLiRwYXJlbnQudmFsLnB1c2godmFsdWUpXFxyXFxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tlZCAmJiB+aW5kZXgpIHRoaXMuJHBhcmVudC52YWwuc3BsaWNlKGluZGV4LCAxKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdG9nZ2xlICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7IHJldHVybiB9XFxyXFxuICAgICAgdGhpcy5jaGVja2VkID0gIXRoaXMuY2hlY2tlZFxcclxcbiAgICB9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZSBzY29wZWQ+XFxyXFxubGFiZWwuY2hlY2tib3gge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAxOHB4O1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveCA+IGlucHV0IHtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB6LWluZGV4OiAtMTtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveCA+IC5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogLjJyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICBsaW5lLWhlaWdodDoxcmVtO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBib3JkZXItcmFkaXVzOiAuMzVyZW07XFxyXFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTtcXHJcXG59XFxyXFxubGFiZWwuY2hlY2tib3g6bm90KC5hY3RpdmUpID4gLmljb24ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94ID4gaW5wdXQ6Zm9jdXMgfiAuaWNvbiB7XFxyXFxuICBvdXRsaW5lOiAwO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgIzY2YWZlOTtcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94LmFjdGl2ZSA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogMXJlbSAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqeHpkbWNnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUIzYVdSMGFEMGlOeUlnYUdWcFoyaDBQU0kzSWo0OGNHRjBhQ0JtYVd4c1BTSWpabVptSWlCa1BTSnROUzQzTXl3d0xqVXliQzB6TGpFeU5ESXlMRE11TXpReE5qRnNMVEV1TXpNNE9UVXNMVEV1TkRNeU1USnNMVEV1TWpRNU5qa3NNUzR6TXpZMk5Xd3lMalU0T0RZekxESXVOelk0Tnpac05DNHpOek01TEMwMExqWTNPREkyYkMweExqSTBPVFk1TEMweExqTXpOalkxYkRBc01Hd3dMakF3TURBeUxEQXVNREF3TURGNklpOCtQQzl6ZG1jKyk7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94LmFjdGl2ZSAuYnRuLWRlZmF1bHQgeyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTsgfVxcclxcblxcclxcbmxhYmVsLmNoZWNrYm94LmRpc2FibGVkLFxcclxcbmxhYmVsLmNoZWNrYm94LnJlYWRvbmx5LFxcclxcbi5idG4ucmVhZG9ubHkge1xcclxcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1KTtcXHJcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICBvcGFjaXR5OiAuNjU7XFxyXFxufVxcclxcbmxhYmVsLmJ0biA+IGlucHV0W3R5cGU9Y2hlY2tib3hdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDk4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZmFsc2VWYWx1ZTogeyBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICB0cnVlVmFsdWU6IHsgZGVmYXVsdDogdHJ1ZSB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjaGVja2VkOiB0aGlzLnZhbHVlID09PSB0aGlzLnRydWVWYWx1ZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgaXNCdXR0b246IGZ1bmN0aW9uIGlzQnV0dG9uKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idXR0b24gfHwgdGhpcy5faW5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucztcblx0ICAgIH0sXG5cdCAgICBpc0ZhbHNlOiBmdW5jdGlvbiBpc0ZhbHNlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy5mYWxzZVZhbHVlO1xuXHQgICAgfSxcblx0ICAgIGlzVHJ1ZTogZnVuY3Rpb24gaXNUcnVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWU7XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5faW5ncm91cCAmJiB0aGlzLiRwYXJlbnQudmFsO1xuXHQgICAgfSxcblx0ICAgIHR5cGVDb2xvcjogZnVuY3Rpb24gdHlwZUNvbG9yKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50eXBlIHx8IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSB8fCAnZGVmYXVsdCc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgY2hlY2tlZDogZnVuY3Rpb24gY2hlY2tlZCh2YWwsIG9sZCkge1xuXHQgICAgICB2YXIgdmFsdWUgPSB2YWwgPyB0aGlzLnRydWVWYWx1ZSA6IHRoaXMuZmFsc2VWYWx1ZTtcblx0ICAgICAgdGhpcy4kZW1pdCgnY2hlY2tlZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpO1xuXHQgICAgICB0aGlzLmV2YWwoKTtcblx0ICAgIH0sXG5cdCAgICBwYXJlbnRWYWx1ZTogZnVuY3Rpb24gcGFyZW50VmFsdWUodmFsKSB7XG5cdCAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZTtcblx0ICAgICAgaWYgKHRoaXMuY2hlY2tlZCAhPT0gY2hlY2tlZCkge1xuXHQgICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWQ7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIGNoZWNrZWQgPSB2YWwgPT09IHRoaXMudHJ1ZVZhbHVlO1xuXHQgICAgICBpZiAodGhpcy5jaGVja2VkICE9PSBjaGVja2VkKSB7XG5cdCAgICAgICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fYnRuR3JvdXAgJiYgIXBhcmVudC5fcmFkaW9Hcm91cCkge1xuXHQgICAgICB0aGlzLl9pbkdyb3VwID0gdHJ1ZTtcblx0ICAgICAgcGFyZW50Ll9jaGVja2JveEdyb3VwID0gdHJ1ZTtcblx0ICAgICAgaWYgKCEocGFyZW50LnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xuXHQgICAgICAgIHBhcmVudC52YWwgPSBbXTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmV2YWwoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICBpZiAoIXRoaXMuJHBhcmVudC5fY2hlY2tib3hHcm91cCB8fCB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLiRwYXJlbnQudmFsLmxlbmd0aCkge1xuXHQgICAgICAvLyB0aGlzLmNoZWNrZWQgPSB+dGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudmFsdWUpXG5cdCAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB+dGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudmFsdWUpKTtcblx0ICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2VkKSB7XG5cdCAgICAgIHRoaXMuJHBhcmVudC52YWwucHVzaCh0aGlzLnZhbHVlKTtcblx0ICAgIH1cblx0ICB9LFxuXHRcblx0ICBtZXRob2RzOiB7XG5cdCAgICBldmFsOiBmdW5jdGlvbiBfZXZhbCgpIHtcblx0ICAgICAgaWYgKHRoaXMuX2luR3JvdXApIHtcblx0ICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmNoZWNrZWQgPyB0aGlzLmlzVHJ1ZSA6IHRoaXMuaXNGYWxzZTtcblx0ICAgICAgICB2YXIgaW5kZXggPSB0aGlzLiRwYXJlbnQudmFsLmluZGV4T2YodmFsdWUpO1xuXHQgICAgICAgIGlmICh0aGlzLmNoZWNrZWQgJiYgIX5pbmRleCkgdGhpcy4kcGFyZW50LnZhbC5wdXNoKHZhbHVlKTtcblx0ICAgICAgICBpZiAoIXRoaXMuY2hlY2tlZCAmJiB+aW5kZXgpIHRoaXMuJHBhcmVudC52YWwuc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogOTkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYyhfdm0uaXNCdXR0b24gPyAnYScgOiAnbGFiZWwnLCB7XG5cdCAgICB0YWc6IFwiYVwiLFxuXHQgICAgY2xhc3M6IFtfdm0uaXNCdXR0b24gPyAnYnRuIGJ0bi0nICsgX3ZtLnR5cGVDb2xvciA6ICdvcGVuIGNoZWNrYm94ICcgKyBfdm0udHlwZUNvbG9yLCB7XG5cdCAgICAgIGFjdGl2ZTogX3ZtLmNoZWNrZWQsXG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHlcblx0ICAgIH1dLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlXG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ubmFtZSkgPyBfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiaGlkZGVuXCIsXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZVxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLmNoZWNrZWQgPyBfdm0udHJ1ZVZhbHVlIDogX3ZtLmZhbHNlVmFsdWVcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoIV92bS5pc0J1dHRvbikgPyBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVwiLFxuXHQgICAgY2xhc3M6IFtfdm0uY2hlY2tlZCA/ICdidG4tJyArIF92bS50eXBlQ29sb3IgOiAnJywge1xuXHQgICAgICBiZzogX3ZtLnR5cGVDb2xvciA9PT0gJ2RlZmF1bHQnXG5cdCAgICB9XVxuXHQgIH0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksICghX3ZtLmlzQnV0dG9uICYmIF92bS5jaGVja2VkICYmIF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0JykgPyBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uXCJcblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNjkyMmJmMjRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTAxKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTAzKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxEYXRlcGlja2VyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi00NzdiOGU1ZFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNDc3YjhlNWRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBEYXRlcGlja2VyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEwMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTAyKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi00NzdiOGU1ZCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vRGF0ZXBpY2tlci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQ3N2I4ZTVkIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9EYXRlcGlja2VyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEwMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZGF0ZXBpY2tlciB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbmlucHV0LmRhdGVwaWNrZXItaW5wdXQud2l0aC1yZXNldC1idXR0b24ge1xcclxcbiAgcGFkZGluZy1yaWdodDogMjVweDtcXG59XFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2U6Zm9jdXMge1xcclxcbiAgb3BhY2l0eTogLjI7XFxufVxcbi5kYXRlcGlja2VyLXBvcHVwIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgbWFyZ2luLXRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwMDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLDAsMCwwLjE3NSk7XFxufVxcbi5kYXRlcGlja2VyLWlubmVyIHtcXHJcXG4gIHdpZHRoOiAyMThweDtcXG59XFxuLmRhdGVwaWNrZXItYm9keSB7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHg7XFxufVxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHdpZHRoOiAyOHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI4cHg7XFxyXFxuICBoZWlnaHQ6IDI4cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcbi5kYXRlcGlja2VyLWN0cmwgcCB7XFxyXFxuICB3aWR0aDogNjUlO1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbn1cXG4uZGF0ZXBpY2tlci1ib2R5IHNwYW4ge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4ge1xcclxcbiAgd2lkdGg6IDQ4cHg7XFxyXFxuICBoZWlnaHQ6IDUwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogNDVweDtcXG59XFxuLmRhdGVwaWNrZXItaXRlbS1kaXNhYmxlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG4gIGN1cnNvcjogbm90LWFsbG93ZWQhaW1wb3J0YW50O1xcbn1cXG4uZGVjYWRlUmFuZ2Ugc3BhbjpmaXJzdC1jaGlsZCxcXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpsYXN0LWNoaWxkLFxcclxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWdyYXkge1xcclxcbiAgY29sb3I6ICM5OTk7XFxufVxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZTpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUge1xcclxcbiAgYmFja2dyb3VuZDogcmdiKDUwLCAxMTgsIDE3NykhaW1wb3J0YW50O1xcclxcbiAgY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXG59XFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAxMHB4XFxufVxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3BhbixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBwLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcDpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIGk6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlIHNwYW46aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0taG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvciA6ICNlZWVlZWU7XFxufVxcbi5kYXRlcGlja2VyLXdlZWtSYW5nZSBzcGFuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG4uZGF0ZXBpY2tlci1sYWJlbCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXHJcXG4gIHBhZGRpbmc6IDdweCAwO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGhlaWdodDogMzBweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5tb250aC1idG4ge1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbW96LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbXMtdXNlci1zZWxlY3Q6bm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0Om5vbmU7XFxufVxcbi5kYXRlcGlja2VyLXByZUJ0biB7XFxyXFxuICBsZWZ0OiAycHg7XFxufVxcbi5kYXRlcGlja2VyLW5leHRCdG4ge1xcclxcbiAgcmlnaHQ6IDJweDtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9EYXRlcGlja2VyLnZ1ZT8yMjAwZTRjYVwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBc1ZBO0VBQ0EsbUJBQUE7RUFDQSxzQkFBQTtDQUNBO0FBQ0E7RUFDQSxvQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLG1CQUFBO0VBQ0EsaUJBQUE7RUFDQSxnQkFBQTtFQUNBLGNBQUE7RUFDQSx5Q0FBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTs7O0VBR0Esc0JBQUE7RUFDQSxZQUFBO0VBQ0Esa0JBQUE7RUFDQSxhQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGtCQUFBO0NBQ0E7QUFDQTtFQUNBLGtDQUFBO0VBQ0EsOEJBQUE7Q0FDQTtBQUNBOzs7O0VBSUEsWUFBQTtDQUNBO0FBRUE7O0VBRUEsd0NBQUE7RUFDQSx1QkFBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtDQUNBO0FBQ0E7Ozs7RUFJQSxnQkFBQTtDQUNBO0FBQ0E7Ozs7O0VBS0EsMkJBQUE7Q0FDQTtBQUNBO0VBQ0Esa0JBQUE7Q0FDQTtBQUNBO0VBQ0EsMEJBQUE7RUFDQSxpQkFBQTtFQUNBLGVBQUE7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0Esa0JBQUE7RUFDQSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0EscUJBQUE7RUFDQSxpQkFBQTtDQUNBO0FBQ0E7RUFDQSxVQUFBO0NBQ0E7QUFDQTtFQUNBLFdBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiRGF0ZXBpY2tlci52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlclxcXCI+XFxyXFxuICAgIDxpbnB1dCBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGRhdGVwaWNrZXItaW5wdXRcXFwiIDpjbGFzcz1cXFwieyd3aXRoLXJlc2V0LWJ1dHRvbic6IGNsZWFyQnV0dG9ufVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgOnBsYWNlaG9sZGVyPVxcXCJwbGFjZWhvbGRlclxcXCJcXHJcXG4gICAgICAgIDpzdHlsZT1cXFwie3dpZHRoOndpZHRofVxcXCJcXHJcXG4gICAgICAgIDp2YWx1ZT1cXFwidmFsdWVcXFwiXFxyXFxuICAgICAgICBAY2xpY2s9XFxcImlucHV0Q2xpY2tcXFwiXFxyXFxuICAgICAgICBAaW5wdXQ9XFxcIiRlbWl0KCdpbnB1dCcsJGV2ZW50LnRhcmdldC52YWx1ZSlcXFwiIC8+XFxyXFxuICAgIDxidXR0b24gdi1pZj1cXFwiY2xlYXJCdXR0b24gJiYgdmFsdWVcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcIiRlbWl0KCdpbnB1dCcsICcnKVxcXCI+XFxyXFxuICAgICAgPHNwYW4+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgPC9idXR0b24+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItcG9wdXBcXFwiIHYtc2hvdz1cXFwiZGlzcGxheURheVZpZXdcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItaW5uZXJcXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1ib2R5XFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1jdHJsXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcInByZUJ0bkNsYXNzZXNcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIiBAY2xpY2s9XFxcInByZU5leHRNb250aENsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dE1vbnRoQ2xpY2soMSlcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICA8cCBAY2xpY2s9XFxcInN3aXRjaE1vbnRoVmlld1xcXCI+e3tzdHJpbmdpZnlEYXlIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXdlZWtSYW5nZVxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gdi1mb3I9XFxcIncgaW4gdGV4dC5kYXlzT2ZXZWVrXFxcIj57e3d9fTwvc3Bhbj5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItZGF0ZVJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiB2LWZvcj1cXFwiZCBpbiBkYXRlUmFuZ2VcXFwiIDpjbGFzcz1cXFwiZC5zY2xhc3NcXFwiIEBjbGljaz1cXFwiZGF5U2VsZWN0KGQpXFxcIj57e2QudGV4dH19PC9zcGFuPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgIDwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L2Rpdj5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1wb3B1cFxcXCIgdi1zaG93PVxcXCJkaXNwbGF5TW9udGhWaWV3XFxcIj5cXHJcXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWlubmVyXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItYm9keVxcXCI+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItY3RybFxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJwcmVCdG5DbGFzc2VzXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgQGNsaWNrPVxcXCJwcmVOZXh0WWVhckNsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dFllYXJDbGljaygxKVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxwIEBjbGljaz1cXFwic3dpdGNoRGVjYWRlVmlld1xcXCI+e3tzdHJpbmdpZnlZZWFySGVhZGVyKGN1cnJEYXRlKX19PC9wPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1tb250aFJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XFxcIihtLCBpbmRleCkgaW4gdGV4dC5tb250aHNcXFwiPlxcclxcbiAgICAgICAgICAgICAgPHNwYW4gICA6Y2xhc3M9XFxcInsnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOlxcclxcbiAgICAgICAgICAgICAgICAgICh0ZXh0Lm1vbnRoc1twYXJzZSh2YWx1ZSkuZ2V0TW9udGgoKV0gID09PSBtKSAmJlxcclxcbiAgICAgICAgICAgICAgICAgIGN1cnJEYXRlLmdldEZ1bGxZZWFyKCkgPT09IHBhcnNlKHZhbHVlKS5nZXRGdWxsWWVhcigpfVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICBAY2xpY2s9XFxcIm1vbnRoU2VsZWN0KGluZGV4KVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgPnt7bS5zdWJzdHIoMCwzKX19PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXBvcHVwXFxcIiB2LXNob3c9XFxcImRpc3BsYXlZZWFyVmlld1xcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1pbm5lclxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWJvZHlcXFwiPlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWN0cmxcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwicHJlQnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDEpXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHA+e3tzdHJpbmdpZnlEZWNhZGVIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2UgZGVjYWRlUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiZGVjYWRlIGluIGRlY2FkZVJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwieydkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSc6cGFyc2UodGhpcy52YWx1ZSkuZ2V0RnVsbFllYXIoKSA9PT0gZGVjYWRlLnRleHR9XFxcIlxcclxcbiAgICAgICAgICAgICAgICBAY2xpY2suc3RvcD1cXFwieWVhclNlbGVjdChkZWNhZGUudGV4dClcXFwiXFxyXFxuICAgICAgICAgICAgICA+e3tkZWNhZGUudGV4dH19PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7dHJhbnNsYXRpb25zfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xcclxcbi8vIGltcG9ydCAkIGZyb20gJy4vdXRpbHMvTm9kZUxpc3QuanMnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgdmFsdWU6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBmb3JtYXQ6IHtkZWZhdWx0OiAnTU0vZGQveXl5eSd9LFxcclxcbiAgICBkaXNhYmxlZERheXNPZldlZWs6IHt0eXBlOiBBcnJheSwgZGVmYXVsdCAoKSB7IHJldHVybiBbXSB9fSxcXHJcXG4gICAgd2lkdGg6IHt0eXBlOiBTdHJpbmcvKiwgZGVmYXVsdDogJzIwMHB4JyovfSxcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGxhbmc6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZX0sXFxyXFxuICAgIHBsYWNlaG9sZGVyOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgaWNvbnNGb250OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZ2x5cGhpY29uJ31cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBjdXJyRGF0ZTogbmV3IERhdGUoKSxcXHJcXG4gICAgICBkYXRlUmFuZ2U6IFtdLFxcclxcbiAgICAgIGRlY2FkZVJhbmdlOiBbXSxcXHJcXG4gICAgICBkaXNwbGF5RGF5VmlldzogZmFsc2UsXFxyXFxuICAgICAgZGlzcGxheU1vbnRoVmlldzogZmFsc2UsXFxyXFxuICAgICAgZGlzcGxheVllYXJWaWV3OiBmYWxzZSxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIGN1cnJEYXRlICgpIHtcXHJcXG4gICAgICB0aGlzLmdldERhdGVSYW5nZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIGZvcm1hdCAoKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKSlcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIHRleHQgKCkge1xcclxcbiAgICAgIHJldHVybiB0cmFuc2xhdGlvbnModGhpcy5sYW5nKVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVCdG5DbGFzc2VzICgpIHtcXHJcXG4gICAgICByZXR1cm4gYGRhdGVwaWNrZXItcHJlQnRuICR7dGhpcy5pY29uc0ZvbnR9ICR7dGhpcy5pY29uc0ZvbnR9LWNoZXZyb24tbGVmdGBcXHJcXG4gICAgfSxcXHJcXG4gICAgbmV4dEJ0bkNsYXNzZXMgKCkge1xcclxcbiAgICAgIHJldHVybiBgZGF0ZXBpY2tlci1uZXh0QnRuICR7dGhpcy5pY29uc0ZvbnR9ICR7dGhpcy5pY29uc0ZvbnR9LWNoZXZyb24tcmlnaHRgXFxyXFxuICAgIH0sXFxyXFxuICAgIGRpc2FibGVkRGF5c0FycmF5ICgpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERheXNPZldlZWsubWFwKGQgPT4gcGFyc2VJbnQoZCwgMTApKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBjbG9zZSAoKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRoaXMuZGlzcGxheVllYXJWaWV3ID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgaW5wdXRDbGljayAoKSB7XFxyXFxuICAgICAgdGhpcy5jdXJyRGF0ZSA9IHRoaXMucGFyc2UodGhpcy52YWx1ZSkgfHwgdGhpcy5wYXJzZShuZXcgRGF0ZSgpKVxcclxcbiAgICAgIGlmICh0aGlzLmRpc3BsYXlNb250aFZpZXcgfHwgdGhpcy5kaXNwbGF5WWVhclZpZXcpIHtcXHJcXG4gICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gIXRoaXMuZGlzcGxheURheVZpZXdcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHByZU5leHREZWNhZGVDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKClcXHJcXG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKClcXHJcXG5cXHJcXG4gICAgICBpZiAoZmxhZyA9PT0gMCkge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgLSAxMCwgbW9udGhzLCBkYXRlKVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEwLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0TW9udGhDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICBjb25zdCBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSlcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZShwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aCwgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKVxcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0WWVhckNsaWNrIChmbGFnKSB7XFxyXFxuICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VyckRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICAgIGNvbnN0IG1vbnRocyA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciAtIDEsIG1vbnRocywgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB5ZWFyU2VsZWN0ICh5ZWFyKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgZGF5U2VsZWN0IChkYXkpIHtcXHJcXG4gICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBkYXkuZGF0ZVxcclxcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKSlcXHJcXG4gICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgc3dpdGNoTW9udGhWaWV3ICgpIHtcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIHN3aXRjaERlY2FkZVZpZXcgKCkge1xcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIG1vbnRoU2VsZWN0IChpbmRleCkge1xcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUodGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpLCBpbmRleCwgdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCkpXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldFllYXJNb250aCAoeWVhciwgbW9udGgpIHtcXHJcXG4gICAgICBpZiAobW9udGggPiAxMSkge1xcclxcbiAgICAgICAgeWVhcisrXFxyXFxuICAgICAgICBtb250aCA9IDBcXHJcXG4gICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkge1xcclxcbiAgICAgICAgeWVhci0tXFxyXFxuICAgICAgICBtb250aCA9IDExXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiB7eWVhcjogeWVhciwgbW9udGg6IG1vbnRofVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnlEZWNhZGVIZWFkZXIgKGRhdGUpIHtcXHJcXG4gICAgICBjb25zdCB5ZWFyU3RyID0gZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKClcXHJcXG4gICAgICBjb25zdCBmaXJzdFllYXJPZkRlY2FkZSA9IHllYXJTdHIuc3Vic3RyaW5nKDAsIHllYXJTdHIubGVuZ3RoIC0gMSkgKyAwXFxyXFxuICAgICAgY29uc3QgbGFzdFllYXJPZkRlY2FkZSA9IHBhcnNlSW50KGZpcnN0WWVhck9mRGVjYWRlLCAxMCkgKyAxMFxcclxcbiAgICAgIHJldHVybiBmaXJzdFllYXJPZkRlY2FkZSArICctJyArIGxhc3RZZWFyT2ZEZWNhZGVcXHJcXG4gICAgfSxcXHJcXG4gICAgc3RyaW5naWZ5RGF5SGVhZGVyIChkYXRlKSB7XFxyXFxuICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXSArICcgJyArIGRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJzZU1vbnRoIChkYXRlKSB7XFxyXFxuICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnlZZWFySGVhZGVyIChkYXRlKSB7XFxyXFxuICAgICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnkgKGRhdGUsIGZvcm1hdCA9IHRoaXMuZm9ybWF0KSB7XFxyXFxuICAgICAgaWYgKCFkYXRlKSBkYXRlID0gdGhpcy5wYXJzZSgpXFxyXFxuICAgICAgaWYgKCFkYXRlKSByZXR1cm4gJydcXHJcXG4gICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpXFxyXFxuICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxXFxyXFxuICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKClcXHJcXG4gICAgICBjb25zdCBtb250aE5hbWUgPSB0aGlzLnBhcnNlTW9udGgoZGF0ZSlcXHJcXG5cXHJcXG4gICAgICByZXR1cm4gZm9ybWF0XFxyXFxuICAgICAgLnJlcGxhY2UoL3l5eXkvZywgeWVhcilcXHJcXG4gICAgICAucmVwbGFjZSgvTU1NTS9nLCBtb250aE5hbWUpXFxyXFxuICAgICAgLnJlcGxhY2UoL01NTS9nLCBtb250aE5hbWUuc3Vic3RyaW5nKDAsIDMpKVxcclxcbiAgICAgIC5yZXBsYWNlKC9NTS9nLCAoJzAnICsgbW9udGgpLnNsaWNlKC0yKSlcXHJcXG4gICAgICAucmVwbGFjZSgvZGQvZywgKCcwJyArIGRheSkuc2xpY2UoLTIpKVxcclxcbiAgICAgIC5yZXBsYWNlKC95eS9nLCB5ZWFyKVxcclxcbiAgICAgIC5yZXBsYWNlKC9NKD8hYSkvZywgbW9udGgpXFxyXFxuICAgICAgLnJlcGxhY2UoL2QvZywgZGF5KVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJzZSAoc3RyID0gdGhpcy52YWx1ZSkge1xcclxcbiAgICAgIGxldCBkYXRlXFxyXFxuICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDEwICYmICh0aGlzLmZvcm1hdCA9PT0gJ2RkLU1NLXl5eXknIHx8IHRoaXMuZm9ybWF0ID09PSAnZGQvTU0veXl5eScpKSB7XFxyXFxuICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RyLnN1YnN0cmluZyg2LCAxMCksIHN0ci5zdWJzdHJpbmcoMywgNSktMSwgc3RyLnN1YnN0cmluZygwLCAyKSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHN0cilcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIGlzTmFOKGRhdGUuZ2V0RnVsbFllYXIoKSkgPyBuZXcgRGF0ZSgpIDogZGF0ZVxcclxcbiAgICB9LFxcclxcbiAgICBnZXREYXlDb3VudCAoeWVhciwgbW9udGgpIHtcXHJcXG4gICAgICBjb25zdCBkaWN0ID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdXFxyXFxuICAgICAgaWYgKG1vbnRoID09PSAxKSB7XFxyXFxuICAgICAgICBpZiAoKHllYXIgJSA0MDAgPT09IDApIHx8ICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSkge1xcclxcbiAgICAgICAgICByZXR1cm4gMjlcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIGRpY3RbbW9udGhdXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldERhdGVSYW5nZSAoKSB7XFxyXFxuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIHRoaXMuZGVjYWRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIGNvbnN0IHRpbWUgPSB7XFxyXFxuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksXFxyXFxuICAgICAgICBtb250aDogdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLFxcclxcbiAgICAgICAgZGF5OiB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBjb25zdCB5ZWFyU3RyID0gdGltZS55ZWFyLnRvU3RyaW5nKClcXHJcXG4gICAgICBjb25zdCBmaXJzdFllYXJPZkRlY2FkZSA9ICh5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMCkgLSAxXFxyXFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XFxyXFxuICAgICAgICB0aGlzLmRlY2FkZVJhbmdlLnB1c2goe1xcclxcbiAgICAgICAgICB0ZXh0OiBmaXJzdFllYXJPZkRlY2FkZSArIGlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGNvbnN0IGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCAxKVxcclxcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcXHJcXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XFxyXFxuICAgICAgICBmaXJzdERheVdlZWsgPSA3XFxyXFxuICAgICAgfVxcclxcbiAgICAgIGNvbnN0IGRheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudCh0aW1lLnllYXIsIHRpbWUubW9udGgpXFxyXFxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA+IDEpIHtcXHJcXG4gICAgICAgIGNvbnN0IHByZU1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgodGltZS55ZWFyLCB0aW1lLm1vbnRoIC0gMSlcXHJcXG4gICAgICAgIGNvbnN0IHByZXZNb250aERheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudChwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aClcXHJcXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF5VGV4dCA9IHByZXZNb250aERheUNvdW50IC0gZmlyc3REYXlXZWVrICsgaSArIDFcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXlUZXh0KVxcclxcbiAgICAgICAgICBsZXQgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1ncmF5J1xcclxcbiAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcXHJcXG4gICAgICAgICAgICBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUnXFxyXFxuICAgICAgICAgIH1cXHJcXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XFxyXFxuICAgICAgICAgICAgdGV4dDogZGF5VGV4dCxcXHJcXG4gICAgICAgICAgICBkYXRlOiBkYXRlLFxcclxcbiAgICAgICAgICAgIHNjbGFzczogJ2RhdGVwaWNrZXItaXRlbS1ncmF5J1xcclxcbiAgICAgICAgICB9KVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkYXlDb3VudDsgaSsrKSB7XFxyXFxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCBpKVxcclxcbiAgICAgICAgbGV0IHNjbGFzcyA9ICcnXFxyXFxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcXHJcXG4gICAgICAgICAgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJ1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgaWYgKGkgPT0gdGltZS5kYXkgJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09IHRpbWUueWVhciAmJiBkYXRlLmdldE1vbnRoKCkgPT0gdGltZS5tb250aCl7XFxyXFxuICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSdcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xcclxcbiAgICAgICAgICB0ZXh0OiBpLFxcclxcbiAgICAgICAgICBkYXRlOiBkYXRlLFxcclxcbiAgICAgICAgICBzY2xhc3M6IHNjbGFzc1xcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICB9XFxyXFxuXFxyXFxuICAgICAgaWYgKHRoaXMuZGF0ZVJhbmdlLmxlbmd0aCA8IDQyKSB7XFxyXFxuICAgICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcXHJcXG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCArIDEpXFxyXFxuXFxyXFxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuZXh0TW9udGhOZWVkOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXFxyXFxuICAgICAgICAgIGxldCBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWdyYXknXFxyXFxuICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMSkge1xcclxcbiAgICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSdcXHJcXG4gICAgICAgICAgfVxcclxcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcXHJcXG4gICAgICAgICAgICB0ZXh0OiBpLFxcclxcbiAgICAgICAgICAgIGRhdGU6IGRhdGUsXFxyXFxuICAgICAgICAgICAgc2NsYXNzOiBzY2xhc3NcXHJcXG4gICAgICAgICAgfSlcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgbGV0IGVsID0gdGhpcy4kZWxcXHJcXG4gICAgdGhpcy5fYmx1ciA9IGUgPT4ge1xcclxcbiAgICAgIGlmICghZWwuY29udGFpbnMoZS50YXJnZXQpKVxcclxcbiAgICAgICAgdGhpcy5jbG9zZSgpXFxyXFxuICAgIH1cXHJcXG4gICAgdGhpcy4kZW1pdCgnY2hpbGQtY3JlYXRlZCcsIHRoaXMpXFxyXFxuICAgIHRoaXMuY3VyckRhdGUgPSB0aGlzLnBhcnNlKHRoaXMudmFsdWUpIHx8IHRoaXMucGFyc2UobmV3IERhdGUoKSlcXHJcXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XFxyXFxuICB9LFxcclxcbiAgYmVmb3JlRGVzdHJveSAoKSB7XFxyXFxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JsdXIpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uZGF0ZXBpY2tlciB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxufVxcclxcbmlucHV0LmRhdGVwaWNrZXItaW5wdXQud2l0aC1yZXNldC1idXR0b24ge1xcclxcbiAgcGFkZGluZy1yaWdodDogMjVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2U6Zm9jdXMge1xcclxcbiAgb3BhY2l0eTogLjI7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXBvcHVwIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgbWFyZ2luLXRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwMDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLDAsMCwwLjE3NSk7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWlubmVyIHtcXHJcXG4gIHdpZHRoOiAyMThweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItYm9keSB7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHdpZHRoOiAyOHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI4cHg7XFxyXFxuICBoZWlnaHQ6IDI4cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCB7XFxyXFxuICB3aWR0aDogNjUlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1ib2R5IHNwYW4ge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4ge1xcclxcbiAgd2lkdGg6IDQ4cHg7XFxyXFxuICBoZWlnaHQ6IDUwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogNDVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItaXRlbS1kaXNhYmxlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG4gIGN1cnNvcjogbm90LWFsbG93ZWQhaW1wb3J0YW50O1xcclxcbn1cXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpmaXJzdC1jaGlsZCxcXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpsYXN0LWNoaWxkLFxcclxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWdyYXkge1xcclxcbiAgY29sb3I6ICM5OTk7XFxyXFxufVxcclxcblxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZTpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUge1xcclxcbiAgYmFja2dyb3VuZDogcmdiKDUwLCAxMTgsIDE3NykhaW1wb3J0YW50O1xcclxcbiAgY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAxMHB4XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3BhbixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBwLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcDpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIGk6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlIHNwYW46aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0taG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvciA6ICNlZWVlZWU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXdlZWtSYW5nZSBzcGFuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1sYWJlbCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXHJcXG4gIHBhZGRpbmc6IDdweCAwO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGhlaWdodDogMzBweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5tb250aC1idG4ge1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbW96LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbXMtdXNlci1zZWxlY3Q6bm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0Om5vbmU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXByZUJ0biB7XFxyXFxuICBsZWZ0OiAycHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW5leHRCdG4ge1xcclxcbiAgcmlnaHQ6IDJweDtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDEwMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHQvLyBpbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICB2YWx1ZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGZvcm1hdDogeyBkZWZhdWx0OiAnTU0vZGQveXl5eScgfSxcblx0ICAgIGRpc2FibGVkRGF5c09mV2VlazogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG5cdCAgICAgICAgcmV0dXJuIFtdO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgd2lkdGg6IHsgdHlwZTogU3RyaW5nIC8qLCBkZWZhdWx0OiAnMjAwcHgnKi8gfSxcblx0ICAgIGNsZWFyQnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBsYW5nOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbmF2aWdhdG9yLmxhbmd1YWdlIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGljb25zRm9udDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdnbHlwaGljb24nIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjdXJyRGF0ZTogbmV3IERhdGUoKSxcblx0ICAgICAgZGF0ZVJhbmdlOiBbXSxcblx0ICAgICAgZGVjYWRlUmFuZ2U6IFtdLFxuXHQgICAgICBkaXNwbGF5RGF5VmlldzogZmFsc2UsXG5cdCAgICAgIGRpc3BsYXlNb250aFZpZXc6IGZhbHNlLFxuXHQgICAgICBkaXNwbGF5WWVhclZpZXc6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBjdXJyRGF0ZTogZnVuY3Rpb24gY3VyckRhdGUoKSB7XG5cdCAgICAgIHRoaXMuZ2V0RGF0ZVJhbmdlKCk7XG5cdCAgICB9LFxuXHQgICAgZm9ybWF0OiBmdW5jdGlvbiBmb3JtYXQoKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdGhpcy5zdHJpbmdpZnkodGhpcy5jdXJyRGF0ZSkpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHRleHQ6IGZ1bmN0aW9uIHRleHQoKSB7XG5cdCAgICAgIHJldHVybiAoMCwgX3V0aWxzLnRyYW5zbGF0aW9ucykodGhpcy5sYW5nKTtcblx0ICAgIH0sXG5cdCAgICBwcmVCdG5DbGFzc2VzOiBmdW5jdGlvbiBwcmVCdG5DbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gJ2RhdGVwaWNrZXItcHJlQnRuICcgKyB0aGlzLmljb25zRm9udCArICcgJyArIHRoaXMuaWNvbnNGb250ICsgJy1jaGV2cm9uLWxlZnQnO1xuXHQgICAgfSxcblx0ICAgIG5leHRCdG5DbGFzc2VzOiBmdW5jdGlvbiBuZXh0QnRuQ2xhc3NlcygpIHtcblx0ICAgICAgcmV0dXJuICdkYXRlcGlja2VyLW5leHRCdG4gJyArIHRoaXMuaWNvbnNGb250ICsgJyAnICsgdGhpcy5pY29uc0ZvbnQgKyAnLWNoZXZyb24tcmlnaHQnO1xuXHQgICAgfSxcblx0ICAgIGRpc2FibGVkRGF5c0FycmF5OiBmdW5jdGlvbiBkaXNhYmxlZERheXNBcnJheSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWREYXlzT2ZXZWVrLm1hcChmdW5jdGlvbiAoZCkge1xuXHQgICAgICAgIHJldHVybiBwYXJzZUludChkLCAxMCk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZTtcblx0ICAgIH0sXG5cdCAgICBpbnB1dENsaWNrOiBmdW5jdGlvbiBpbnB1dENsaWNrKCkge1xuXHQgICAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbHVlKSB8fCB0aGlzLnBhcnNlKG5ldyBEYXRlKCkpO1xuXHQgICAgICBpZiAodGhpcy5kaXNwbGF5TW9udGhWaWV3IHx8IHRoaXMuZGlzcGxheVllYXJWaWV3KSB7XG5cdCAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSAhdGhpcy5kaXNwbGF5RGF5Vmlldztcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHREZWNhZGVDbGljazogZnVuY3Rpb24gcHJlTmV4dERlY2FkZUNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMTAsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxMCwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHRNb250aENsaWNrOiBmdW5jdGlvbiBwcmVOZXh0TW9udGhDbGljayhmbGFnKSB7XG5cdCAgICAgIHZhciB5ZWFyID0gdGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgICB2YXIgbW9udGggPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHZhciBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSk7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB2YXIgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKTtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwcmVOZXh0WWVhckNsaWNrOiBmdW5jdGlvbiBwcmVOZXh0WWVhckNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMSwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB5ZWFyU2VsZWN0OiBmdW5jdGlvbiB5ZWFyU2VsZWN0KHllYXIpIHtcblx0ICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIsIHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKSwgdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCkpO1xuXHQgICAgfSxcblx0ICAgIGRheVNlbGVjdDogZnVuY3Rpb24gZGF5U2VsZWN0KGRheSkge1xuXHQgICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gZGF5LmRhdGU7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKSk7XG5cdCAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc3dpdGNoTW9udGhWaWV3OiBmdW5jdGlvbiBzd2l0Y2hNb250aFZpZXcoKSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdHJ1ZTtcblx0ICAgIH0sXG5cdCAgICBzd2l0Y2hEZWNhZGVWaWV3OiBmdW5jdGlvbiBzd2l0Y2hEZWNhZGVWaWV3KCkge1xuXHQgICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSB0cnVlO1xuXHQgICAgfSxcblx0ICAgIG1vbnRoU2VsZWN0OiBmdW5jdGlvbiBtb250aFNlbGVjdChpbmRleCkge1xuXHQgICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IHRydWU7XG5cdCAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksIGluZGV4LCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSk7XG5cdCAgICB9LFxuXHQgICAgZ2V0WWVhck1vbnRoOiBmdW5jdGlvbiBnZXRZZWFyTW9udGgoeWVhciwgbW9udGgpIHtcblx0ICAgICAgaWYgKG1vbnRoID4gMTEpIHtcblx0ICAgICAgICB5ZWFyKys7XG5cdCAgICAgICAgbW9udGggPSAwO1xuXHQgICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkge1xuXHQgICAgICAgIHllYXItLTtcblx0ICAgICAgICBtb250aCA9IDExO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB7IHllYXI6IHllYXIsIG1vbnRoOiBtb250aCB9O1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeURlY2FkZUhlYWRlcjogZnVuY3Rpb24gc3RyaW5naWZ5RGVjYWRlSGVhZGVyKGRhdGUpIHtcblx0ICAgICAgdmFyIHllYXJTdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcblx0ICAgICAgdmFyIGZpcnN0WWVhck9mRGVjYWRlID0geWVhclN0ci5zdWJzdHJpbmcoMCwgeWVhclN0ci5sZW5ndGggLSAxKSArIDA7XG5cdCAgICAgIHZhciBsYXN0WWVhck9mRGVjYWRlID0gcGFyc2VJbnQoZmlyc3RZZWFyT2ZEZWNhZGUsIDEwKSArIDEwO1xuXHQgICAgICByZXR1cm4gZmlyc3RZZWFyT2ZEZWNhZGUgKyAnLScgKyBsYXN0WWVhck9mRGVjYWRlO1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeURheUhlYWRlcjogZnVuY3Rpb24gc3RyaW5naWZ5RGF5SGVhZGVyKGRhdGUpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXSArICcgJyArIGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0ICAgIH0sXG5cdCAgICBwYXJzZU1vbnRoOiBmdW5jdGlvbiBwYXJzZU1vbnRoKGRhdGUpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXTtcblx0ICAgIH0sXG5cdCAgICBzdHJpbmdpZnlZZWFySGVhZGVyOiBmdW5jdGlvbiBzdHJpbmdpZnlZZWFySGVhZGVyKGRhdGUpIHtcblx0ICAgICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0ICAgIH0sXG5cdCAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShkYXRlKSB7XG5cdCAgICAgIHZhciBmb3JtYXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRoaXMuZm9ybWF0O1xuXHRcblx0ICAgICAgaWYgKCFkYXRlKSBkYXRlID0gdGhpcy5wYXJzZSgpO1xuXHQgICAgICBpZiAoIWRhdGUpIHJldHVybiAnJztcblx0ICAgICAgdmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XG5cdCAgICAgIHZhciBkYXkgPSBkYXRlLmdldERhdGUoKTtcblx0ICAgICAgdmFyIG1vbnRoTmFtZSA9IHRoaXMucGFyc2VNb250aChkYXRlKTtcblx0XG5cdCAgICAgIHJldHVybiBmb3JtYXQucmVwbGFjZSgveXl5eS9nLCB5ZWFyKS5yZXBsYWNlKC9NTU1NL2csIG1vbnRoTmFtZSkucmVwbGFjZSgvTU1NL2csIG1vbnRoTmFtZS5zdWJzdHJpbmcoMCwgMykpLnJlcGxhY2UoL01NL2csICgnMCcgKyBtb250aCkuc2xpY2UoLTIpKS5yZXBsYWNlKC9kZC9nLCAoJzAnICsgZGF5KS5zbGljZSgtMikpLnJlcGxhY2UoL3l5L2csIHllYXIpLnJlcGxhY2UoL00oPyFhKS9nLCBtb250aCkucmVwbGFjZSgvZC9nLCBkYXkpO1xuXHQgICAgfSxcblx0ICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZSgpIHtcblx0ICAgICAgdmFyIHN0ciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy52YWx1ZTtcblx0XG5cdCAgICAgIHZhciBkYXRlID0gdm9pZCAwO1xuXHQgICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMTAgJiYgKHRoaXMuZm9ybWF0ID09PSAnZGQtTU0teXl5eScgfHwgdGhpcy5mb3JtYXQgPT09ICdkZC9NTS95eXl5JykpIHtcblx0ICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RyLnN1YnN0cmluZyg2LCAxMCksIHN0ci5zdWJzdHJpbmcoMywgNSkgLSAxLCBzdHIuc3Vic3RyaW5nKDAsIDIpKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RyKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gaXNOYU4oZGF0ZS5nZXRGdWxsWWVhcigpKSA/IG5ldyBEYXRlKCkgOiBkYXRlO1xuXHQgICAgfSxcblx0ICAgIGdldERheUNvdW50OiBmdW5jdGlvbiBnZXREYXlDb3VudCh5ZWFyLCBtb250aCkge1xuXHQgICAgICB2YXIgZGljdCA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcblx0ICAgICAgaWYgKG1vbnRoID09PSAxKSB7XG5cdCAgICAgICAgaWYgKHllYXIgJSA0MDAgPT09IDAgfHwgeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCkge1xuXHQgICAgICAgICAgcmV0dXJuIDI5O1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gZGljdFttb250aF07XG5cdCAgICB9LFxuXHQgICAgZ2V0RGF0ZVJhbmdlOiBmdW5jdGlvbiBnZXREYXRlUmFuZ2UoKSB7XG5cdCAgICAgIHRoaXMuZGF0ZVJhbmdlID0gW107XG5cdCAgICAgIHRoaXMuZGVjYWRlUmFuZ2UgPSBbXTtcblx0ICAgICAgdmFyIHRpbWUgPSB7XG5cdCAgICAgICAgeWVhcjogdGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpLFxuXHQgICAgICAgIG1vbnRoOiB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCksXG5cdCAgICAgICAgZGF5OiB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxuXHQgICAgICB9O1xuXHQgICAgICB2YXIgeWVhclN0ciA9IHRpbWUueWVhci50b1N0cmluZygpO1xuXHQgICAgICB2YXIgZmlyc3RZZWFyT2ZEZWNhZGUgPSB5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMCAtIDE7XG5cdCAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTI7IGkrKykge1xuXHQgICAgICAgIHRoaXMuZGVjYWRlUmFuZ2UucHVzaCh7XG5cdCAgICAgICAgICB0ZXh0OiBmaXJzdFllYXJPZkRlY2FkZSArIGlcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCAxKTtcblx0ICAgICAgdmFyIGZpcnN0RGF5V2VlayA9IGN1cnJNb250aEZpcnN0RGF5LmdldERheSgpICsgMTtcblx0ICAgICAgaWYgKGZpcnN0RGF5V2VlayA9PT0gMCkge1xuXHQgICAgICAgIGZpcnN0RGF5V2VlayA9IDc7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIGRheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudCh0aW1lLnllYXIsIHRpbWUubW9udGgpO1xuXHQgICAgICBpZiAoZmlyc3REYXlXZWVrID4gMSkge1xuXHQgICAgICAgIHZhciBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCAtIDEpO1xuXHQgICAgICAgIHZhciBwcmV2TW9udGhEYXlDb3VudCA9IHRoaXMuZ2V0RGF5Q291bnQocHJlTW9udGgueWVhciwgcHJlTW9udGgubW9udGgpO1xuXHQgICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBmaXJzdERheVdlZWs7IF9pKyspIHtcblx0ICAgICAgICAgIHZhciBkYXlUZXh0ID0gcHJldk1vbnRoRGF5Q291bnQgLSBmaXJzdERheVdlZWsgKyBfaSArIDE7XG5cdCAgICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXlUZXh0KTtcblx0ICAgICAgICAgIHZhciBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWdyYXknO1xuXHQgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWREYXlzQXJyYXkuaW5kZXhPZihkYXRlLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSc7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcblx0ICAgICAgICAgICAgdGV4dDogZGF5VGV4dCxcblx0ICAgICAgICAgICAgZGF0ZTogZGF0ZSxcblx0ICAgICAgICAgICAgc2NsYXNzOiAnZGF0ZXBpY2tlci1pdGVtLWdyYXknXG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIF9pMiA9IDE7IF9pMiA8PSBkYXlDb3VudDsgX2kyKyspIHtcblx0ICAgICAgICB2YXIgX2RhdGUgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIF9pMik7XG5cdCAgICAgICAgdmFyIF9zY2xhc3MgPSAnJztcblx0ICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKF9kYXRlLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICBfc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKF9pMiA9PSB0aW1lLmRheSAmJiBfZGF0ZS5nZXRGdWxsWWVhcigpID09IHRpbWUueWVhciAmJiBfZGF0ZS5nZXRNb250aCgpID09IHRpbWUubW9udGgpIHtcblx0ICAgICAgICAgIF9zY2xhc3MgPSAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcblx0ICAgICAgICAgIHRleHQ6IF9pMixcblx0ICAgICAgICAgIGRhdGU6IF9kYXRlLFxuXHQgICAgICAgICAgc2NsYXNzOiBfc2NsYXNzXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGlmICh0aGlzLmRhdGVSYW5nZS5sZW5ndGggPCA0Mikge1xuXHQgICAgICAgIHZhciBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGg7XG5cdCAgICAgICAgdmFyIG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCArIDEpO1xuXHRcblx0ICAgICAgICBmb3IgKHZhciBfaTMgPSAxOyBfaTMgPD0gbmV4dE1vbnRoTmVlZDsgX2kzKyspIHtcblx0ICAgICAgICAgIHZhciBfZGF0ZTIgPSBuZXcgRGF0ZShuZXh0TW9udGgueWVhciwgbmV4dE1vbnRoLm1vbnRoLCBfaTMpO1xuXHQgICAgICAgICAgdmFyIF9zY2xhc3MyID0gJ2RhdGVwaWNrZXItaXRlbS1ncmF5Jztcblx0ICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoX2RhdGUyLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICAgIF9zY2xhc3MyID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuXHQgICAgICAgICAgICB0ZXh0OiBfaTMsXG5cdCAgICAgICAgICAgIGRhdGU6IF9kYXRlMixcblx0ICAgICAgICAgICAgc2NsYXNzOiBfc2NsYXNzMlxuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICB2YXIgZWwgPSB0aGlzLiRlbDtcblx0ICAgIHRoaXMuX2JsdXIgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBpZiAoIWVsLmNvbnRhaW5zKGUudGFyZ2V0KSkgX3RoaXMuY2xvc2UoKTtcblx0ICAgIH07XG5cdCAgICB0aGlzLiRlbWl0KCdjaGlsZC1jcmVhdGVkJywgdGhpcyk7XG5cdCAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbHVlKSB8fCB0aGlzLnBhcnNlKG5ldyBEYXRlKCkpO1xuXHQgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTA0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sIGRhdGVwaWNrZXItaW5wdXRcIixcblx0ICAgIGNsYXNzOiB7XG5cdCAgICAgICd3aXRoLXJlc2V0LWJ1dHRvbic6IF92bS5jbGVhckJ1dHRvblxuXHQgICAgfSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLndpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInRleHRcIixcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0ucGxhY2Vob2xkZXJcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS52YWx1ZVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmlucHV0Q2xpY2ssXG5cdCAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLiRlbWl0KCdpbnB1dCcsICRldmVudC50YXJnZXQudmFsdWUpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgKF92bS5jbGVhckJ1dHRvbiAmJiBfdm0udmFsdWUpID8gX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS4kZW1pdCgnaW5wdXQnLCAnJylcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCBbX3ZtLl92KFwiw5dcIildKV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmRpc3BsYXlEYXlWaWV3KSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJkaXNwbGF5RGF5Vmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRNb250aENsaWNrKDApXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5uZXh0QnRuQ2xhc3Nlcyxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5wcmVOZXh0TW9udGhDbGljaygxKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygncCcsIHtcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLnN3aXRjaE1vbnRoVmlld1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5zdHJpbmdpZnlEYXlIZWFkZXIoX3ZtLmN1cnJEYXRlKSkpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLXdlZWtSYW5nZVwiXG5cdCAgfSwgX3ZtLl9sKChfdm0udGV4dC5kYXlzT2ZXZWVrKSwgZnVuY3Rpb24odykge1xuXHQgICAgcmV0dXJuIF92bS5fYygnc3BhbicsIFtfdm0uX3YoX3ZtLl9zKHcpKV0pXG5cdCAgfSkpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItZGF0ZVJhbmdlXCJcblx0ICB9LCBfdm0uX2woKF92bS5kYXRlUmFuZ2UpLCBmdW5jdGlvbihkKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgICBjbGFzczogZC5zY2xhc3MsXG5cdCAgICAgIG9uOiB7XG5cdCAgICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAgIF92bS5kYXlTZWxlY3QoZClcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX3YoX3ZtLl9zKGQudGV4dCkpXSlcblx0ICB9KSldKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmRpc3BsYXlNb250aFZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlNb250aFZpZXdcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLXBvcHVwXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLWlubmVyXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLWJvZHlcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItY3RybFwiXG5cdCAgfSwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBfdm0ucHJlQnRuQ2xhc3Nlcyxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5wcmVOZXh0WWVhckNsaWNrKDApXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5uZXh0QnRuQ2xhc3Nlcyxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5wcmVOZXh0WWVhckNsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywge1xuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uc3dpdGNoRGVjYWRlVmlld1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5zdHJpbmdpZnlZZWFySGVhZGVyKF92bS5jdXJyRGF0ZSkpKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1tb250aFJhbmdlXCJcblx0ICB9LCBbX3ZtLl9sKChfdm0udGV4dC5tb250aHMpLCBmdW5jdGlvbihtLCBpbmRleCkge1xuXHQgICAgcmV0dXJuIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGNsYXNzOiB7XG5cdCAgICAgICAgJ2RhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0tYWN0aXZlJzpcblx0ICAgICAgICAoX3ZtLnRleHQubW9udGhzW192bS5wYXJzZShfdm0udmFsdWUpLmdldE1vbnRoKCldID09PSBtKSAmJlxuXHQgICAgICAgIF92bS5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpID09PSBfdm0ucGFyc2UoX3ZtLnZhbHVlKS5nZXRGdWxsWWVhcigpXG5cdCAgICAgIH0sXG5cdCAgICAgIG9uOiB7XG5cdCAgICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAgIF92bS5tb250aFNlbGVjdChpbmRleClcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX3YoX3ZtLl9zKG0uc3Vic3RyKDAsIDMpKSldKV1cblx0ICB9KV0sIDIpXSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5kaXNwbGF5WWVhclZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlZZWFyVmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHREZWNhZGVDbGljaygwKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBfdm0ubmV4dEJ0bkNsYXNzZXMsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0ucHJlTmV4dERlY2FkZUNsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeURlY2FkZUhlYWRlcihfdm0uY3VyckRhdGUpKSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItbW9udGhSYW5nZSBkZWNhZGVSYW5nZVwiXG5cdCAgfSwgW192bS5fbCgoX3ZtLmRlY2FkZVJhbmdlKSwgZnVuY3Rpb24oZGVjYWRlKSB7XG5cdCAgICByZXR1cm4gW192bS5fYygnc3BhbicsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOiBfdm0ucGFyc2UodGhpcy52YWx1ZSkuZ2V0RnVsbFllYXIoKSA9PT0gZGVjYWRlLnRleHRcblx0ICAgICAgfSxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICAgX3ZtLnllYXJTZWxlY3QoZGVjYWRlLnRleHQpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl92KF92bS5fcyhkZWNhZGUudGV4dCkpXSldXG5cdCAgfSldLCAyKV0pXSldKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTQ3N2I4ZTVkXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTA1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcRHJvcGRvd24udnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTM5YmUxMDcyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zOWJlMTA3MlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIERyb3Bkb3duLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEwNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KTtcblx0XG5cdHZhciBfQ2xpY2tPdXRzaWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsaWNrT3V0c2lkZSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBkaXJlY3RpdmVzOiB7XG5cdCAgICBDbGlja091dHNpZGU6IF9DbGlja091dHNpZGUyLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2l6ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2RlZmF1bHQnIH0sXG5cdCAgICB2YWx1ZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIHNob3cgPSB0aGlzLnZhbHVlO1xuXHQgICAgcmV0dXJuIHsgc2hvdzogc2hvdyB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KHZhbCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICB0aGlzLnNob3cgPSB2YWw7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYnV0dG9uU2l6ZTogZnVuY3Rpb24gYnV0dG9uU2l6ZSgpIHtcblx0ICAgICAgcmV0dXJuIH5bJ2xnJywgJ3NtJywgJ3hzJ10uaW5kZXhPZih0aGlzLnNpemUpID8gJ2J0bi0nICsgdGhpcy5zaXplIDogJyc7XG5cdCAgICB9LFxuXHQgICAgaW5JbnB1dDogZnVuY3Rpb24gaW5JbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgaXNMaTogZnVuY3Rpb24gaXNMaSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faXNUYWJzIHx8IHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51O1xuXHQgICAgfSxcblx0ICAgIG1lbnU6IGZ1bmN0aW9uIG1lbnUoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy4kcGFyZW50IHx8IHRoaXMuJHBhcmVudC5uYXZiYXI7XG5cdCAgICB9LFxuXHQgICAgc2xvdHM6IGZ1bmN0aW9uIHNsb3RzKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc2xvdENvbnRlbnRzO1xuXHQgICAgfSxcblx0ICAgIHN1Ym1lbnU6IGZ1bmN0aW9uIHN1Ym1lbnUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQgJiYgKHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5zdWJtZW51KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcblx0ICAgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgndWwnLCB0aGlzLiRlbCkub24oJ2NsaWNrJywgJ2xpPmEnLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBfdGhpcy5zaG93ID0gZmFsc2U7XG5cdCAgICB9KTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgndWwnLCB0aGlzLiRlbCkub2ZmKCk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTA3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoX3ZtLmlzTGkgPyAnbGknIDogJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwiY2xpY2stb3V0c2lkZVwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtY2xpY2stb3V0c2lkZVwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5ibHVyKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJibHVyXCJcblx0ICAgIH1dLFxuXHQgICAgdGFnOiBcImRpdlwiLFxuXHQgICAgY2xhc3M6IFt7XG5cdCAgICAgIG9wZW46IF92bS5zaG93LFxuXHQgICAgICBkaXNhYmxlZDogX3ZtLmRpc2FibGVkLFxuXHQgICAgICBkcm9wZG93bjogX3ZtLmlzTGksXG5cdCAgICAgICdpbnB1dC1ncm91cC1idG4nOiBfdm0uaW5JbnB1dCxcblx0ICAgICAgJ2J0bi1ncm91cCc6ICFfdm0uaXNMaSAmJiAhX3ZtLmluSW5wdXRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fdChcImJlZm9yZVwiKSwgX3ZtLl92KFwiIFwiKSwgKF92bS5pc0xpKSA/IF92bS5fYygnYScsIHtcblx0ICAgIGNsYXNzOiBbJ2Ryb3Bkb3duLXRvZ2dsZScsIF92bS5idXR0b25TaXplLCB7XG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWRcblx0ICAgIH1dLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZXNjXCIsIDI3KSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0uc2hvdyA9IGZhbHNlXG5cdCAgICAgIH0sXG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgkZXZlbnQpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiYnV0dG9uXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50ZXh0KSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2FyZXRcIlxuXHQgIH0pXSwgMikgOiBfdm0uX2MoJ2J1dHRvbicsIHtcblx0ICAgIGNsYXNzOiBbJ2J0biBidG4tJyArIF92bS50eXBlLCBfdm0uYnV0dG9uU2l6ZSwgJ2Ryb3Bkb3duLXRvZ2dsZSddLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCIsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnNob3cgPSBmYWxzZVxuXHQgICAgICB9LFxuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS50b2dnbGUoJGV2ZW50KVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImJ1dHRvblwiLCBbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNhcmV0XCJcblx0ICB9KV0sIDIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkcm9wZG93bi1tZW51XCIsIFtfdm0uX2MoJ3VsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZHJvcGRvd24tbWVudVwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzliZTEwNzJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTA5KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxGb3JtR3JvdXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTc5ZWI0MDBhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi03OWViNDAwYVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEZvcm1Hcm91cC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvLyBsZXQgY29lcmNlID0ge1xuXHQvLyAgICAgZW50ZXJTdWJtaXQ6ICdib29sZWFuJyxcblx0Ly8gICAgIGljb246ICdib29sZWFuJ1xuXHQvLyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGVudGVyU3VibWl0OiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IGZhbHNlXG5cdCAgICB9LFxuXHQgICAgaWNvbjoge1xuXHQgICAgICB0eXBlOiBCb29sZWFuLFxuXHQgICAgICBkZWZhdWx0OiBmYWxzZVxuXHQgICAgfSxcblx0ICAgIGxhbmc6IHtcblx0ICAgICAgdHlwZTogU3RyaW5nLFxuXHQgICAgICBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2Vcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjaGlsZHJlbjogW10sXG5cdCAgICAgIHZhbGlkOiBudWxsLFxuXHQgICAgICB0aW1lb3V0OiBudWxsXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQgJiYgdGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgdmFyIHZhbGlkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jaGlsZHJlbi5zb21lKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHZhciB2ID0gZWwudmFsaWRhdGUgPyBlbC52YWxpZGF0ZSgpIDogZWwudmFsaWQgIT09IHVuZGVmaW5lZCA/IGVsLnZhbGlkIDogZWwucmVxdWlyZWQgJiYgIX5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZihlbC52YWx1ZSk7XG5cdCAgICAgICAgaWYgKCF2KSB2YWxpZCA9IGZhbHNlO1xuXHQgICAgICAgIHJldHVybiAhdmFsaWQ7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLnZhbGlkID0gdmFsaWQ7XG5cdCAgICAgIHJldHVybiB2YWxpZCA9PT0gdHJ1ZTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9mb3JtR3JvdXAgPSB0cnVlO1xuXHQgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcblx0ICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5fZm9ybUdyb3VwKSB7XG5cdCAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuXHQgICAgfVxuXHQgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuX2Zvcm1Hcm91cCkge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHRoaXMudmFsaWRhdGUoKTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxMTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnc3BhbicsIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNzllYjQwMGFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxGb3JtVmFsaWRhdG9yLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1iOWY1N2M0NlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtYjlmNTdjNDZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBGb3JtVmFsaWRhdG9yLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDExMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZW50ZXJTdWJtaXQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGljb246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2UgfSxcblx0ICAgIHZhbHVlOiBudWxsXG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY2hpbGRyZW46IFtdLFxuXHQgICAgICB2YWxpZDogbnVsbCxcblx0ICAgICAgdGltZW91dDogbnVsbFxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICB3YXRjaDoge1xuXHQgICAgdmFsaWQ6IGZ1bmN0aW9uIHZhbGlkKHZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lzdmFsaWQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQgJiYgdGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgdmFyIGludmFsaWQgPSAhdGhpcy5jaGlsZHJlbi5ldmVyeShmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwudmFsaWRhdGUgPyBlbC52YWxpZGF0ZSgpIDogZWwudmFsaWQgIT09IHVuZGVmaW5lZCA/IGVsLnZhbGlkIDogZWwucmVxdWlyZWQgJiYgIX5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZihlbC52YWx1ZSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLnZhbGlkID0gIWludmFsaWQ7XG5cdCAgICAgIHJldHVybiAhaW52YWxpZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9mb3JtVmFsaWRhdG9yID0gdHJ1ZTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHRoaXMudmFsaWRhdGUoKTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxMTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnc3BhbicsIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtYjlmNTdjNDZcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTE1KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTE3KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExOClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxJbnB1dC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdF9fdnVlX29wdGlvbnNfXy5fc2NvcGVJZCA9IFwiZGF0YS12LTY1MmFkN2I5XCJcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi02NTJhZDdiOVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNjUyYWQ3YjlcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBJbnB1dC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMTUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExNik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjUyYWQ3Yjkmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0lucHV0LnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjUyYWQ3Yjkmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0lucHV0LnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDExNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZm9ybS1ncm91cFtkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxubGFiZWx+LmNsb3NlW2RhdGEtdi02NTJhZDdiOV0ge1xcclxcbiAgdG9wOiAyNXB4O1xcbn1cXG4uaW5wdXQtZ3JvdXA+Lmljb25bZGF0YS12LTY1MmFkN2I5XSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcclxcbiAgd2lkdGg6MDtcXHJcXG4gIHotaW5kZXg6IDM7XFxufVxcbi5jbG9zZVtkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmhhcy1mZWVkYmFjayAuY2xvc2VbZGF0YS12LTY1MmFkN2I5XSB7XFxyXFxuICByaWdodDogMjBweDtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9JbnB1dC52dWU/MmM1NTRkM2RcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTBRQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFVBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFQUNBLFFBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsT0FBQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxZQUFBO0NBQ0FcIixcImZpbGVcIjpcIklucHV0LnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIiA6Y2xhc3M9XFxcInt2YWxpZGF0ZTpjYW5WYWxpZGF0ZSwnaGFzLWZlZWRiYWNrJzppY29uLCdoYXMtZXJyb3InOmNhblZhbGlkYXRlJiZ2YWxpZD09PWZhbHNlLCdoYXMtc3VjY2Vzcyc6Y2FuVmFsaWRhdGUmJnZhbGlkfVxcXCI+XFxyXFxuICAgIDxzbG90IG5hbWU9XFxcImxhYmVsXFxcIj48bGFiZWwgdi1pZj1cXFwibGFiZWxcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIiBAY2xpY2s9XFxcImZvY3VzXFxcIj57e2xhYmVsfX08L2xhYmVsPjwvc2xvdD5cXHJcXG4gICAgPGRpdiB2LWlmPVxcXCIkc2xvdHMuYmVmb3JlfHwkc2xvdHMuYWZ0ZXJcXFwiIGNsYXNzPVxcXCJpbnB1dC1ncm91cFxcXCI+XFxyXFxuICAgICAgPHNsb3QgbmFtZT1cXFwiYmVmb3JlXFxcIj48L3Nsb3Q+XFxyXFxuICAgICAgPHRleHRhcmVhIDppcz1cXFwidHlwZT09J3RleHRhcmVhJz90eXBlOidpbnB1dCdcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICA6Y29scz1cXFwiY29sc1xcXCJcXHJcXG4gICAgICAgIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiXFxyXFxuICAgICAgICA6bGlzdD1cXFwiaWRfZGF0YWxpc3RcXFwiXFxyXFxuICAgICAgICA6bWF4PVxcXCJhdHRyKG1heClcXFwiXFxyXFxuICAgICAgICA6bWF4bGVuZ3RoPVxcXCJtYXhsZW5ndGhcXFwiXFxyXFxuICAgICAgICA6bWluPVxcXCJhdHRyKG1pbilcXFwiXFxyXFxuICAgICAgICA6bmFtZT1cXFwibmFtZVxcXCJcXHJcXG4gICAgICAgIDpwbGFjZWhvbGRlcj1cXFwicGxhY2Vob2xkZXJcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOnJlcXVpcmVkPVxcXCJyZXF1aXJlZFxcXCJcXHJcXG4gICAgICAgIDpyb3dzPVxcXCJyb3dzXFxcIlxcclxcbiAgICAgICAgOnN0ZXA9XFxcInN0ZXBcXFwiXFxyXFxuICAgICAgICA6dGl0bGU9XFxcImF0dHIodGl0bGUpXFxcIlxcclxcbiAgICAgICAgOnR5cGU9XFxcInR5cGU9PSd0ZXh0YXJlYSc/bnVsbDp0eXBlXFxcIlxcclxcbiAgICAgICAgdi1tb2RlbD1cXFwidmFsXFxcIlxcclxcbiAgICAgICAgQGJsdXI9XFxcImVtaXRcXFwiIEBmb2N1cz1cXFwiZW1pdFxcXCIgQGlucHV0PVxcXCJlbWl0XFxcIlxcclxcbiAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ0eXBlIT0ndGV4dGFyZWEnJiZlbnRlclN1Ym1pdCYmc3VibWl0KClcXFwiXFxyXFxuICAgICAgPjwvdGV4dGFyZWE+XFxyXFxuICAgICAgPGRpdiB2LWlmPVxcXCJjbGVhckJ1dHRvbiAmJiB2YWx1ZVxcXCIgOmNsYXNzPVxcXCJ7aWNvbjppY29ufVxcXCI+XFxyXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwidmFsdWUgPSAnJ1xcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgICA8ZGl2IHYtaWY9XFxcImljb25cXFwiIGNsYXNzPVxcXCJpY29uXFxcIj5cXHJcXG4gICAgICAgIDxzcGFuIHYtaWY9XFxcImljb24mJnZhbGlkIT09bnVsbFxcXCIgOmNsYXNzPVxcXCJbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCdnbHlwaGljb24tJysodmFsaWQ/J29rJzoncmVtb3ZlJyldXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICAgIDxzbG90IG5hbWU9XFxcImFmdGVyXFxcIj48L3Nsb3Q+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8dGVtcGxhdGUgdi1lbHNlPlxcclxcbiAgICAgIDx0ZXh0YXJlYSA6aXM9XFxcInR5cGU9PSd0ZXh0YXJlYSc/dHlwZTonaW5wdXQnXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiByZWY9XFxcImlucHV0XFxcIlxcclxcbiAgICAgICAgOmNvbHM9XFxcImNvbHNcXFwiXFxyXFxuICAgICAgICA6ZGlzYWJsZWQ9XFxcImRpc2FibGVkXFxcIlxcclxcbiAgICAgICAgOmxpc3Q9XFxcImlkX2RhdGFsaXN0XFxcIlxcclxcbiAgICAgICAgOm1heD1cXFwiYXR0cihtYXgpXFxcIlxcclxcbiAgICAgICAgOm1heGxlbmd0aD1cXFwibWF4bGVuZ3RoXFxcIlxcclxcbiAgICAgICAgOm1pbj1cXFwiYXR0cihtaW4pXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cGxhY2Vob2xkZXI9XFxcInBsYWNlaG9sZGVyXFxcIlxcclxcbiAgICAgICAgOnJlYWRvbmx5PVxcXCJyZWFkb25seVxcXCJcXHJcXG4gICAgICAgIDpyZXF1aXJlZD1cXFwicmVxdWlyZWRcXFwiXFxyXFxuICAgICAgICA6cm93cz1cXFwicm93c1xcXCJcXHJcXG4gICAgICAgIDpzdGVwPVxcXCJzdGVwXFxcIlxcclxcbiAgICAgICAgOnRpdGxlPVxcXCJhdHRyKHRpdGxlKVxcXCJcXHJcXG4gICAgICAgIDp0eXBlPVxcXCJ0eXBlPT0ndGV4dGFyZWEnP251bGw6dHlwZVxcXCJcXHJcXG4gICAgICAgIHYtbW9kZWw9XFxcInZhbFxcXCJcXHJcXG4gICAgICAgIEBibHVyPVxcXCJlbWl0XFxcIiBAZm9jdXM9XFxcImVtaXRcXFwiIEBpbnB1dD1cXFwiZW1pdFxcXCJcXHJcXG4gICAgICAgIEBrZXl1cC5lbnRlcj1cXFwidHlwZSE9J3RleHRhcmVhJyYmZW50ZXJTdWJtaXQmJnN1Ym1pdCgpXFxcIlxcclxcbiAgICAgID48L3RleHRhcmVhPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImNsZWFyQnV0dG9uICYmIHZhbFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcInZhbCA9ICcnXFxcIj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImljb24mJnZhbGlkIT09bnVsbFxcXCIgOmNsYXNzPVxcXCJbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCdnbHlwaGljb24tJysodmFsaWQ/J29rJzoncmVtb3ZlJyldXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcclxcbiAgICA8L3RlbXBsYXRlPlxcclxcbiAgICA8ZGF0YWxpc3Qgdi1pZj1cXFwiaWRfZGF0YWxpc3RcXFwiIDppZD1cXFwiaWRfZGF0YWxpc3RcXFwiPlxcclxcbiAgICAgIDxvcHRpb24gdi1mb3I9XFxcIm9wYyBpbiBvcHRpb25zXFxcIiA6dmFsdWU9XFxcIm9wY1xcXCI+PC9vcHRpb24+XFxyXFxuICAgIDwvZGF0YWxpc3Q+XFxyXFxuICAgIDxkaXYgdi1pZj1cXFwic2hvd0hlbHBcXFwiIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIiBAY2xpY2s9XFxcImZvY3VzXFxcIj57e2hlbHB9fTwvZGl2PlxcclxcbiAgICA8ZGl2IHYtaWY9XFxcInNob3dFcnJvclxcXCIgY2xhc3M9XFxcImhlbHAtYmxvY2sgd2l0aC1lcnJvcnNcXFwiIEBjbGljaz1cXFwiZm9jdXNcXFwiPnt7ZXJyb3JUZXh0fX08L2Rpdj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2NvZXJjZSwgZGVsYXllciwgdHJhbnNsYXRpb25zfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xcclxcbmltcG9ydCAkIGZyb20gJy4vdXRpbHMvTm9kZUxpc3QuanMnXFxyXFxuXFxyXFxudmFyIERFTEFZID0gMzAwXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGNvbHM6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBkYXRhbGlzdDoge3R5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgZGlzYWJsZWQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGVudGVyU3VibWl0OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBlcnJvcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGhlbHA6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBoaWRlSGVscDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWV9LFxcclxcbiAgICBpY29uOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYWJlbDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxhbmc6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZX0sXFxyXFxuICAgIG1hc2s6IG51bGwsXFxyXFxuICAgIG1hc2tEZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMTAwfSxcXHJcXG4gICAgbWF0Y2g6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtYXg6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtYXhsZW5ndGg6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtaW46IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtaW5sZW5ndGg6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDB9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcGF0dGVybjoge2RlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBwbGFjZWhvbGRlcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHJlYWRvbmx5OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICByZXF1aXJlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgcm93czoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogM30sXFxyXFxuICAgIHN0ZXA6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB0eXBlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGV4dCd9LFxcclxcbiAgICB1cmw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB1cmxNYXA6IHt0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbGlkYXRpb25EZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMjUwfSxcXHJcXG4gICAgdmFsdWU6IHtkZWZhdWx0OiBudWxsfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZVxcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZGF0YWxpc3QsXFxyXFxuICAgICAgdmFsLFxcclxcbiAgICAgIHZhbGlkOiBudWxsLFxcclxcbiAgICAgIHRpbWVvdXQ6IG51bGxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGNhblZhbGlkYXRlICgpIHsgcmV0dXJuICF0aGlzLmRpc2FibGVkICYmICF0aGlzLnJlYWRvbmx5ICYmICh0aGlzLnJlcXVpcmVkIHx8IHRoaXMucmVnZXggfHwgdGhpcy5uYXRpdmVWYWxpZGF0ZSB8fCB0aGlzLm1hdGNoICE9PSBudWxsKSB9LFxcclxcbiAgICBlcnJvclRleHQgKCkge1xcclxcbiAgICAgIGxldCB2YWx1ZSA9IHRoaXMudmFsdWVcXHJcXG4gICAgICBsZXQgZXJyb3IgPSBbdGhpcy5lcnJvcl1cXHJcXG4gICAgICBpZiAoIXZhbHVlICYmIHRoaXMucmVxdWlyZWQpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0LnJlcXVpcmVkLnRvTG93ZXJDYXNlKCkgKyAnKScpXFxyXFxuICAgICAgaWYgKHZhbHVlICYmICh2YWx1ZS5sZW5ndGggPCB0aGlzLm1pbmxlbmd0aCkpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0Lm1pbkxlbmd0aC50b0xvd2VyQ2FzZSgpICsgJzogJyArIHRoaXMubWlubGVuZ3RoICsgJyknKVxcclxcbiAgICAgIHJldHVybiBlcnJvci5qb2luKCcgJylcXHJcXG4gICAgfSxcXHJcXG4gICAgaWRfZGF0YWxpc3QgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLnR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdGhpcy5kYXRhbGlzdCBpbnN0YW5jZW9mIEFycmF5KSB7XFxyXFxuICAgICAgICBpZiAoIXRoaXMuX2lkX2RhdGFsaXN0KSB7XFxyXFxuICAgICAgICAgIGlmICghdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCkgeyB0aGlzLiRyb290LmlkX2RhdGFsaXN0ID0gMCB9XFxyXFxuICAgICAgICAgIHRoaXMuX2lkX2RhdGFsaXN0ID0gJ2lucHV0LWRhdGFsaXN0JyArIHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QrK1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkX2RhdGFsaXN0XFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiBudWxsXFxyXFxuICAgIH0sXFxyXFxuICAgIGlucHV0ICgpIHsgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXQgfSxcXHJcXG4gICAgbmF0aXZlVmFsaWRhdGUgKCkgeyByZXR1cm4gKHRoaXMuaW5wdXQgfHwge30pLmNoZWNrVmFsaWRpdHkgJiYgKH5bJ3VybCcsICdlbWFpbCddLmluZGV4T2YodGhpcy50eXBlLnRvTG93ZXJDYXNlKCkpIHx8IHRoaXMubWluIHx8IHRoaXMubWF4KSB9LFxcclxcbiAgICByZWdleCAoKSB7IHJldHVybiBjb2VyY2UucGF0dGVybih0aGlzLnBhdHRlcm4pIH0sXFxyXFxuICAgIHNob3dFcnJvciAoKSB7IHJldHVybiB0aGlzLmVycm9yICYmIHRoaXMudmFsaWQgPT09IGZhbHNlIH0sXFxyXFxuICAgIHNob3dIZWxwICgpIHsgcmV0dXJuIHRoaXMuaGVscCAmJiAoIXRoaXMuc2hvd0Vycm9yIHx8ICF0aGlzLmhpZGVIZWxwKSB9LFxcclxcbiAgICB0ZXh0ICgpIHsgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpIH0sXFxyXFxuICAgIHRpdGxlICgpIHsgcmV0dXJuIHRoaXMuZXJyb3JUZXh0IHx8IHRoaXMuaGVscCB8fCAnJyB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgZGF0YWxpc3QgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkICYmIHZhbCBpbnN0YW5jZW9mIEFycmF5KSB7IHRoaXMub3B0aW9ucyA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIG1hdGNoICh2YWwpIHsgdGhpcy5ldmFsKCkgfSxcXHJcXG4gICAgb3B0aW9ucyAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ29wdGlvbnMnLCB2YWwpXFxyXFxuICAgIH0sXFxyXFxuICAgIHVybCAodmFsKSB7XFxyXFxuICAgICAgdGhpcy5fdXJsKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkge1xcclxcbiAgICAgICAgaWYgKHRoaXMubWFzayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XFxyXFxuICAgICAgICAgIHZhbCA9IHRoaXMubWFzayh2YWwgfHwgJycpXFxyXFxuICAgICAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XFxyXFxuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzaylcXHJcXG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0Lm1hc2sgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgICAgIHRoaXMudmFsID0gdmFsXFxyXFxuICAgICAgICAgICAgfSwgaXNOYU4odGhpcy5tYXNrRGVsYXkpID8gMCA6IHRoaXMubWFza0RlbGF5KVxcclxcbiAgICAgICAgICB9XFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICB0aGlzLmV2YWwoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKVxcclxcbiAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIGF0dHIgKHZhbHVlKSB7XFxyXFxuICAgICAgcmV0dXJuIH5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IG51bGwgOiB2YWx1ZVxcclxcbiAgICB9LFxcclxcbiAgICBlbWl0IChlKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdChlLnR5cGUsIGUudHlwZSA9PSAnaW5wdXQnID8gZS50YXJnZXQudmFsdWUgOiBlKVxcclxcbiAgICAgIGlmIChlLnR5cGUgPT09ICdibHVyJyAmJiB0aGlzLmNhblZhbGlkYXRlKSB7IHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKCkgfVxcclxcbiAgICB9LFxcclxcbiAgICBldmFsICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5fdGltZW91dC5ldmFsKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5ldmFsKVxcclxcbiAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkge1xcclxcbiAgICAgICAgdGhpcy52YWxpZCA9IHRydWVcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5fdGltZW91dC5ldmFsID0gc2V0VGltZW91dCgoKSA9PiB7XFxyXFxuICAgICAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKClcXHJcXG4gICAgICAgICAgdGhpcy5fdGltZW91dC5ldmFsID0gbnVsbFxcclxcbiAgICAgICAgfSwgdGhpcy52YWxpZGF0aW9uRGVsYXkpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBmb2N1cyAoKSB7IHRoaXMuaW5wdXQuZm9jdXMoKSB9LFxcclxcbiAgICBzdWJtaXQgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLiRwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcXHJcXG4gICAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQudmFsaWRhdGUoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZiAodGhpcy5pbnB1dC5mb3JtKSB7XFxyXFxuICAgICAgICBjb25zdCBpbnZhbGlkcyA9ICQoJy5mb3JtLWdyb3VwLnZhbGlkYXRlOm5vdCguaGFzLXN1Y2Nlc3MpJywgdGhpcy5pbnB1dC5mb3JtKVxcclxcbiAgICAgICAgaWYgKGludmFsaWRzLmxlbmd0aCkge1xcclxcbiAgICAgICAgICBpbnZhbGlkcy5maW5kKCdpbnB1dCx0ZXh0YXJlYSxzZWxlY3QnKVswXS5mb2N1cygpXFxyXFxuICAgICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgICB0aGlzLmlucHV0LmZvcm0uc3VibWl0KClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbGlkYXRlICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuY2FuVmFsaWRhdGUpIHsgcmV0dXJuIHRydWUgfVxcclxcbiAgICAgIGxldCB2YWx1ZSA9ICh0aGlzLnZhbCB8fCAnJykudHJpbSgpXFxyXFxuICAgICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gIXRoaXMucmVxdWlyZWQgfVxcclxcbiAgICAgIGlmICh0aGlzLm1hdGNoICE9PSBudWxsKSB7IHJldHVybiB0aGlzLm1hdGNoID09PSB2YWx1ZSB9XFxyXFxuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgaWYgKHRoaXMubmF0aXZlVmFsaWRhdGUgJiYgIXRoaXMuaW5wdXQuY2hlY2tWYWxpZGl0eSgpKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgaWYgKHRoaXMucmVnZXgpIHtcXHJcXG4gICAgICAgIGlmICghKHRoaXMucmVnZXggaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHRoaXMucmVnZXgodGhpcy52YWx1ZSkgOiB0aGlzLnJlZ2V4LnRlc3QodGhpcy52YWx1ZSkpKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIHJlc2V0KCkge1xcclxcbiAgICAgIHRoaXMudmFsdWUgPSAnJ1xcclxcbiAgICAgIHRoaXMudmFsaWQgPSBudWxsXFxyXFxuICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzaylcXHJcXG4gICAgICBpZiAodGhpcy5fdGltZW91dC5ldmFsKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5ldmFsKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX2lucHV0ID0gdHJ1ZVxcclxcbiAgICB0aGlzLl90aW1lb3V0ID0ge31cXHJcXG4gICAgbGV0IHBhcmVudCA9IHRoaXMuJHBhcmVudFxcclxcbiAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHsgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQgfVxcclxcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xcclxcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50XFxyXFxuICAgIH1cXHJcXG4gICAgdGhpcy5fdXJsID0gZGVsYXllcihmdW5jdGlvbiAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCB8fCB0aGlzLl9sb2FkaW5nKSB7IHJldHVybiB9XFxyXFxuICAgICAgdGhpcy5fbG9hZGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihyZXNwb25zZSA9PiB7XFxyXFxuICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXVxcclxcbiAgICAgICAgdHJ5IHsgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSkgfSBjYXRjaCAoZSkge31cXHJcXG4gICAgICAgIGlmICh0aGlzLnVybE1hcCkgeyBkYXRhID0gZGF0YS5tYXAodGhpcy51cmxNYXApIH1cXHJcXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGRhdGFcXHJcXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSwgcmVzcG9uc2UgPT4ge1xcclxcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcXHJcXG4gICAgICB9KVxcclxcbiAgICB9LCBERUxBWSlcXHJcXG4gICAgaWYgKHRoaXMudXJsKSB0aGlzLl91cmwoKVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICAvLyAkKHRoaXMuaW5wdXQpLm9uKCdmb2N1cycsIGUgPT4geyB0aGlzLiRlbWl0KCdmb2N1cycsIGUpIH0pLm9uKCdibHVyJywgZSA9PiB7XFxyXFxuICAgIC8vICAgaWYgKHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XFxyXFxuICAgIC8vICAgdGhpcy4kZW1pdCgnYmx1cicsIGUpXFxyXFxuICAgIC8vIH0pXFxyXFxuICB9LFxcclxcbiAgYmVmb3JlRGVzdHJveSAoKSB7XFxyXFxuICAgIC8vICQodGhpcy5pbnB1dCkub2ZmKClcXHJcXG4gICAgaWYgKHRoaXMuX3BhcmVudCkge1xcclxcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSlcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbi5mb3JtLWdyb3VwIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG59XFxyXFxubGFiZWx+LmNsb3NlIHtcXHJcXG4gIHRvcDogMjVweDtcXHJcXG59XFxyXFxuLmlucHV0LWdyb3VwPi5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XFxyXFxuICB3aWR0aDowO1xcclxcbiAgei1pbmRleDogMztcXHJcXG59XFxyXFxuLmNsb3NlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmhhcy1mZWVkYmFjayAuY2xvc2Uge1xcclxcbiAgcmlnaHQ6IDIwcHg7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxMTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0dmFyIERFTEFZID0gMzAwO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBjbGVhckJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgY29sczogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGRhdGFsaXN0OiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZW50ZXJTdWJtaXQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGVycm9yOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgaGVscDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGhpZGVIZWxwOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGljb246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhYmVsOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgbWFzazogbnVsbCxcblx0ICAgIG1hc2tEZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDEwMCB9LFxuXHQgICAgbWF0Y2g6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtYXg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtYXhsZW5ndGg6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtaW46IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtaW5sZW5ndGg6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG5cdCAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgcGF0dGVybjogeyBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICByZXF1aXJlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgcm93czogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDMgfSxcblx0ICAgIHN0ZXA6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RleHQnIH0sXG5cdCAgICB1cmw6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB1cmxNYXA6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbGlkYXRpb25EZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDI1MCB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogbnVsbCB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBvcHRpb25zOiB0aGlzLmRhdGFsaXN0LFxuXHQgICAgICB2YWw6IHZhbCxcblx0ICAgICAgdmFsaWQ6IG51bGwsXG5cdCAgICAgIHRpbWVvdXQ6IG51bGxcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGNhblZhbGlkYXRlOiBmdW5jdGlvbiBjYW5WYWxpZGF0ZSgpIHtcblx0ICAgICAgcmV0dXJuICF0aGlzLmRpc2FibGVkICYmICF0aGlzLnJlYWRvbmx5ICYmICh0aGlzLnJlcXVpcmVkIHx8IHRoaXMucmVnZXggfHwgdGhpcy5uYXRpdmVWYWxpZGF0ZSB8fCB0aGlzLm1hdGNoICE9PSBudWxsKTtcblx0ICAgIH0sXG5cdCAgICBlcnJvclRleHQ6IGZ1bmN0aW9uIGVycm9yVGV4dCgpIHtcblx0ICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcblx0ICAgICAgdmFyIGVycm9yID0gW3RoaXMuZXJyb3JdO1xuXHQgICAgICBpZiAoIXZhbHVlICYmIHRoaXMucmVxdWlyZWQpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0LnJlcXVpcmVkLnRvTG93ZXJDYXNlKCkgKyAnKScpO1xuXHQgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoIDwgdGhpcy5taW5sZW5ndGgpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0Lm1pbkxlbmd0aC50b0xvd2VyQ2FzZSgpICsgJzogJyArIHRoaXMubWlubGVuZ3RoICsgJyknKTtcblx0ICAgICAgcmV0dXJuIGVycm9yLmpvaW4oJyAnKTtcblx0ICAgIH0sXG5cdCAgICBpZF9kYXRhbGlzdDogZnVuY3Rpb24gaWRfZGF0YWxpc3QoKSB7XG5cdCAgICAgIGlmICh0aGlzLnR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdGhpcy5kYXRhbGlzdCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLl9pZF9kYXRhbGlzdCkge1xuXHQgICAgICAgICAgaWYgKCF0aGlzLiRyb290LmlkX2RhdGFsaXN0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QgPSAwO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgdGhpcy5faWRfZGF0YWxpc3QgPSAnaW5wdXQtZGF0YWxpc3QnICsgdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCsrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5faWRfZGF0YWxpc3Q7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9LFxuXHQgICAgaW5wdXQ6IGZ1bmN0aW9uIGlucHV0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dDtcblx0ICAgIH0sXG5cdCAgICBuYXRpdmVWYWxpZGF0ZTogZnVuY3Rpb24gbmF0aXZlVmFsaWRhdGUoKSB7XG5cdCAgICAgIHJldHVybiAodGhpcy5pbnB1dCB8fCB7fSkuY2hlY2tWYWxpZGl0eSAmJiAoflsndXJsJywgJ2VtYWlsJ10uaW5kZXhPZih0aGlzLnR5cGUudG9Mb3dlckNhc2UoKSkgfHwgdGhpcy5taW4gfHwgdGhpcy5tYXgpO1xuXHQgICAgfSxcblx0ICAgIHJlZ2V4OiBmdW5jdGlvbiByZWdleCgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UucGF0dGVybih0aGlzLnBhdHRlcm4pO1xuXHQgICAgfSxcblx0ICAgIHNob3dFcnJvcjogZnVuY3Rpb24gc2hvd0Vycm9yKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5lcnJvciAmJiB0aGlzLnZhbGlkID09PSBmYWxzZTtcblx0ICAgIH0sXG5cdCAgICBzaG93SGVscDogZnVuY3Rpb24gc2hvd0hlbHAoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmhlbHAgJiYgKCF0aGlzLnNob3dFcnJvciB8fCAhdGhpcy5oaWRlSGVscCk7XG5cdCAgICB9LFxuXHQgICAgdGV4dDogZnVuY3Rpb24gdGV4dCgpIHtcblx0ICAgICAgcmV0dXJuICgwLCBfdXRpbHMudHJhbnNsYXRpb25zKSh0aGlzLmxhbmcpO1xuXHQgICAgfSxcblx0ICAgIHRpdGxlOiBmdW5jdGlvbiB0aXRsZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZXJyb3JUZXh0IHx8IHRoaXMuaGVscCB8fCAnJztcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBkYXRhbGlzdDogZnVuY3Rpb24gZGF0YWxpc3QodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkICYmIHZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgICAgdGhpcy5vcHRpb25zID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbWF0Y2g6IGZ1bmN0aW9uIG1hdGNoKHZhbCkge1xuXHQgICAgICB0aGlzLmV2YWwoKTtcblx0ICAgIH0sXG5cdCAgICBvcHRpb25zOiBmdW5jdGlvbiBvcHRpb25zKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkgdGhpcy4kZW1pdCgnb3B0aW9ucycsIHZhbCk7XG5cdCAgICB9LFxuXHQgICAgdXJsOiBmdW5jdGlvbiB1cmwodmFsKSB7XG5cdCAgICAgIHRoaXMuX3VybCgpO1xuXHQgICAgfSxcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwsIG9sZCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgaWYgKF92YWwgIT09IG9sZCkge1xuXHQgICAgICAgIGlmICh0aGlzLm1hc2sgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHQgICAgICAgICAgX3ZhbCA9IHRoaXMubWFzayhfdmFsIHx8ICcnKTtcblx0ICAgICAgICAgIGlmICh0aGlzLnZhbCAhPT0gX3ZhbCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fdGltZW91dC5tYXNrKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5tYXNrKTtcblx0ICAgICAgICAgICAgdGhpcy5fdGltZW91dC5tYXNrID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgX3RoaXMudmFsID0gX3ZhbDtcblx0ICAgICAgICAgICAgfSwgaXNOYU4odGhpcy5tYXNrRGVsYXkpID8gMCA6IHRoaXMubWFza0RlbGF5KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5ldmFsKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGF0dHI6IGZ1bmN0aW9uIGF0dHIodmFsdWUpIHtcblx0ICAgICAgcmV0dXJuIH5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IG51bGwgOiB2YWx1ZTtcblx0ICAgIH0sXG5cdCAgICBlbWl0OiBmdW5jdGlvbiBlbWl0KGUpIHtcblx0ICAgICAgdGhpcy4kZW1pdChlLnR5cGUsIGUudHlwZSA9PSAnaW5wdXQnID8gZS50YXJnZXQudmFsdWUgOiBlKTtcblx0ICAgICAgaWYgKGUudHlwZSA9PT0gJ2JsdXInICYmIHRoaXMuY2FuVmFsaWRhdGUpIHtcblx0ICAgICAgICB0aGlzLnZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZXZhbDogZnVuY3Rpb24gX2V2YWwoKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKHRoaXMuX3RpbWVvdXQuZXZhbCkgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQuZXZhbCk7XG5cdCAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkge1xuXHQgICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuX3RpbWVvdXQuZXZhbCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgX3RoaXMyLnZhbGlkID0gX3RoaXMyLnZhbGlkYXRlKCk7XG5cdCAgICAgICAgICBfdGhpczIuX3RpbWVvdXQuZXZhbCA9IG51bGw7XG5cdCAgICAgICAgfSwgdGhpcy52YWxpZGF0aW9uRGVsYXkpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHQgICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgc3VibWl0OiBmdW5jdGlvbiBzdWJtaXQoKSB7XG5cdCAgICAgIGlmICh0aGlzLiRwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LnZhbGlkYXRlKCk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMuaW5wdXQuZm9ybSkge1xuXHQgICAgICAgIHZhciBpbnZhbGlkcyA9ICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCcuZm9ybS1ncm91cC52YWxpZGF0ZTpub3QoLmhhcy1zdWNjZXNzKScsIHRoaXMuaW5wdXQuZm9ybSk7XG5cdCAgICAgICAgaWYgKGludmFsaWRzLmxlbmd0aCkge1xuXHQgICAgICAgICAgaW52YWxpZHMuZmluZCgnaW5wdXQsdGV4dGFyZWEsc2VsZWN0JylbMF0uZm9jdXMoKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5pbnB1dC5mb3JtLnN1Ym1pdCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgaWYgKCF0aGlzLmNhblZhbGlkYXRlKSB7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIHZhbHVlID0gKHRoaXMudmFsIHx8ICcnKS50cmltKCk7XG5cdCAgICAgIGlmICghdmFsdWUpIHtcblx0ICAgICAgICByZXR1cm4gIXRoaXMucmVxdWlyZWQ7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMubWF0Y2ggIT09IG51bGwpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5tYXRjaCA9PT0gdmFsdWU7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLm5hdGl2ZVZhbGlkYXRlICYmICF0aGlzLmlucHV0LmNoZWNrVmFsaWRpdHkoKSkge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5yZWdleCkge1xuXHQgICAgICAgIGlmICghKHRoaXMucmVnZXggaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHRoaXMucmVnZXgodGhpcy52YWx1ZSkgOiB0aGlzLnJlZ2V4LnRlc3QodGhpcy52YWx1ZSkpKSB7XG5cdCAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcblx0ICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuXHQgICAgICB0aGlzLnZhbGlkID0gbnVsbDtcblx0ICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzayk7XG5cdCAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lucHV0ID0gdHJ1ZTtcblx0ICAgIHRoaXMuX3RpbWVvdXQgPSB7fTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgICAgdGhpcy5fdXJsID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCB8fCB0aGlzLl9sb2FkaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0ICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdCAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICBpZiAoX3RoaXMzLnVybE1hcCkge1xuXHQgICAgICAgICAgZGF0YSA9IGRhdGEubWFwKF90aGlzMy51cmxNYXApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBfdGhpczMub3B0aW9ucyA9IGRhdGE7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSk7XG5cdCAgICB9LCBERUxBWSk7XG5cdCAgICBpZiAodGhpcy51cmwpIHRoaXMuX3VybCgpO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIC8vICQodGhpcy5pbnB1dCkub24oJ2ZvY3VzJywgZSA9PiB7IHRoaXMuJGVtaXQoJ2ZvY3VzJywgZSkgfSkub24oJ2JsdXInLCBlID0+IHtcblx0ICAgIC8vICAgaWYgKHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XG5cdCAgICAvLyAgIHRoaXMuJGVtaXQoJ2JsdXInLCBlKVxuXHQgICAgLy8gfSlcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICAvLyAkKHRoaXMuaW5wdXQpLm9mZigpXG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1ncm91cFwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgdmFsaWRhdGU6IF92bS5jYW5WYWxpZGF0ZSwgJ2hhcy1mZWVkYmFjayc6IF92bS5pY29uLCAnaGFzLWVycm9yJzogX3ZtLmNhblZhbGlkYXRlICYmIF92bS52YWxpZCA9PT0gZmFsc2UsICdoYXMtc3VjY2Vzcyc6IF92bS5jYW5WYWxpZGF0ZSAmJiBfdm0udmFsaWRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwibGFiZWxcIiwgWyhfdm0ubGFiZWwpID8gX3ZtLl9jKCdsYWJlbCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNvbnRyb2wtbGFiZWxcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxhYmVsKSldKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLmJlZm9yZSB8fCBfdm0uJHNsb3RzLmFmdGVyKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaW5wdXQtZ3JvdXBcIlxuXHQgIH0sIFtfdm0uX3QoXCJiZWZvcmVcIiksIF92bS5fdihcIiBcIiksIF92bS5fYyhfdm0udHlwZSA9PSAndGV4dGFyZWEnID8gX3ZtLnR5cGUgOiAnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJpbnB1dFwiLFxuXHQgICAgdGFnOiBcInRleHRhcmVhXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiY29sc1wiOiBfdm0uY29scyxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIFwibGlzdFwiOiBfdm0uaWRfZGF0YWxpc3QsXG5cdCAgICAgIFwibWF4XCI6IF92bS5hdHRyKF92bS5tYXgpLFxuXHQgICAgICBcIm1heGxlbmd0aFwiOiBfdm0ubWF4bGVuZ3RoLFxuXHQgICAgICBcIm1pblwiOiBfdm0uYXR0cihfdm0ubWluKSxcblx0ICAgICAgXCJuYW1lXCI6IF92bS5uYW1lLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlcixcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJvd3NcIjogX3ZtLnJvd3MsXG5cdCAgICAgIFwic3RlcFwiOiBfdm0uc3RlcCxcblx0ICAgICAgXCJ0aXRsZVwiOiBfdm0uYXR0cihfdm0udGl0bGUpLFxuXHQgICAgICBcInR5cGVcIjogX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IG51bGwgOiBfdm0udHlwZVxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImZvY3VzXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImlucHV0XCI6IFtmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnZhbCA9ICRldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgfSwgX3ZtLmVtaXRdLFxuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS50eXBlICE9ICd0ZXh0YXJlYScgJiYgX3ZtLmVudGVyU3VibWl0ICYmIF92bS5zdWJtaXQoKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0uY2xlYXJCdXR0b24gJiYgX3ZtLnZhbHVlKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgaWNvbjogX3ZtLmljb25cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbHVlID0gJydcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoXCLDl1wiKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKF92bS5pY29uKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvblwiXG5cdCAgfSwgWyhfdm0uaWNvbiAmJiBfdm0udmFsaWQgIT09IG51bGwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IFsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsaWQgPyAnb2snIDogJ3JlbW92ZScpXSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiYWZ0ZXJcIildLCAyKSA6IFtfdm0uX2MoX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IF92bS50eXBlIDogJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIHRhZzogXCJ0ZXh0YXJlYVwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImNvbHNcIjogX3ZtLmNvbHMsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkLFxuXHQgICAgICBcImxpc3RcIjogX3ZtLmlkX2RhdGFsaXN0LFxuXHQgICAgICBcIm1heFwiOiBfdm0uYXR0cihfdm0ubWF4KSxcblx0ICAgICAgXCJtYXhsZW5ndGhcIjogX3ZtLm1heGxlbmd0aCxcblx0ICAgICAgXCJtaW5cIjogX3ZtLmF0dHIoX3ZtLm1pbiksXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0ucGxhY2Vob2xkZXIsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5LFxuXHQgICAgICBcInJlcXVpcmVkXCI6IF92bS5yZXF1aXJlZCxcblx0ICAgICAgXCJyb3dzXCI6IF92bS5yb3dzLFxuXHQgICAgICBcInN0ZXBcIjogX3ZtLnN0ZXAsXG5cdCAgICAgIFwidGl0bGVcIjogX3ZtLmF0dHIoX3ZtLnRpdGxlKSxcblx0ICAgICAgXCJ0eXBlXCI6IF92bS50eXBlID09ICd0ZXh0YXJlYScgPyBudWxsIDogX3ZtLnR5cGVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0udmFsKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiYmx1clwiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJmb2N1c1wiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJpbnB1dFwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKCRldmVudC50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS52YWwgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgIH0sIF92bS5lbWl0XSxcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzKSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0udHlwZSAhPSAndGV4dGFyZWEnICYmIF92bS5lbnRlclN1Ym1pdCAmJiBfdm0uc3VibWl0KClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbCA9ICcnXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmljb24gJiYgX3ZtLnZhbGlkICE9PSBudWxsKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCAnZ2x5cGhpY29uLScgKyAoX3ZtLnZhbGlkID8gJ29rJyA6ICdyZW1vdmUnKV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9XG5cdCAgfSkgOiBfdm0uX2UoKV0sIF92bS5fdihcIiBcIiksIChfdm0uaWRfZGF0YWxpc3QpID8gX3ZtLl9jKCdkYXRhbGlzdCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiaWRcIjogX3ZtLmlkX2RhdGFsaXN0XG5cdCAgICB9XG5cdCAgfSwgX3ZtLl9sKChfdm0ub3B0aW9ucyksIGZ1bmN0aW9uKG9wYykge1xuXHQgICAgcmV0dXJuIF92bS5fYygnb3B0aW9uJywge1xuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwidmFsdWVcIjogb3BjXG5cdCAgICAgIH1cblx0ICAgIH0pXG5cdCAgfSkpIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0uc2hvd0hlbHApID8gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJoZWxwLWJsb2NrXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5mb2N1c1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5oZWxwKSldKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLnNob3dFcnJvcikgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImhlbHAtYmxvY2sgd2l0aC1lcnJvcnNcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmVycm9yVGV4dCkpXSkgOiBfdm0uX2UoKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTY1MmFkN2I5XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTE5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMClcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcTW9kYWwudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWZlN2Q1ZGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1mZTdkNWRjOFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE1vZGFsLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEyMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIxKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5tb2RhbCB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcbn1cXG4ubW9kYWwuaW4ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjUpO1xcbn1cXG4ubW9kYWwuem9vbSAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdG9wOiAzMDBweDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4zcztcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzO1xcbn1cXG4ubW9kYWwuem9vbS5pbiAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgb3BhY2l0eTogMTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9Nb2RhbC52dWU/NDU4ZmI2OWFcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQThGQTtFQUNBLDBCQUFBO0NBQ0E7QUFDQTtFQUNBLGtDQUFBO0NBQ0E7QUFDQTtFQUNBLDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSwwQkFBQTtFQUNBLHNCQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSw2QkFBQTtFQUNBLDBCQUFBO0VBQ0EscUJBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7RUFDQSx5QkFBQTtFQUNBLHdCQUFBO0VBQ0Esb0JBQUE7RUFDQSw2Q0FBQTtFQUNBLHFDQUFBO0VBQ0EsV0FBQTtDQUNBXCIsXCJmaWxlXCI6XCJNb2RhbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiByb2xlPVxcXCJkaWFsb2dcXFwiIDpjbGFzcz1cXFwiWydtb2RhbCcsZWZmZWN0XVxcXCIgQGNsaWNrPVxcXCJiYWNrQ2xvc2VcXFwiIEB0cmFuc2l0aW9uZW5kPVxcXCJ0cmFuc2l0aW9uZW5kXFxcIj5cXHJcXG4gICAgPGRpdiA6Y2xhc3M9XFxcInsnbW9kYWwtZGlhbG9nJzp0cnVlLCdtb2RhbC1sZyc6bGFyZ2UsJ21vZGFsLXNtJzpzbWFsbH1cXFwiIHJvbGU9XFxcImRvY3VtZW50XFxcIiA6c3R5bGU9XFxcInt3aWR0aDogb3B0aW9uYWxXaWR0aH1cXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcImNsb3NlXFxcIj48c3Bhbj4mdGltZXM7PC9zcGFuPjwvYnV0dG9uPlxcclxcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPjxzbG90IG5hbWU9XFxcInRpdGxlXFxcIj57e3RpdGxlfX08L3Nsb3Q+PC9oND5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICA8L3Nsb3Q+XFxyXFxuICAgICAgICA8c2xvdCBuYW1lPVxcXCJtb2RhbC1ib2R5XFxcIj48ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj48c2xvdD48L3Nsb3Q+PC9kaXY+PC9zbG90PlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdFxcXCIgQGNsaWNrPVxcXCJjbG9zZVxcXCI+e3sgY2FuY2VsVGV4dCB9fTwvYnV0dG9uPlxcclxcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcIm9rXFxcIj57eyBva1RleHQgfX08L2J1dHRvbj5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICA8L3Nsb3Q+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Z2V0U2Nyb2xsQmFyV2lkdGh9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgYmFja2Ryb3A6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlfSxcXHJcXG4gICAgY2FsbGJhY2s6IHt0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGNhbmNlbFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdDbG9zZSd9LFxcclxcbiAgICBlZmZlY3Q6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBsYXJnZToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgb2tUZXh0OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnU2F2ZSBjaGFuZ2VzJ30sXFxyXFxuICAgIHNtYWxsOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICB0aXRsZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9LFxcclxcbiAgICB2YWx1ZToge3R5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlfSxcXHJcXG4gICAgd2lkdGg6IHtkZWZhdWx0OiBudWxsfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIG9wdGlvbmFsV2lkdGggKCkge1xcclxcbiAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsKSB7XFxyXFxuICAgICAgICByZXR1cm4gbnVsbFxcclxcbiAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzSW50ZWdlcih0aGlzLndpZHRoKSkge1xcclxcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKyAncHgnXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiB0aGlzLndpZHRoXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICB2YWx1ZSAodmFsKSB7XFxyXFxuICAgICAgdGhpcy50cmFuc2l0aW9uc3RhcnQoKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBiYWNrQ2xvc2UgKGUpIHtcXHJcXG4gICAgICBpZiAodGhpcy5iYWNrZHJvcCAmJiBlLnRhcmdldCA9PT0gdGhpcy4kZWwpIHsgdGhpcy5jbG9zZSgpIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgY2xvc2UgKCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2NhbmNlbCcpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBmYWxzZSlcXHJcXG4gICAgfSxcXHJcXG4gICAgb2sgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHRoaXMuY2FsbGJhY2soKVxcclxcbiAgICAgIHRoaXMuJGVtaXQoJ29rJylcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHRydWUpXFxyXFxuICAgIH0sXFxyXFxuICAgIHRyYW5zaXRpb25zdGFydCAoKSB7XFxyXFxuICAgICAgY29uc3QgZWwgPSB0aGlzLiRlbFxcclxcbiAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5XFxyXFxuICAgICAgY29uc3Qgc2Nyb2xsQmFyV2lkdGggPSBnZXRTY3JvbGxCYXJXaWR0aCgpXFxyXFxuICAgICAgaWYgKHRoaXMudmFsdWUpIHtcXHJcXG4gICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1jb250ZW50JykuZm9jdXMoKVxcclxcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcXHJcXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZWwuY2xhc3NMaXN0LmFkZCgnaW4nKSwgMClcXHJcXG4gICAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICBpZiAoc2Nyb2xsQmFyV2lkdGggIT09IDApIHtcXHJcXG4gICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBzY3JvbGxCYXJXaWR0aCArICdweCdcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnaW4nKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdHJhbnNpdGlvbmVuZCAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XFxyXFxuICAgICAgICB0aGlzLiRlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXFxyXFxuICAgICAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuYm9keVxcclxcbiAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBudWxsXFxyXFxuICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG48c3R5bGU+XFxyXFxuLm1vZGFsIHtcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XFxyXFxufVxcclxcbi5tb2RhbC5pbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7XFxyXFxufVxcclxcbi5tb2RhbC56b29tIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0b3A6IDMwMHB4O1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxuICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxufVxcclxcbi5tb2RhbC56b29tLmluIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICBvcGFjaXR5OiAxO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfaXNJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjMpO1xuXHRcblx0dmFyIF9pc0ludGVnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNJbnRlZ2VyKTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJhY2tkcm9wOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGNhbGxiYWNrOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBjYW5jZWxUZXh0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ0Nsb3NlJyB9LFxuXHQgICAgZWZmZWN0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbGFyZ2U6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG9rVGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdTYXZlIGNoYW5nZXMnIH0sXG5cdCAgICBzbWFsbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHdpZHRoOiB7IGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIG9wdGlvbmFsV2lkdGg6IGZ1bmN0aW9uIG9wdGlvbmFsV2lkdGgoKSB7XG5cdCAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgIH0gZWxzZSBpZiAoKDAsIF9pc0ludGVnZXIyLmRlZmF1bHQpKHRoaXMud2lkdGgpKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKyAncHgnO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLndpZHRoO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy50cmFuc2l0aW9uc3RhcnQoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJhY2tDbG9zZTogZnVuY3Rpb24gYmFja0Nsb3NlKGUpIHtcblx0ICAgICAgaWYgKHRoaXMuYmFja2Ryb3AgJiYgZS50YXJnZXQgPT09IHRoaXMuJGVsKSB7XG5cdCAgICAgICAgdGhpcy5jbG9zZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdjYW5jZWwnKTtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBmYWxzZSk7XG5cdCAgICB9LFxuXHQgICAgb2s6IGZ1bmN0aW9uIG9rKCkge1xuXHQgICAgICBpZiAodGhpcy5jYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB0aGlzLmNhbGxiYWNrKCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ29rJyk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdHJ1ZSk7XG5cdCAgICB9LFxuXHQgICAgdHJhbnNpdGlvbnN0YXJ0OiBmdW5jdGlvbiB0cmFuc2l0aW9uc3RhcnQoKSB7XG5cdCAgICAgIHZhciBlbCA9IHRoaXMuJGVsO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIHZhciBzY3JvbGxCYXJXaWR0aCA9ICgwLCBfdXRpbHMuZ2V0U2Nyb2xsQmFyV2lkdGgpKCk7XG5cdCAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG5cdCAgICAgICAgZWwucXVlcnlTZWxlY3RvcignLm1vZGFsLWNvbnRlbnQnKS5mb2N1cygpO1xuXHQgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoJ2luJyk7XG5cdCAgICAgICAgfSwgMCk7XG5cdCAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgaWYgKHNjcm9sbEJhcldpZHRoICE9PSAwKSB7XG5cdCAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoICsgJ3B4Jztcblx0ICAgICAgICB9XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnaW4nKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHRyYW5zaXRpb25lbmQ6IGZ1bmN0aW9uIHRyYW5zaXRpb25lbmQoKSB7XG5cdCAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuXHQgICAgICAgIHRoaXMuJGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdCAgICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXHQgICAgICAgIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gbnVsbDtcblx0ICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDEyMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNCksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuLyoqKi8gfSxcbi8qIDEyNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMjUpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNykuTnVtYmVyLmlzSW50ZWdlcjtcblxuLyoqKi8gfSxcbi8qIDEyNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG5cdHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0XG5cdCRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge2lzSW50ZWdlcjogX193ZWJwYWNrX3JlcXVpcmVfXygxMjYpfSk7XG5cbi8qKiovIH0sXG4vKiAxMjYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDIwLjEuMi4zIE51bWJlci5pc0ludGVnZXIobnVtYmVyKVxuXHR2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKVxuXHQgICwgZmxvb3IgICAgPSBNYXRoLmZsb29yO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCl7XG5cdCAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMjcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsnbW9kYWwnLCBfdm0uZWZmZWN0XSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImRpYWxvZ1wiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uYmFja0Nsb3NlLFxuXHQgICAgICBcInRyYW5zaXRpb25lbmRcIjogX3ZtLnRyYW5zaXRpb25lbmRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczoge1xuXHQgICAgICAnbW9kYWwtZGlhbG9nJzogdHJ1ZSwgJ21vZGFsLWxnJzogX3ZtLmxhcmdlLCAnbW9kYWwtc20nOiBfdm0uc21hbGxcblx0ICAgIH0sXG5cdCAgICBzdHlsZTogKHtcblx0ICAgICAgd2lkdGg6IF92bS5vcHRpb25hbFdpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImRvY3VtZW50XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1jb250ZW50XCJcblx0ICB9LCBbX3ZtLl90KFwibW9kYWwtaGVhZGVyXCIsIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm1vZGFsLWhlYWRlclwiXG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uY2xvc2Vcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywgW192bS5fdihcIsOXXCIpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdoNCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm1vZGFsLXRpdGxlXCJcblx0ICB9LCBbX3ZtLl90KFwidGl0bGVcIiwgW192bS5fdihfdm0uX3MoX3ZtLnRpdGxlKSldKV0sIDIpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwibW9kYWwtYm9keVwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1ib2R5XCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSksIF92bS5fdihcIiBcIiksIF92bS5fdChcIm1vZGFsLWZvb3RlclwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1mb290ZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2J1dHRvbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJ0biBidG4tZGVmYXVsdFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5jbG9zZVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5jYW5jZWxUZXh0KSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJidG4gYnRuLXByaW1hcnlcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0ub2tcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0ub2tUZXh0KSldKV0pXSldLCAyKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtZmU3ZDVkYzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMjggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTI5KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxOYXZiYXIudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTM4ZjA2MTllXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zOGYwNjE5ZVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE5hdmJhci52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBpZDogJ2JzLWV4YW1wbGUtbmF2YmFyLWNvbGxhcHNlLTEnLFxuXHQgICAgICBjb2xsYXBzZWQ6IHRydWUsXG5cdCAgICAgIHN0eWxlczoge31cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHNsb3RzOiBmdW5jdGlvbiBzbG90cygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3Nsb3RDb250ZW50cztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZUNvbGxhcHNlOiBmdW5jdGlvbiB0b2dnbGVDb2xsYXBzZShlKSB7XG5cdCAgICAgIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9uYXZiYXIgPSB0cnVlO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgdHJ5IHtcblx0ICAgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgJGRyb3Bkb3duID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bj5bZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScsIF90aGlzLiRlbCkucGFyZW50KCk7XG5cdCAgICAgICAgaWYgKCRkcm9wZG93bikge1xuXHQgICAgICAgICAgJGRyb3Bkb3duLm9uKCdjbGljaycsICcuZHJvcGRvd24tdG9nZ2xlJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub24oJ2NsaWNrJywgJy5kcm9wZG93bi1tZW51PmxpPmEnLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub25CbHVyKGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICAgICRkcm9wZG93bi5lYWNoKGZ1bmN0aW9uIChjb250ZW50KSB7XG5cdCAgICAgICAgICAgICAgaWYgKCFjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KSgpO1xuXHQgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGZpbmRpbmcgZHJvcGRvd24nKTtcblx0ICAgIH1cblx0XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLiRlbCkub24oJ2NsaWNrIHRvdWNoc3RhcnQnLCAnbGk6bm90KC5kcm9wZG93bik+YScsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIF90aGlzLmNvbGxhcHNlZCA9IHRydWU7XG5cdCAgICAgIH0sIDIwMCk7XG5cdCAgICB9KS5vbkJsdXIoZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgaWYgKCFfdGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpKSB7XG5cdCAgICAgICAgX3RoaXMuY29sbGFwc2VkID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICB2YXIgaGVpZ2h0ID0gdGhpcy4kZWwub2Zmc2V0SGVpZ2h0O1xuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAndG9wJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdUb3AgPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAnYm90dG9tJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdCb3R0b20gPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZUNvbGxhcHNlKGUpO1xuXHQgICAgfSk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bicsIHRoaXMuJGVsKS5vZmYoJ2NsaWNrJykub2ZmQmx1cigpO1xuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub2ZmKCdjbGljaycpO1xuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDEzMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCduYXYnLCB7XG5cdCAgICBjbGFzczogWyduYXZiYXInLCAnbmF2YmFyLScgKyBfdm0udHlwZSwgX3ZtLnBsYWNlbWVudCA9PT0gJ3N0YXRpYycgPyAnbmF2YmFyLXN0YXRpYy10b3AnIDogJ25hdmJhci1maXhlZC0nICsgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjb250YWluZXItZmx1aWRcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5hdmJhci1oZWFkZXJcIlxuXHQgIH0sIFsoIV92bS4kc2xvdHMuY29sbGFwc2UpID8gX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXZiYXItdG9nZ2xlIGNvbGxhcHNlZFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCIsXG5cdCAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBcImZhbHNlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS50b2dnbGVDb2xsYXBzZVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJzci1vbmx5XCJcblx0ICB9LCBbX3ZtLl92KFwiVG9nZ2xlIG5hdmlnYXRpb25cIildKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvbi1iYXJcIlxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uLWJhclwiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb24tYmFyXCJcblx0ICB9KV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImNvbGxhcHNlXCIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJicmFuZFwiKV0sIDIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGNsYXNzOiBbJ25hdmJhci1jb2xsYXBzZScsIHtcblx0ICAgICAgY29sbGFwc2U6IF92bS5jb2xsYXBzZWRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXYgbmF2YmFyLW5hdlwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKSwgX3ZtLl92KFwiIFwiKSwgKF92bS4kc2xvdHMubGVmdCkgPyBfdm0uX2MoJ3VsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibmF2IG5hdmJhci1uYXYgbmF2YmFyLWxlZnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJsZWZ0XCIpXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKF92bS4kc2xvdHMucmlnaHQpID8gX3ZtLl9jKCd1bCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5hdiBuYXZiYXItbmF2IG5hdmJhci1yaWdodFwiXG5cdCAgfSwgW192bS5fdChcInJpZ2h0XCIpXSwgMikgOiBfdm0uX2UoKV0pXSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0zOGYwNjE5ZVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzIpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTMzKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXE9wdGlvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNDIwODgxMTZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTQyMDg4MTE2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gT3B0aW9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEzMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHsgdmFsdWU6IG51bGwgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHsgbG9hZGluZzogdHJ1ZSB9O1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLiRwYXJlbnQuX3NlbGVjdCkge1xuXHQgICAgICBpZiAoIXRoaXMuJHBhcmVudC5vcHRpb25zKSB7XG5cdCAgICAgICAgdGhpcy4kcGFyZW50Lm9wdGlvbnMgPSBbXTtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZWwgPSB7fTtcblx0ICAgICAgZWxbdGhpcy4kcGFyZW50Lm9wdGlvbnNMYWJlbF0gPSB0aGlzLiRlbC5pbm5lckhUTUw7XG5cdCAgICAgIGVsW3RoaXMuJHBhcmVudC5vcHRpb25zVmFsdWVdID0gdGhpcy52YWx1ZTtcblx0ICAgICAgdGhpcy4kcGFyZW50Lm9wdGlvbnMucHVzaChlbCk7XG5cdCAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29uc29sZS53YXJuKCdvcHRpb25zIG9ubHkgd29yayBpbnNpZGUgYSBzZWxlY3QgY29tcG9uZW50Jyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTMzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiAoX3ZtLmxvYWRpbmcpID8gX3ZtLl9jKCdsaScsIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMikgOiBfdm0uX2UoKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi00MjA4ODExNlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMzUpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzcpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTM4KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFBhbmVsLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1iMWUwNDYxYVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtYjFlMDQ2MWFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBQYW5lbC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzNik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtYjFlMDQ2MWEhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1BhbmVsLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtYjFlMDQ2MWEhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1BhbmVsLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWNjb3JkaW9uLXRvZ2dsZSB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5jb2xsYXBzZS1lbnRlci1hY3RpdmUsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgLjVzIGVhc2U7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG4uY29sbGFwc2UtZW50ZXIsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxufVxcclxcblxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvUGFuZWwudnVlPzYwZTc5OGUyXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF5RUE7RUFDQSxnQkFBQTtDQUNBO0FBQ0E7O0VBRUEseUJBQUE7RUFDQSxpQkFBQTtDQUNBO0FBQ0E7O0NBR0FcIixcImZpbGVcIjpcIlBhbmVsLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IDpjbGFzcz1cXFwiWydwYW5lbCcscGFuZWxUeXBlXVxcXCI+XFxyXFxuICAgIDxkaXYgOmNsYXNzPVxcXCJbJ3BhbmVsLWhlYWRpbmcnLHsnYWNjb3JkaW9uLXRvZ2dsZSc6aW5BY2NvcmRpb259XVxcXCIgQGNsaWNrLnByZXZlbnQ9XFxcImluQWNjb3JkaW9uJiZ0b2dnbGUoKVxcXCI+XFxyXFxuICAgICAgPHNsb3QgbmFtZT1cXFwiaGVhZGVyXFxcIj48aDQgY2xhc3M9XFxcInBhbmVsLXRpdGxlXFxcIj57eyBoZWFkZXIgfX08L2g0Pjwvc2xvdD5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDx0cmFuc2l0aW9uXFxyXFxuICAgICAgbmFtZT1cXFwiY29sbGFwc2VcXFwiXFxyXFxuICAgICAgQGVudGVyPVxcXCJlbnRlclxcXCJcXHJcXG4gICAgICBAYWZ0ZXItZW50ZXI9XFxcImFmdGVyRW50ZXJcXFwiXFxyXFxuICAgICAgQGJlZm9yZS1sZWF2ZT1cXFwiYmVmb3JlTGVhdmVcXFwiXFxyXFxuICAgID5cXHJcXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1jb2xsYXBzZVxcXCIgdi1pZj1cXFwib3BlblxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIj5cXHJcXG4gICAgICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvdHJhbnNpdGlvbj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBpc09wZW46IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdHlwZToge3R5cGU6IFN0cmluZywgZGVmYXVsdCA6IG51bGx9XFxyXFxuICB9LFxcclxcbiAgZGF0YSgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBvcGVuOiB0aGlzLmlzT3BlblxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaXNPcGVuKCB2YWwgKSB7XFxyXFxuICAgICAgdGhpcy5vcGVuID0gdmFsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBpbkFjY29yZGlvbiAoKSB7IHJldHVybiB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50Ll9pc0FjY29yZGlvbiB9LFxcclxcbiAgICBwYW5lbFR5cGUgKCkgeyByZXR1cm4gJ3BhbmVsLScgKyAodGhpcy50eXBlIHx8ICh0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUpIHx8ICdkZWZhdWx0JykgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgdG9nZ2xlICgpIHtcXHJcXG4gICAgICB0aGlzLm9wZW4gPSAhdGhpcy5vcGVuXFxyXFxuICAgICAgaWYgKHRoaXMuaW5BY2NvcmRpb24pIHtcXHJcXG4gICAgICAgIHRoaXMuJHBhcmVudC5vcGVuQ2hpbGQodGhpcylcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGVudGVyIChlbCkge1xcclxcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJ1xcclxcbiAgICAgIHZhciBlbmRXaWR0aCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodFxcclxcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcwcHgnXFxyXFxuICAgICAgZWwub2Zmc2V0SGVpZ2h0IC8vIGZvcmNlIHJlcGFpbnRcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSBlbmRXaWR0aDtcXHJcXG4gICAgfSxcXHJcXG4gICAgYWZ0ZXJFbnRlciAoZWwpIHtcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0bydcXHJcXG4gICAgfSxcXHJcXG4gICAgYmVmb3JlTGVhdmUgKGVsKSB7XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCkuaGVpZ2h0XFxyXFxuICAgICAgZWwub2Zmc2V0SGVpZ2h0IC8vIGZvcmNlIHJlcGFpbnRcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnMHB4J1xcclxcbiAgICB9LFxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICBpZiAodGhpcy5pc09wZW4gPT09IG51bGwpIHtcXHJcXG4gICAgICB0aGlzLm9wZW4gPSAhdGhpcy5pbkFjY29yZGlvblxcclxcbiAgICB9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uYWNjb3JkaW9uLXRvZ2dsZSB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcbi5jb2xsYXBzZS1lbnRlci1hY3RpdmUsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgLjVzIGVhc2U7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbn1cXHJcXG4uY29sbGFwc2UtZW50ZXIsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxMzcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBoZWFkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBpc09wZW46IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIG9wZW46IHRoaXMuaXNPcGVuXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBpc09wZW46IGZ1bmN0aW9uIGlzT3Blbih2YWwpIHtcblx0ICAgICAgdGhpcy5vcGVuID0gdmFsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluQWNjb3JkaW9uOiBmdW5jdGlvbiBpbkFjY29yZGlvbigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuX2lzQWNjb3JkaW9uO1xuXHQgICAgfSxcblx0ICAgIHBhbmVsVHlwZTogZnVuY3Rpb24gcGFuZWxUeXBlKCkge1xuXHQgICAgICByZXR1cm4gJ3BhbmVsLScgKyAodGhpcy50eXBlIHx8IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSB8fCAnZGVmYXVsdCcpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XG5cdCAgICAgIGlmICh0aGlzLmluQWNjb3JkaW9uKSB7XG5cdCAgICAgICAgdGhpcy4kcGFyZW50Lm9wZW5DaGlsZCh0aGlzKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGVudGVyOiBmdW5jdGlvbiBlbnRlcihlbCkge1xuXHQgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG5cdCAgICAgIHZhciBlbmRXaWR0aCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodDtcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG5cdCAgICAgIGVsLm9mZnNldEhlaWdodDsgLy8gZm9yY2UgcmVwYWludFxuXHQgICAgICBlbC5zdHlsZS5oZWlnaHQgPSBlbmRXaWR0aDtcblx0ICAgIH0sXG5cdCAgICBhZnRlckVudGVyOiBmdW5jdGlvbiBhZnRlckVudGVyKGVsKSB7XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcblx0ICAgIH0sXG5cdCAgICBiZWZvcmVMZWF2ZTogZnVuY3Rpb24gYmVmb3JlTGVhdmUoZWwpIHtcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCkuaGVpZ2h0O1xuXHQgICAgICBlbC5vZmZzZXRIZWlnaHQ7IC8vIGZvcmNlIHJlcGFpbnRcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgaWYgKHRoaXMuaXNPcGVuID09PSBudWxsKSB7XG5cdCAgICAgIHRoaXMub3BlbiA9ICF0aGlzLmluQWNjb3JkaW9uO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDEzOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWydwYW5lbCcsIF92bS5wYW5lbFR5cGVdXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsncGFuZWwtaGVhZGluZycsIHtcblx0ICAgICAgJ2FjY29yZGlvbi10b2dnbGUnOiBfdm0uaW5BY2NvcmRpb25cblx0ICAgIH1dLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0uaW5BY2NvcmRpb24gJiYgX3ZtLnRvZ2dsZSgpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiaGVhZGVyXCIsIFtfdm0uX2MoJ2g0Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicGFuZWwtdGl0bGVcIlxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5oZWFkZXIpKV0pXSldLCAyKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6IFwiY29sbGFwc2VcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiZW50ZXJcIjogX3ZtLmVudGVyLFxuXHQgICAgICBcImFmdGVyLWVudGVyXCI6IF92bS5hZnRlckVudGVyLFxuXHQgICAgICBcImJlZm9yZS1sZWF2ZVwiOiBfdm0uYmVmb3JlTGVhdmVcblx0ICAgIH1cblx0ICB9LCBbKF92bS5vcGVuKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicGFuZWwtY29sbGFwc2VcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLWJvZHlcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKSA6IF92bS5fZSgpXSldLCAxKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1iMWUwNDYxYVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxNDApXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDIpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ0KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFBvcG92ZXIudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTI0NjViZjU0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0yNDY1YmY1NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFBvcG92ZXIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTQwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDEpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTI0NjViZjU0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Qb3BvdmVyLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtMjQ2NWJmNTQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1BvcG92ZXIudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTQxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5wb3BvdmVyLnRvcCxcXHJcXG4ucG9wb3Zlci5sZWZ0LFxcclxcbi5wb3BvdmVyLnJpZ2h0LFxcclxcbi5wb3BvdmVyLmJvdHRvbSB7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuLnNjYWxlLWVudGVyIHtcXHJcXG4gIGFuaW1hdGlvbjpzY2FsZS1pbiAwLjE1cyBlYXNlLWluO1xcbn1cXG4uc2NhbGUtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzY2FsZS1vdXQgMC4xNXMgZWFzZS1vdXQ7XFxufVxcbkBrZXlmcmFtZXMgc2NhbGUtaW4ge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbn1cXG5Aa2V5ZnJhbWVzIHNjYWxlLW91dCB7XFxuMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvUG9wb3Zlci52dWU/ZTYxNjk2M2FcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQXlCQTs7OztFQUlBLGVBQUE7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxvQkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxvQkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQVwiLFwiZmlsZVwiOlwiUG9wb3Zlci52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPHNwYW4gcmVmPVxcXCJ0cmlnZ2VyXFxcIj5cXHJcXG4gICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8dHJhbnNpdGlvbiA6bmFtZT1cXFwiZWZmZWN0XFxcIj5cXHJcXG4gICAgICA8ZGl2IHJlZj1cXFwicG9wb3ZlclxcXCIgdi1pZj1cXFwic2hvd1xcXCIgOmNsYXNzPVxcXCJbJ3BvcG92ZXInLHBsYWNlbWVudF1cXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXJyb3dcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGgzIGNsYXNzPVxcXCJwb3BvdmVyLXRpdGxlXFxcIiB2LWlmPVxcXCJ0aXRsZVxcXCI+PHNsb3QgbmFtZT1cXFwidGl0bGVcXFwiPnt7dGl0bGV9fTwvc2xvdD48L2gzPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicG9wb3Zlci1jb250ZW50XFxcIj48c2xvdCBuYW1lPVxcXCJjb250ZW50XFxcIj48c3BhbiB2LWh0bWw9XFxcImNvbnRlbnRcXFwiPjwvc3Bhbj48L3Nsb3Q+PC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvdHJhbnNpdGlvbj5cXHJcXG4gIDwvc3Bhbj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IFBvcG92ZXJNaXhpbiBmcm9tICcuL3V0aWxzL3BvcG92ZXJNaXhpbnMuanMnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgbWl4aW5zOiBbUG9wb3Zlck1peGluXSxcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIHRyaWdnZXI6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljayd9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4ucG9wb3Zlci50b3AsXFxyXFxuLnBvcG92ZXIubGVmdCxcXHJcXG4ucG9wb3Zlci5yaWdodCxcXHJcXG4ucG9wb3Zlci5ib3R0b20ge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcbi5zY2FsZS1lbnRlciB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtaW4gMC4xNXMgZWFzZS1pbjtcXHJcXG59XFxyXFxuLnNjYWxlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtb3V0IDAuMTVzIGVhc2Utb3V0O1xcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNjYWxlLWluIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNjYWxlLW91dCB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE0MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3BvcG92ZXJNaXhpbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0Myk7XG5cdFxuXHR2YXIgX3BvcG92ZXJNaXhpbnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9wb3Zlck1peGlucyk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIG1peGluczogW19wb3BvdmVyTWl4aW5zMi5kZWZhdWx0XSxcblx0ICBwcm9wczoge1xuXHQgICAgdHJpZ2dlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljaycgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDE0MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgY29udGVudDogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGVmZmVjdDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdmYWRlJyB9LFxuXHQgICAgaGVhZGVyOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0b3AnIH0sXG5cdCAgICB0aXRsZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHRyaWdnZXI6IHsgdHlwZTogU3RyaW5nIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB0b3A6IDAsXG5cdCAgICAgIGxlZnQ6IDAsXG5cdCAgICAgIHNob3c6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBldmVudHM6IGZ1bmN0aW9uIGV2ZW50cygpIHtcblx0ICAgICAgcmV0dXJuIHsgY29udGV4dG1lbnU6IFsnY29udGV4dG1lbnUnXSwgaG92ZXI6IFsnbW91c2VsZWF2ZScsICdtb3VzZWVudGVyJ10sIGZvY3VzOiBbJ2JsdXInLCAnZm9jdXMnXSB9W3RoaXMudHJpZ2dlcl0gfHwgWydjbGljayddO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgYmVmb3JlRW50ZXI6IGZ1bmN0aW9uIGJlZm9yZUVudGVyKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy5wb3NpdGlvbigpO1xuXHQgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gX3RoaXMucG9zaXRpb24oKTtcblx0ICAgICAgfSwgMzApO1xuXHQgICAgfSxcblx0ICAgIHBvc2l0aW9uOiBmdW5jdGlvbiBwb3NpdGlvbigpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHBvcG92ZXIgPSBfdGhpczIuJHJlZnMucG9wb3Zlcjtcblx0ICAgICAgICB2YXIgdHJpZ2dlciA9IF90aGlzMi4kcmVmcy50cmlnZ2VyLmNoaWxkcmVuWzBdO1xuXHQgICAgICAgIHN3aXRjaCAoX3RoaXMyLnBsYWNlbWVudCkge1xuXHQgICAgICAgICAgY2FzZSAndG9wJzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgLSBwb3BvdmVyLm9mZnNldFdpZHRoIC8gMiArIHRyaWdnZXIub2Zmc2V0V2lkdGggLyAyO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgLSBwb3BvdmVyLm9mZnNldEhlaWdodDtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlICdsZWZ0Jzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgLSBwb3BvdmVyLm9mZnNldFdpZHRoO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgKyB0cmlnZ2VyLm9mZnNldEhlaWdodCAvIDIgLSBwb3BvdmVyLm9mZnNldEhlaWdodCAvIDI7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSAncmlnaHQnOlxuXHQgICAgICAgICAgICBfdGhpczIubGVmdCA9IHRyaWdnZXIub2Zmc2V0TGVmdCArIHRyaWdnZXIub2Zmc2V0V2lkdGg7XG5cdCAgICAgICAgICAgIF90aGlzMi50b3AgPSB0cmlnZ2VyLm9mZnNldFRvcCArIHRyaWdnZXIub2Zmc2V0SGVpZ2h0IC8gMiAtIHBvcG92ZXIub2Zmc2V0SGVpZ2h0IC8gMjtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlICdib3R0b20nOlxuXHQgICAgICAgICAgICBfdGhpczIubGVmdCA9IHRyaWdnZXIub2Zmc2V0TGVmdCAtIHBvcG92ZXIub2Zmc2V0V2lkdGggLyAyICsgdHJpZ2dlci5vZmZzZXRXaWR0aCAvIDI7XG5cdCAgICAgICAgICAgIF90aGlzMi50b3AgPSB0cmlnZ2VyLm9mZnNldFRvcCArIHRyaWdnZXIub2Zmc2V0SGVpZ2h0O1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgIGNvbnNvbGUud2FybignV3JvbmcgcGxhY2VtZW50IHByb3AnKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcG9wb3Zlci5zdHlsZS50b3AgPSBfdGhpczIudG9wICsgJ3B4Jztcblx0ICAgICAgICBwb3BvdmVyLnN0eWxlLmxlZnQgPSBfdGhpczIubGVmdCArICdweCc7XG5cdCAgICAgIH0pO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKGUpIHtcblx0ICAgICAgaWYgKGUgJiYgdGhpcy50cmlnZ2VyID09PSAnY29udGV4dG1lbnUnKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgIHRoaXMuc2hvdyA9ICF0aGlzLnNob3c7XG5cdCAgICAgIGlmICh0aGlzLnNob3cpIHRoaXMuYmVmb3JlRW50ZXIoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgICB2YXIgdHJpZ2dlciA9IHRoaXMuJHJlZnMudHJpZ2dlci5jaGlsZHJlblswXTtcblx0ICAgIGlmICghdHJpZ2dlcikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHRyaWdnZXIgdi1lbCBpbiB5b3VyIGNvbXBvbmVudCB0aGF0IHVzZXMgcG9wb3Zlck1peGluLicpO1xuXHRcblx0ICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycgJiYgIX50cmlnZ2VyLnRhYkluZGV4KSB7XG5cdCAgICAgIHRyaWdnZXIgPSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnYSxpbnB1dCxzZWxlY3QsdGV4dGFyZWEsYnV0dG9uJywgdHJpZ2dlcik7XG5cdCAgICAgIGlmICghdHJpZ2dlci5sZW5ndGgpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRyaWdnZXIpLm9uKGV2ZW50LCBfdGhpczMudG9nZ2xlKTtcblx0ICAgIH0pO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl90cmlnZ2VyKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLl90cmlnZ2VyKS5vZmYoKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHJlZjogXCJ0cmlnZ2VyXCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6IF92bS5lZmZlY3Rcblx0ICAgIH1cblx0ICB9LCBbKF92bS5zaG93KSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgcmVmOiBcInBvcG92ZXJcIixcblx0ICAgIGNsYXNzOiBbJ3BvcG92ZXInLCBfdm0ucGxhY2VtZW50XVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFycm93XCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgKF92bS50aXRsZSkgPyBfdm0uX2MoJ2gzJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicG9wb3Zlci10aXRsZVwiXG5cdCAgfSwgW192bS5fdChcInRpdGxlXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50aXRsZSkpXSldLCAyKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBvcG92ZXItY29udGVudFwiXG5cdCAgfSwgW192bS5fdChcImNvbnRlbnRcIiwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhfdm0uY29udGVudClcblx0ICAgIH1cblx0ICB9KV0pXSwgMildKSA6IF92bS5fZSgpXSldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0yNDY1YmY1NFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE0NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDYpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ3KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFByb2dyZXNzYmFyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi02OGFhMzM3NVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNjhhYTMzNzVcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBQcm9ncmVzc2Jhci52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNDYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBhbmltYXRlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFiZWw6IHsgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5vdzogeyByZXF1aXJlZDogdHJ1ZSB9LFxuXHQgICAgc3RyaXBlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGxhYmVsQm9vbDogZnVuY3Rpb24gbGFiZWxCb29sKCkge1xuXHQgICAgICByZXR1cm4gX3V0aWxzLmNvZXJjZS5ib29sZWFuKHRoaXMubGFiZWwpO1xuXHQgICAgfSxcblx0ICAgIG5vd051bTogZnVuY3Rpb24gbm93TnVtKCkge1xuXHQgICAgICByZXR1cm4gX3V0aWxzLmNvZXJjZS5udW1iZXIodGhpcy5ub3cpO1xuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDE0NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWydwcm9ncmVzcy1iYXInLCAncHJvZ3Jlc3MtYmFyLScgKyBfdm0udHlwZSwge1xuXHQgICAgICBhY3RpdmU6IF92bS5hbmltYXRlZCxcblx0ICAgICAgJ3Byb2dyZXNzLWJhci1zdHJpcGVkJzogX3ZtLnN0cmlwZWRcblx0ICAgIH1dLFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIHdpZHRoOiBfdm0ubm93TnVtICsgJyUnXG5cdCAgICB9KSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidGV4dENvbnRlbnRcIjogX3ZtLl9zKF92bS5sYWJlbEJvb2wgPyBfdm0ubm93TnVtICsgJyUnIDogbnVsbClcblx0ICAgIH1cblx0ICB9KVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi02OGFhMzM3NVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE0OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxNDkpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTEpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUyKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFJhZGlvLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi03NGNmZDkyY1wiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNzRjZmQ5MmNcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBSYWRpby52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1MCk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzRjZmQ5MmMhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1JhZGlvLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzRjZmQ5MmMhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1JhZGlvLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4ucmFkaW8geyBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi5yYWRpbyA+IGxhYmVsID4gaW5wdXQge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICB6LWluZGV4OiAtMTtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcbi5yYWRpbyA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAuMTVyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IC43cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxufVxcbi5yYWRpbzpub3QoLmFjdGl2ZSkgPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xcbn1cXG4ucmFkaW8gPiBsYWJlbCA+IGlucHV0OmZvY3VzIH4gLmljb24ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcbn1cXG4ucmFkaW8uYWN0aXZlID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lQanhqYVhKamJHVWdZM2c5SWpVaUlHTjVQU0kxSWlCeVBTSTBJaUJtYVd4c1BTSWpabVptSWk4K1BDOXpkbWMrKTtcXG59XFxuLnJhZGlvLmFjdGl2ZSAuYnRuLWRlZmF1bHQgeyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTtcXG59XFxuLnJhZGlvLmRpc2FibGVkID4gbGFiZWwgPiAuaWNvbixcXHJcXG4ucmFkaW8ucmVhZG9ubHkgPiBsYWJlbCA+IC5pY29uLFxcclxcbi5idG4ucmVhZG9ubHkge1xcclxcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1KTtcXHJcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICBvcGFjaXR5OiAuNjU7XFxufVxcbmxhYmVsLmJ0biA+IGlucHV0W3R5cGU9cmFkaW9dIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9SYWRpby52dWU/MjZkZTYxODRcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQW1HQSxTQUFBLG1CQUFBO0NBQUE7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsVUFBQTtFQUNBLFdBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLHVCQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLFFBQUE7RUFDQSxlQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0VBQ0EscUJBQUE7RUFDQSw2QkFBQTtFQUNBLG1DQUFBO0VBQ0EseUJBQUE7Q0FDQTtBQUNBO0VBQ0EsdUJBQUE7RUFDQSx1QkFBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsMEJBQUE7RUFDQSwwRUFBQTtDQUNBO0FBQ0E7RUFDQSwyQkFBQTtFQUNBLDhPQUFBO0NBQ0E7QUFDQSw2QkFBQSx3QkFBQTtDQUFBO0FBRUE7OztFQUdBLDBCQUFBO0VBQ0EsaUJBQUE7RUFDQSxhQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0Esb0JBQUE7RUFDQSxxQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJSYWRpby52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiA6aXM9XFxcImJ1dHRvblN0eWxlPydsYWJlbCc6J2RpdidcXFwiIEBjbGljay5wcmV2ZW50PVxcXCJ0b2dnbGVcXFwiXFxyXFxuICAgIDpjbGFzcz1cXFwiWyhidXR0b25TdHlsZT8nYnRuIGJ0bi0nK3R5cGVDb2xvcjoncmFkaW8gJyt0eXBlQ29sb3IpLHthY3RpdmU6YWN0aXZlLGRpc2FibGVkOmRpc2FibGVkLHJlYWRvbmx5OnJlYWRvbmx5fV1cXFwiXFxyXFxuICA+XFxyXFxuICAgIDx0ZW1wbGF0ZSB2LWlmPVxcXCJidXR0b25TdHlsZVxcXCI+XFxyXFxuICAgICAgPGlucHV0IHR5cGU9XFxcInJhZGlvXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJpbnB1dFxcXCJcXHJcXG4gICAgICAgIHYtc2hvdz1cXFwiIXJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgdi1tb2RlbD1cXFwiY2hlY2tcXFwiXFxyXFxuICAgICAgICA6dmFsdWU9XFxcImNoZWNrZWRWYWx1ZVxcXCJcXHJcXG4gICAgICAgIDpuYW1lPVxcXCJuYW1lXFxcIlxcclxcbiAgICAgICAgOnJlYWRvbmx5PVxcXCJyZWFkb25seVxcXCJcXHJcXG4gICAgICAgIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiXFxyXFxuICAgICAgLz5cXHJcXG4gICAgICA8c2xvdD48L3Nsb3Q+XFxyXFxuICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgIDxsYWJlbCB2LWVsc2UgY2xhc3M9XFxcIm9wZW5cXFwiPlxcclxcbiAgICAgIDxpbnB1dCB0eXBlPVxcXCJyYWRpb1xcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICB2LW1vZGVsPVxcXCJjaGVja1xcXCJcXHJcXG4gICAgICAgIDp2YWx1ZT1cXFwiY2hlY2tlZFZhbHVlXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAvPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbYWN0aXZlPydidG4tJyt0eXBlQ29sb3I6Jycse2JnOnR5cGVDb2xvcj09PSdkZWZhdWx0J31dXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiYWN0aXZlJiZ0eXBlQ29sb3I9PT0nZGVmYXVsdCdcXFwiIGNsYXNzPVxcXCJpY29uXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8L2xhYmVsPlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgY2hlY2tlZFZhbHVlOiB7ZGVmYXVsdDogdHJ1ZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcmVhZG9ubHk6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGNoZWNrOiB0aGlzLnZhbHVlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBhY3RpdmUgKCkgeyByZXR1cm4gdGhpcy5jaGVjayA9PT0gdGhpcy5jaGVja2VkVmFsdWUgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKCkgeyByZXR1cm4gdGhpcy5faW5Hcm91cCA/IHRoaXMuJHBhcmVudC52YWwgPT09IHRoaXMudmFsdWUgOiBudWxsIH0sXFxyXFxuICAgIGJ1dHRvblN0eWxlICgpIHsgcmV0dXJuIHRoaXMuYnV0dG9uIHx8ICh0aGlzLl9pbkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zKSB9LFxcclxcbiAgICB0eXBlQ29sb3IgKCkgeyByZXR1cm4gKHRoaXMudHlwZSB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC50eXBlKSkgfHwgJ2RlZmF1bHQnIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBjaGVjayAodmFsKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuY2hlY2tlZFZhbHVlID09PSB2YWwpIHtcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hlY2tlZCcsIHRydWUpXFxyXFxuICAgICAgICBpZiAodGhpcy5faW5Hcm91cCkgeyB0aGlzLiRwYXJlbnQudmFsID0gdmFsIH1cXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHBhcmVudFZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy5jaGVjayAhPT0gdmFsICYmIHRoaXMuY2hlY2tlZFZhbHVlID09PSB2YWwpIHsgdGhpcy5jaGVjayA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICB0aGlzLmNoZWNrID0gdGhpcy5jaGVja2VkVmFsdWUgPT09IHZhbCA/IHZhbCA6IG51bGxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9idG5Hcm91cCAmJiAhcGFyZW50Ll9jaGVja2JveEdyb3VwKSB7XFxyXFxuICAgICAgdGhpcy5faW5Hcm91cCA9IHRydWVcXHJcXG4gICAgICBwYXJlbnQuX3JhZGlvR3JvdXAgPSB0cnVlXFxyXFxuICAgIH1cXHJcXG4gICAgaWYgKHRoaXMuJHBhcmVudC5fcmFkaW9Hcm91cCkge1xcclxcbiAgICAgIGlmICh0aGlzLiRwYXJlbnQudmFsKSB7XFxyXFxuICAgICAgICB0aGlzLmNoZWNrID0gKHRoaXMuJHBhcmVudC52YWwgPT09IHRoaXMuY2hlY2tlZFZhbHVlKVxcclxcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGVjaykge1xcclxcbiAgICAgICAgdGhpcy4kcGFyZW50LnZhbCA9IHRoaXMuY2hlY2tlZFZhbHVlXFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBmb2N1cyAoKSB7XFxyXFxuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsgcmV0dXJuIH1cXHJcXG4gICAgICB0aGlzLmZvY3VzKClcXHJcXG4gICAgICBpZiAodGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLmNoZWNrZWRWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLl9pbkdyb3VwKSB7XFxyXFxuICAgICAgICB0aGlzLiRwYXJlbnQudmFsID0gdGhpcy5jaGVja2VkVmFsdWVcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlIHNjb3BlPlxcclxcbi5yYWRpbyB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgfVxcclxcbi5yYWRpbyA+IGxhYmVsID4gaW5wdXQge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICB6LWluZGV4OiAtMTtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxufVxcclxcbi5yYWRpbyA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAuMTVyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IC43cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxyXFxufVxcclxcbi5yYWRpbzpub3QoLmFjdGl2ZSkgPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xcclxcbn1cXHJcXG4ucmFkaW8gPiBsYWJlbCA+IGlucHV0OmZvY3VzIH4gLmljb24ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcclxcbn1cXHJcXG4ucmFkaW8uYWN0aXZlID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lQanhqYVhKamJHVWdZM2c5SWpVaUlHTjVQU0kxSWlCeVBTSTBJaUJtYVd4c1BTSWpabVptSWk4K1BDOXpkbWMrKTtcXHJcXG59XFxyXFxuLnJhZGlvLmFjdGl2ZSAuYnRuLWRlZmF1bHQgeyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTsgfVxcclxcblxcclxcbi5yYWRpby5kaXNhYmxlZCA+IGxhYmVsID4gLmljb24sXFxyXFxuLnJhZGlvLnJlYWRvbmx5ID4gbGFiZWwgPiAuaWNvbixcXHJcXG4uYnRuLnJlYWRvbmx5IHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcclxcbn1cXHJcXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPXJhZGlvXSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBidXR0b246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGNoZWNrZWRWYWx1ZTogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGNoZWNrOiB0aGlzLnZhbHVlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY2hlY2sgPT09IHRoaXMuY2hlY2tlZFZhbHVlO1xuXHQgICAgfSxcblx0ICAgIHBhcmVudFZhbHVlOiBmdW5jdGlvbiBwYXJlbnRWYWx1ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX2luR3JvdXAgPyB0aGlzLiRwYXJlbnQudmFsID09PSB0aGlzLnZhbHVlIDogbnVsbDtcblx0ICAgIH0sXG5cdCAgICBidXR0b25TdHlsZTogZnVuY3Rpb24gYnV0dG9uU3R5bGUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmJ1dHRvbiB8fCB0aGlzLl9pbkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zO1xuXHQgICAgfSxcblx0ICAgIHR5cGVDb2xvcjogZnVuY3Rpb24gdHlwZUNvbG9yKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50eXBlIHx8IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSB8fCAnZGVmYXVsdCc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgY2hlY2s6IGZ1bmN0aW9uIGNoZWNrKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy5jaGVja2VkVmFsdWUgPT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgICAgICB0aGlzLiRlbWl0KCdjaGVja2VkJywgdHJ1ZSk7XG5cdCAgICAgICAgaWYgKHRoaXMuX2luR3JvdXApIHtcblx0ICAgICAgICAgIHRoaXMuJHBhcmVudC52YWwgPSB2YWw7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy5jaGVjayAhPT0gdmFsICYmIHRoaXMuY2hlY2tlZFZhbHVlID09PSB2YWwpIHtcblx0ICAgICAgICB0aGlzLmNoZWNrID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICB0aGlzLmNoZWNrID0gdGhpcy5jaGVja2VkVmFsdWUgPT09IHZhbCA/IHZhbCA6IG51bGw7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcblx0ICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9idG5Hcm91cCAmJiAhcGFyZW50Ll9jaGVja2JveEdyb3VwKSB7XG5cdCAgICAgIHRoaXMuX2luR3JvdXAgPSB0cnVlO1xuXHQgICAgICBwYXJlbnQuX3JhZGlvR3JvdXAgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuJHBhcmVudC5fcmFkaW9Hcm91cCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50LnZhbCkge1xuXHQgICAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLiRwYXJlbnQudmFsID09PSB0aGlzLmNoZWNrZWRWYWx1ZTtcblx0ICAgICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrKSB7XG5cdCAgICAgICAgdGhpcy4kcGFyZW50LnZhbCA9IHRoaXMuY2hlY2tlZFZhbHVlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0XG5cdCAgbWV0aG9kczoge1xuXHQgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHQgICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuZm9jdXMoKTtcblx0ICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5jaGVjayA9IHRoaXMuY2hlY2tlZFZhbHVlO1xuXHQgICAgICBpZiAodGhpcy5faW5Hcm91cCkge1xuXHQgICAgICAgIHRoaXMuJHBhcmVudC52YWwgPSB0aGlzLmNoZWNrZWRWYWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDE1MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKF92bS5idXR0b25TdHlsZSA/ICdsYWJlbCcgOiAnZGl2Jywge1xuXHQgICAgdGFnOiBcImRpdlwiLFxuXHQgICAgY2xhc3M6IFsoX3ZtLmJ1dHRvblN0eWxlID8gJ2J0biBidG4tJyArIF92bS50eXBlQ29sb3IgOiAncmFkaW8gJyArIF92bS50eXBlQ29sb3IpLCB7XG5cdCAgICAgIGFjdGl2ZTogX3ZtLmFjdGl2ZSxcblx0ICAgICAgZGlzYWJsZWQ6IF92bS5kaXNhYmxlZCxcblx0ICAgICAgcmVhZG9ubHk6IF92bS5yZWFkb25seVxuXHQgICAgfV0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS50b2dnbGUoJGV2ZW50KVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uYnV0dG9uU3R5bGUpID8gW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6ICghX3ZtLnJlYWRvbmx5KSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCIhcmVhZG9ubHlcIlxuXHQgICAgfSwge1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jaGVjayksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY2hlY2tcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInJhZGlvXCIsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCIsXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJ2YWx1ZVwiOiBfdm0uY2hlY2tlZFZhbHVlLFxuXHQgICAgICBcImNoZWNrZWRcIjogX3ZtLl9xKF92bS5jaGVjaywgX3ZtLmNoZWNrZWRWYWx1ZSlcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jaGVjayA9IF92bS5jaGVja2VkVmFsdWVcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSA6IF92bS5fYygnbGFiZWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJvcGVuXCJcblx0ICB9LCBbX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwibW9kZWxcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LW1vZGVsXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmNoZWNrKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJjaGVja1wiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJpbnB1dFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwicmFkaW9cIixcblx0ICAgICAgXCJhdXRvY29tcGxldGVcIjogXCJvZmZcIixcblx0ICAgICAgXCJuYW1lXCI6IF92bS5uYW1lLFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seSxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5jaGVja2VkVmFsdWUsXG5cdCAgICAgIFwiY2hlY2tlZFwiOiBfdm0uX3EoX3ZtLmNoZWNrLCBfdm0uY2hlY2tlZFZhbHVlKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLmNoZWNrID0gX3ZtLmNoZWNrZWRWYWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb24gZHJvcGRvd24tdG9nZ2xlXCIsXG5cdCAgICBjbGFzczogW192bS5hY3RpdmUgPyAnYnRuLScgKyBfdm0udHlwZUNvbG9yIDogJycsIHtcblx0ICAgICAgYmc6IF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0J1xuXHQgICAgfV1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgKF92bS5hY3RpdmUgJiYgX3ZtLnR5cGVDb2xvciA9PT0gJ2RlZmF1bHQnKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb25cIlxuXHQgIH0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRlZmF1bHRcIildLCAyKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTc0Y2ZkOTJjXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTUzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE1NClcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1Nilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcU2VsZWN0LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtZTUxNGRiYzZcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWU1MTRkYmM2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1lNTE0ZGJjNlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFNlbGVjdC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1NSk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtZTUxNGRiYzYmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1NlbGVjdC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWU1MTRkYmM2JnNjb3BlZD10cnVlIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TZWxlY3QudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTU1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlW2RhdGEtdi1lNTE0ZGJjNl17XFxyXFxuICBoZWlnaHQ6IGF1dG87XFxyXFxuICBwYWRkaW5nLXJpZ2h0OiAyNHB4O1xcbn1cXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZVtkYXRhLXYtZTUxNGRiYzZdOmFmdGVye1xcclxcbiAgY29udGVudDogJyAnO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgcmlnaHQ6IDEzcHg7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIG1hcmdpbjogLTFweCAwIDA7XFxyXFxuICBib3JkZXItdG9wOiA0cHggZGFzaGVkO1xcclxcbiAgYm9yZGVyLXRvcDogNHB4IHNvbGlkIFxcXFw5O1xcclxcbiAgYm9yZGVyLXJpZ2h0OiA0cHggc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxuICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbn1cXG4uYnMtc2VhcmNoYm94W2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgbWFyZ2luOiA0cHggOHB4O1xcbn1cXG4uYnMtc2VhcmNoYm94IC5jbG9zZVtkYXRhLXYtZTUxNGRiYzZdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmJzLXNlYXJjaGJveCBpbnB1dFtkYXRhLXYtZTUxNGRiYzZdOmZvY3VzLFxcclxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlW2RhdGEtdi1lNTE0ZGJjNl06Zm9jdXMge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlci1jb2xvcjogIzY2YWZlOSAhaW1wb3J0YW50O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXG59XFxuLnNlY3JldFtkYXRhLXYtZTUxNGRiYzZdIHtcXHJcXG4gIGJvcmRlcjogMDtcXHJcXG4gIGNsaXA6IHJlY3QoMCAwIDAgMCk7XFxyXFxuICBoZWlnaHQ6IDFweDtcXHJcXG4gIG1hcmdpbjogLTFweDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgd2lkdGg6IDFweDtcXG59XFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU+LmNsb3NlW2RhdGEtdi1lNTE0ZGJjNl0geyBtYXJnaW4tbGVmdDogNXB4O1xcbn1cXG4ubm90aWZ5Lm91dFtkYXRhLXYtZTUxNGRiYzZdIHsgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4ubm90aWZ5LmluW2RhdGEtdi1lNTE0ZGJjNl0sXFxyXFxuLm5vdGlmeT5kaXZbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB3aWR0aDogOTYlO1xcclxcbiAgbWFyZ2luOiAwIDIlO1xcclxcbiAgbWluLWhlaWdodDogMjZweDtcXHJcXG4gIHBhZGRpbmc6IDNweCA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2UzZTNlMztcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLm5vdGlmeT5kaXZbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICB0b3A6IDVweDtcXHJcXG4gIHotaW5kZXg6IDE7XFxufVxcbi5ub3RpZnkuaW5bZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXHJcXG4gIGJvdHRvbTogNXB4O1xcbn1cXG4uYnRuLWdyb3VwLWp1c3RpZmllZCAuZHJvcGRvd24tdG9nZ2xlPnNwYW5bZGF0YS12LWU1MTRkYmM2XTpub3QoLmNsb3NlKSB7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gMThweCk7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogLTRweDtcXG59XFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLW1lbnVbZGF0YS12LWU1MTRkYmM2XSB7IHdpZHRoOiAxMDAlO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1NlbGVjdC52dWU/M2VkNWE0MjJcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQW1RQTtFQUNBLGFBQUE7RUFDQSxvQkFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsU0FBQTtFQUNBLGlCQUFBO0VBQ0EsdUJBQUE7RUFDQSx5QkFBQTtFQUNBLG9DQUFBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxnQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLGVBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBOztFQUVBLFdBQUE7RUFDQSxpQ0FBQTtFQUNBLDBFQUFBO0NBQ0E7QUFDQTtFQUNBLFVBQUE7RUFDQSxvQkFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0EsaUJBQUE7RUFDQSxXQUFBO0VBQ0EsbUJBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQSx3REFBQSxpQkFBQTtDQUFBO0FBQ0EsK0JBQUEsbUJBQUE7Q0FBQTtBQUNBOztFQUVBLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLGFBQUE7RUFDQSxpQkFBQTtFQUNBLGlCQUFBO0VBQ0Esb0JBQUE7RUFDQSwwQkFBQTtFQUNBLDRDQUFBO0VBQ0EscUJBQUE7Q0FDQTtBQUNBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsWUFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EseUJBQUE7RUFDQSxzQkFBQTtFQUNBLGlCQUFBO0VBQ0Esb0JBQUE7RUFDQSx3QkFBQTtFQUNBLG9CQUFBO0NBQ0E7QUFDQSx1REFBQSxZQUFBO0NBQUFcIixcImZpbGVcIjpcIlNlbGVjdC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiByZWY9XFxcInNlbGVjdFxcXCIgOmNsYXNzPVxcXCJjbGFzc2VzXFxcIiB2LWNsaWNrLW91dHNpZGU9XFxcImNsb3NlXFxcIj5cXHJcXG4gICAgPGRpdiByZWY9XFxcImJ0blxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBkcm9wZG93bi10b2dnbGVcXFwiIHRhYmluZGV4PVxcXCIxXFxcIiA6ZGlzYWJsZWQ9XFxcImRpc2FibGVkIHx8ICFoYXNQYXJlbnRcXFwiIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiXFxyXFxuICAgICAgQGJsdXI9XFxcImNhblNlYXJjaCA/IG51bGwgOiBjbG9zZSgpXFxcIlxcclxcbiAgICAgIEBjbGljaz1cXFwidG9nZ2xlKClcXFwiXFxyXFxuICAgICAgQGtleWRvd24uZXNjLnN0b3AucHJldmVudD1cXFwiY2xvc2VcXFwiXFxyXFxuICAgICAgQGtleWRvd24uc3BhY2Uuc3RvcC5wcmV2ZW50PVxcXCJ0b2dnbGVcXFwiXFxyXFxuICAgICAgQGtleWRvd24uZW50ZXIuc3RvcC5wcmV2ZW50PVxcXCJ0b2dnbGVcXFwiXFxyXFxuICAgID5cXHJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiYnRuLWNvbnRlbnRcXFwiIHYtaHRtbD1cXFwibG9hZGluZyA/IHRleHQubG9hZGluZyA6IHNob3dQbGFjZWhvbGRlciB8fCBzZWxlY3RlZFxcXCI+PC9zcGFuPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImNsZWFyQnV0dG9uJiZ2YWx1ZXMubGVuZ3RoXFxcIiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwiY2xlYXIoKVxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDxzZWxlY3QgcmVmPVxcXCJzZWxcXFwiIHYtbW9kZWw9XFxcInZhbFxcXCIgOm5hbWU9XFxcIm5hbWVcXFwiIGNsYXNzPVxcXCJzZWNyZXRcXFwiIDptdWx0aXBsZT1cXFwibXVsdGlwbGVcXFwiIDpyZXF1aXJlZD1cXFwicmVxdWlyZWRcXFwiIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiPlxcclxcbiAgICAgIDxvcHRpb24gdi1pZj1cXFwicmVxdWlyZWRcXFwiIHZhbHVlPVxcXCJcXFwiPjwvb3B0aW9uPlxcclxcbiAgICAgIDxvcHRpb24gdi1mb3I9XFxcIm9wdGlvbiBpbiBsaXN0XFxcIiA6dmFsdWU9XFxcIm9wdGlvbltvcHRpb25zVmFsdWVdXFxcIj57eyBvcHRpb25bb3B0aW9uc0xhYmVsXSB9fTwvb3B0aW9uPlxcclxcbiAgICA8L3NlbGVjdD5cXHJcXG4gICAgPHVsIGNsYXNzPVxcXCJkcm9wZG93bi1tZW51XFxcIj5cXHJcXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cXFwibGlzdC5sZW5ndGhcXFwiPlxcclxcbiAgICAgICAgPGxpIHYtaWY9XFxcImNhblNlYXJjaFxcXCIgY2xhc3M9XFxcImJzLXNlYXJjaGJveFxcXCI+XFxyXFxuICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiA6cGxhY2Vob2xkZXI9XFxcInNlYXJjaFRleHR8fHRleHQuc2VhcmNoXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJzZWFyY2hcXFwiXFxyXFxuICAgICAgICAgICAgdi1tb2RlbD1cXFwic2VhcmNoVmFsdWVcXFwiXFxyXFxuICAgICAgICAgICAgQGtleXVwLmVzYz1cXFwiY2xvc2VcXFwiXFxyXFxuICAgICAgICAgIC8+XFxyXFxuICAgICAgICAgIDxzcGFuIHYtc2hvdz1cXFwic2VhcmNoVmFsdWVcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJjbGVhclNlYXJjaFxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDwvbGk+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwicmVxdWlyZWQmJiFjbGVhckJ1dHRvblxcXCI+PGEgQG1vdXNlZG93bi5wcmV2ZW50PVxcXCJjbGVhcigpICYmIGNsb3NlKClcXFwiPnt7IHBsYWNlaG9sZGVyIHx8IHRleHQubm90U2VsZWN0ZWQgfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDxsaSB2LWZvcj1cXFwib3B0aW9uIGluIGZpbHRlcmVkT3B0aW9uc1xcXCIgOmlkPVxcXCJvcHRpb25bb3B0aW9uc1ZhbHVlXVxcXCI+XFxyXFxuICAgICAgICAgIDxhIEBtb3VzZWRvd24ucHJldmVudD1cXFwic2VsZWN0KG9wdGlvbltvcHRpb25zVmFsdWVdKVxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gdi1odG1sPVxcXCJvcHRpb25bb3B0aW9uc0xhYmVsXVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcXFwiIHYtc2hvdz1cXFwiaXNTZWxlY3RlZChvcHRpb25bb3B0aW9uc1ZhbHVlXSlcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgPC9hPlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgIWNsb3NlT25TZWxlY3RcXFwiIG5hbWU9XFxcImZhZGVpblxcXCI+PGRpdiBjbGFzcz1cXFwibm90aWZ5IGluXFxcIj57e2xpbWl0VGV4dH19PC9kaXY+PC90cmFuc2l0aW9uPlxcclxcbiAgICA8L3VsPlxcclxcbiAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgY2xvc2VPblNlbGVjdFxcXCIgbmFtZT1cXFwiZmFkZWluXFxcIj48ZGl2IGNsYXNzPVxcXCJub3RpZnkgb3V0XFxcIj48ZGl2Pnt7bGltaXRUZXh0fX08L2Rpdj48L2Rpdj48L3RyYW5zaXRpb24+XFxyXFxuICAgIDwhLS0gPHByZT5PcHRpb25zOiB7e2xpc3R9fTwvcHJlPiAtLT5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge3RyYW5zbGF0aW9uc30gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgQ2xpY2tPdXRzaWRlIGZyb20gJy4vZGlyZWN0aXZlcy9DbGlja091dHNpZGUuanMnXFxyXFxuXFxyXFxudmFyIHRpbWVvdXQgPSB7fVxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIGRpcmVjdGl2ZXM6IHtcXHJcXG4gICAgQ2xpY2tPdXRzaWRlXFxyXFxuICB9LFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGNsb3NlT25TZWxlY3Q6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYW5nOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2V9LFxcclxcbiAgICBsaW1pdDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMTAyNH0sXFxyXFxuICAgIG1pblNlYXJjaDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMH0sXFxyXFxuICAgIG11bHRpcGxlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgb3B0aW9uczoge3R5cGU6IEFycmF5LCBkZWZhdWx0ICgpIHsgcmV0dXJuIFtdIH19LFxcclxcbiAgICBvcHRpb25zTGFiZWw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdsYWJlbCd9LFxcclxcbiAgICBvcHRpb25zVmFsdWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd2YWx1ZSd9LFxcclxcbiAgICBwYXJlbnQ6IHtkZWZhdWx0OiB0cnVlfSxcXHJcXG4gICAgcGxhY2Vob2xkZXI6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZXF1aXJlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBzZWFyY2g6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHNlYXJjaFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB1cmw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB2YWx1ZTogbnVsbFxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGxpc3Q6IFtdLFxcclxcbiAgICAgIGxvYWRpbmc6IG51bGwsXFxyXFxuICAgICAgc2VhcmNoVmFsdWU6IG51bGwsXFxyXFxuICAgICAgc2hvdzogZmFsc2UsXFxyXFxuICAgICAgbm90aWZ5OiBmYWxzZSxcXHJcXG4gICAgICB2YWw6IG51bGwsXFxyXFxuICAgICAgdmFsaWQ6IG51bGxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGNhblNlYXJjaCAoKSB7IHJldHVybiB0aGlzLm1pblNlYXJjaCA/IHRoaXMubGlzdC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2ggOiB0aGlzLnNlYXJjaCB9LFxcclxcbiAgICBjbGFzc2VzICgpIHsgcmV0dXJuIFt7b3BlbjogdGhpcy5zaG93LCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZH0sIHRoaXMuY2xhc3MsIHRoaXMuaXNMaSA/ICdkcm9wZG93bicgOiB0aGlzLmluSW5wdXQgPyAnaW5wdXQtZ3JvdXAtYnRuJyA6ICdidG4tZ3JvdXAnXSB9LFxcclxcbiAgICBmaWx0ZXJlZE9wdGlvbnMgKCkge1xcclxcbiAgICAgIHZhciBzZWFyY2ggPSAodGhpcy5zZWFyY2hWYWx1ZSB8fCAnJykudG9Mb3dlckNhc2UoKVxcclxcbiAgICAgIHJldHVybiAhc2VhcmNoID8gdGhpcy5saXN0IDogdGhpcy5saXN0LmZpbHRlcihlbCA9PiB7XFxyXFxuICAgICAgICByZXR1cm4gfmVsW3RoaXMub3B0aW9uc0xhYmVsXS50b0xvd2VyQ2FzZSgpLnNlYXJjaChzZWFyY2gpXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgaGFzUGFyZW50ICgpIHsgcmV0dXJuIHRoaXMucGFyZW50IGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLnBhcmVudC5sZW5ndGggOiB0aGlzLnBhcmVudCB9LFxcclxcbiAgICBpbklucHV0ICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQgfSxcXHJcXG4gICAgaXNMaSAoKSB7IHJldHVybiB0aGlzLiRwYXJlbnQuX25hdmJhciB8fCB0aGlzLiRwYXJlbnQubWVudSB8fCB0aGlzLiRwYXJlbnQuX3RhYnNldCB9LFxcclxcbiAgICBsaW1pdFRleHQgKCkgeyByZXR1cm4gdGhpcy50ZXh0LmxpbWl0LnJlcGxhY2UoJ3t7bGltaXR9fScsIHRoaXMubGltaXQpIH0sXFxyXFxuICAgIHNlbGVjdGVkICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJycgfVxcclxcbiAgICAgIHZhciBzZWwgPSB0aGlzLnZhbHVlcy5tYXAodmFsID0+ICh0aGlzLmxpc3QuZmluZChvID0+IG9bdGhpcy5vcHRpb25zVmFsdWVdID09PSB2YWwpIHx8IHt9KVt0aGlzLm9wdGlvbnNMYWJlbF0pLmZpbHRlcih2YWwgPT4gdmFsICE9PSB1bmRlZmluZWQpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0ZWQnLCBzZWwpXFxyXFxuICAgICAgcmV0dXJuIHNlbC5qb2luKCcsICcpXFxyXFxuICAgIH0sXFxyXFxuICAgIHNob3dQbGFjZWhvbGRlciAoKSB7IHJldHVybiAodGhpcy52YWx1ZXMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmhhc1BhcmVudCkgPyAodGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLnRleHQubm90U2VsZWN0ZWQpIDogbnVsbCB9LFxcclxcbiAgICB0ZXh0ICgpIHsgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpIH0sXFxyXFxuICAgIHZhbHVlcyAoKSB7IHJldHVybiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwgOiB+W251bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih0aGlzLnZhbCkgPyBbXSA6IFt0aGlzLnZhbF0gfSxcXHJcXG4gICAgdmFsT3B0aW9ucyAoKSB7IHJldHVybiB0aGlzLmxpc3QubWFwKGVsID0+IGVsW3RoaXMub3B0aW9uc1ZhbHVlXSkgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIG9wdGlvbnMgKG9wdGlvbnMpIHtcXHJcXG4gICAgICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5KSB0aGlzLnNldE9wdGlvbnMob3B0aW9ucylcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAodmFsKSB7XFxyXFxuICAgICAgaWYgKHZhbCkge1xcclxcbiAgICAgICAgdGhpcy4kcmVmcy5zZWFyY2ggPyB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpIDogdGhpcy4kcmVmcy5idG4uZm9jdXMoKVxcclxcbiAgICAgICAgLy8gb25CbHVyKHRoaXMuJHJlZnMuc2VsZWN0LCBlID0+IHsgdGhpcy5zaG93ID0gZmFsc2UgfSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgLy8gb2ZmQmx1cih0aGlzLiRyZWZzLnNlbGVjdClcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHVybCAoKSB7XFxyXFxuICAgICAgdGhpcy51cmxDaGFuZ2VkKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKVxcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsgdGhpcy52YWwgPSB2YWwgPSBudWxsIH1cXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHtcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbClcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXkgJiYgdmFsLmxlbmd0aCA+IHRoaXMubGltaXQpIHtcXHJcXG4gICAgICAgIHRoaXMudmFsID0gdmFsLnNsaWNlKDAsIHRoaXMubGltaXQpXFxyXFxuICAgICAgICB0aGlzLm5vdGlmeSA9IHRydWVcXHJcXG4gICAgICAgIGlmICh0aW1lb3V0LmxpbWl0KSBjbGVhclRpbWVvdXQodGltZW91dC5saW1pdClcXHJcXG4gICAgICAgIHRpbWVvdXQubGltaXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgdGltZW91dC5saW1pdCA9IGZhbHNlXFxyXFxuICAgICAgICAgIHRoaXMubm90aWZ5ID0gZmFsc2VcXHJcXG4gICAgICAgIH0sIDE1MDApXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgY2xvc2UgKCkge1xcclxcbiAgICAgIHRoaXMuc2hvdyA9IGZhbHNlXFxyXFxuICAgIH0sXFxyXFxuICAgIGNoZWNrRGF0YSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcXHJcXG4gICAgICAgIGlmICh0aGlzLmxpbWl0IDwgMSkgeyB0aGlzLmxpbWl0ID0gMSB9XFxyXFxuICAgICAgICBpZiAoISh0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xcclxcbiAgICAgICAgICB0aGlzLnZhbCA9ICh0aGlzLnZhbCA9PT0gbnVsbCB8fCB0aGlzLnZhbCA9PT0gdW5kZWZpbmVkKSA/IFtdIDogW3RoaXMudmFsXVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsT3B0aW9uc1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbC5maWx0ZXIoZWwgPT4gfnZhbHVlcy5pbmRleE9mKGVsKSlcXHJcXG4gICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgaWYgKCF+dGhpcy52YWxPcHRpb25zLmluZGV4T2YodGhpcy52YWwpKSB7IHRoaXMudmFsID0gbnVsbCB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBjbGVhciAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDogbnVsbFxcclxcbiAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgY2xlYXJTZWFyY2ggKCkge1xcclxcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJ1xcclxcbiAgICAgIHRoaXMuJHJlZnMuc2VhcmNoLmZvY3VzKClcXHJcXG4gICAgfSxcXHJcXG4gICAgaXNTZWxlY3RlZCAodikge1xcclxcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5pbmRleE9mKHYpID4gLTFcXHJcXG4gICAgfSxcXHJcXG4gICAgc2VsZWN0ICh2KSB7XFxyXFxuICAgICAgaWYgKHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcXHJcXG4gICAgICAgIHZhciBuZXdWYWwgPSB0aGlzLnZhbC5zbGljZSgwKVxcclxcbiAgICAgICAgaWYgKH5uZXdWYWwuaW5kZXhPZih2KSkge1xcclxcbiAgICAgICAgICBuZXdWYWwuc3BsaWNlKG5ld1ZhbC5pbmRleE9mKHYpLCAxKVxcclxcbiAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgbmV3VmFsLnB1c2godilcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMudmFsID0gbmV3VmFsXFxyXFxuICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB2XFxyXFxuICAgICAgICB0aGlzLnRvZ2dsZSgpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzZXRPcHRpb25zIChvcHRpb25zKSB7XFxyXFxuICAgICAgdGhpcy5saXN0ID0gb3B0aW9ucy5tYXAoZWwgPT4ge1xcclxcbiAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgT2JqZWN0KSB7IHJldHVybiBlbCB9XFxyXFxuICAgICAgICBsZXQgb2JqID0ge31cXHJcXG4gICAgICAgIG9ialt0aGlzLm9wdGlvbnNMYWJlbF0gPSBlbFxcclxcbiAgICAgICAgb2JqW3RoaXMub3B0aW9uc1ZhbHVlXSA9IGVsXFxyXFxuICAgICAgICByZXR1cm4gb2JqXFxyXFxuICAgICAgfSlcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdvcHRpb25zJywgdGhpcy5saXN0KVxcclxcbiAgICB9LFxcclxcbiAgICB0b2dnbGUgKCkge1xcclxcbiAgICAgIHRoaXMuc2hvdyA9ICF0aGlzLnNob3dcXHJcXG4gICAgICBpZiAoIXRoaXMuc2hvdykgdGhpcy4kcmVmcy5idG4uZm9jdXMoKVxcclxcbiAgICB9LFxcclxcbiAgICB1cmxDaGFuZ2VkICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMudXJsIHx8ICF0aGlzLiRodHRwKSB7IHJldHVybiB9XFxyXFxuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxcclxcbiAgICAgIHRoaXMuJGh0dHAuZ2V0KHRoaXMudXJsKS50aGVuKHJlc3BvbnNlID0+IHtcXHJcXG4gICAgICAgIHZhciBkYXRhID0gcmVzcG9uc2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5ID8gcmVzcG9uc2UuZGF0YSA6IFtdXFxyXFxuICAgICAgICB0cnkgeyBkYXRhID0gSlNPTi5wYXJzZShkYXRhKSB9IGNhdGNoIChlKSB7fVxcclxcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zKGRhdGEpXFxyXFxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgICAgdGhpcy5jaGVja0RhdGEoKVxcclxcbiAgICAgIH0sIHJlc3BvbnNlID0+IHtcXHJcXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWRhdGUgKCkge1xcclxcbiAgICAgIHJldHVybiAhdGhpcy5yZXF1aXJlZCA/IHRydWUgOiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwubGVuZ3RoID4gMCA6IHRoaXMudmFsICE9PSBudWxsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucylcXHJcXG4gICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHRoaXMuX3NlbGVjdCA9IHRydWVcXHJcXG4gICAgaWYgKHRoaXMudmFsID09PSB1bmRlZmluZWQgfHwgIXRoaXMucGFyZW50KSB7IHRoaXMudmFsID0gbnVsbCB9XFxyXFxuICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XFxyXFxuICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbFswXVxcclxcbiAgICB9XFxyXFxuICAgIHRoaXMuY2hlY2tEYXRhKClcXHJcXG4gICAgaWYgKHRoaXMudXJsKSB0aGlzLnVybENoYW5nZWQoKVxcclxcbiAgICBsZXQgcGFyZW50ID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5fZm9ybVZhbGlkYXRvcikgeyBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudCB9XFxyXFxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XFxyXFxuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcylcXHJcXG4gICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnRcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICBpZiAodGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKVxcclxcbiAgICB0aGlzLnNldE9wdGlvbnModGhpcy5vcHRpb25zKVxcclxcbiAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWVcXHJcXG4gICAgdGhpcy5jaGVja0RhdGEoKVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICBpZiAodGhpcy5fcGFyZW50KSB7XFxyXFxuICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcylcXHJcXG4gICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKVxcclxcbiAgICB9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZSBzY29wZWQ+XFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGV7XFxyXFxuICBoZWlnaHQ6IGF1dG87XFxyXFxuICBwYWRkaW5nLXJpZ2h0OiAyNHB4O1xcclxcbn1cXHJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZTphZnRlcntcXHJcXG4gIGNvbnRlbnQ6ICcgJztcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHJpZ2h0OiAxM3B4O1xcclxcbiAgdG9wOiA1MCU7XFxyXFxuICBtYXJnaW46IC0xcHggMCAwO1xcclxcbiAgYm9yZGVyLXRvcDogNHB4IGRhc2hlZDtcXHJcXG4gIGJvcmRlci10b3A6IDRweCBzb2xpZCBcXFxcOTtcXHJcXG4gIGJvcmRlci1yaWdodDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcXHJcXG59XFxyXFxuLmJzLXNlYXJjaGJveCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBtYXJnaW46IDRweCA4cHg7XFxyXFxufVxcclxcbi5icy1zZWFyY2hib3ggLmNsb3NlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmJzLXNlYXJjaGJveCBpbnB1dDpmb2N1cyxcXHJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZTpmb2N1cyB7XFxyXFxuICBvdXRsaW5lOiAwO1xcclxcbiAgYm9yZGVyLWNvbG9yOiAjNjZhZmU5ICFpbXBvcnRhbnQ7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcclxcbn1cXHJcXG4uc2VjcmV0IHtcXHJcXG4gIGJvcmRlcjogMDtcXHJcXG4gIGNsaXA6IHJlY3QoMCAwIDAgMCk7XFxyXFxuICBoZWlnaHQ6IDFweDtcXHJcXG4gIG1hcmdpbjogLTFweDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgd2lkdGg6IDFweDtcXHJcXG59XFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU+LmNsb3NlIHsgbWFyZ2luLWxlZnQ6IDVweDt9XFxyXFxuLm5vdGlmeS5vdXQgeyBwb3NpdGlvbjogcmVsYXRpdmU7IH1cXHJcXG4ubm90aWZ5LmluLFxcclxcbi5ub3RpZnk+ZGl2IHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiA5NiU7XFxyXFxuICBtYXJnaW46IDAgMiU7XFxyXFxuICBtaW4taGVpZ2h0OiAyNnB4O1xcclxcbiAgcGFkZGluZzogM3B4IDVweDtcXHJcXG4gIGJhY2tncm91bmQ6ICNmNWY1ZjU7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjZTNlM2UzO1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA1KTtcXHJcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcclxcbn1cXHJcXG4ubm90aWZ5PmRpdiB7XFxyXFxuICB0b3A6IDVweDtcXHJcXG4gIHotaW5kZXg6IDE7XFxyXFxufVxcclxcbi5ub3RpZnkuaW4ge1xcclxcbiAgb3BhY2l0eTogLjk7XFxyXFxuICBib3R0b206IDVweDtcXHJcXG59XFxyXFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLXRvZ2dsZT5zcGFuOm5vdCguY2xvc2UpIHtcXHJcXG4gIHdpZHRoOiBjYWxjKDEwMCUgLSAxOHB4KTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAtNHB4O1xcclxcbn1cXHJcXG4uYnRuLWdyb3VwLWp1c3RpZmllZCAuZHJvcGRvd24tbWVudSB7IHdpZHRoOiAxMDAlOyB9XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE1NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgX0NsaWNrT3V0c2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xpY2tPdXRzaWRlKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0dmFyIHRpbWVvdXQgPSB7fTtcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIENsaWNrT3V0c2lkZTogX0NsaWNrT3V0c2lkZTIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIGNsZWFyQnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBjbG9zZU9uU2VsZWN0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgbGltaXQ6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMDI0IH0sXG5cdCAgICBtaW5TZWFyY2g6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG5cdCAgICBtdWx0aXBsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIG9wdGlvbnM6IHsgdHlwZTogQXJyYXksIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuXHQgICAgICAgIHJldHVybiBbXTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG9wdGlvbnNMYWJlbDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdsYWJlbCcgfSxcblx0ICAgIG9wdGlvbnNWYWx1ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd2YWx1ZScgfSxcblx0ICAgIHBhcmVudDogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlcXVpcmVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHNlYXJjaDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2VhcmNoVGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHVybDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiBudWxsXG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgbGlzdDogW10sXG5cdCAgICAgIGxvYWRpbmc6IG51bGwsXG5cdCAgICAgIHNlYXJjaFZhbHVlOiBudWxsLFxuXHQgICAgICBzaG93OiBmYWxzZSxcblx0ICAgICAgbm90aWZ5OiBmYWxzZSxcblx0ICAgICAgdmFsOiBudWxsLFxuXHQgICAgICB2YWxpZDogbnVsbFxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgY2FuU2VhcmNoOiBmdW5jdGlvbiBjYW5TZWFyY2goKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLm1pblNlYXJjaCA/IHRoaXMubGlzdC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2ggOiB0aGlzLnNlYXJjaDtcblx0ICAgIH0sXG5cdCAgICBjbGFzc2VzOiBmdW5jdGlvbiBjbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gW3sgb3BlbjogdGhpcy5zaG93LCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCB0aGlzLmNsYXNzLCB0aGlzLmlzTGkgPyAnZHJvcGRvd24nIDogdGhpcy5pbklucHV0ID8gJ2lucHV0LWdyb3VwLWJ0bicgOiAnYnRuLWdyb3VwJ107XG5cdCAgICB9LFxuXHQgICAgZmlsdGVyZWRPcHRpb25zOiBmdW5jdGlvbiBmaWx0ZXJlZE9wdGlvbnMoKSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICB2YXIgc2VhcmNoID0gKHRoaXMuc2VhcmNoVmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cdCAgICAgIHJldHVybiAhc2VhcmNoID8gdGhpcy5saXN0IDogdGhpcy5saXN0LmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gfmVsW190aGlzLm9wdGlvbnNMYWJlbF0udG9Mb3dlckNhc2UoKS5zZWFyY2goc2VhcmNoKTtcblx0ICAgICAgfSk7XG5cdCAgICB9LFxuXHQgICAgaGFzUGFyZW50OiBmdW5jdGlvbiBoYXNQYXJlbnQoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnBhcmVudCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy5wYXJlbnQubGVuZ3RoIDogdGhpcy5wYXJlbnQ7XG5cdCAgICB9LFxuXHQgICAgaW5JbnB1dDogZnVuY3Rpb24gaW5JbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgaXNMaTogZnVuY3Rpb24gaXNMaSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5fdGFic2V0O1xuXHQgICAgfSxcblx0ICAgIGxpbWl0VGV4dDogZnVuY3Rpb24gbGltaXRUZXh0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0LmxpbWl0LnJlcGxhY2UoJ3t7bGltaXR9fScsIHRoaXMubGltaXQpO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdGVkOiBmdW5jdGlvbiBzZWxlY3RlZCgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgc2VsID0gdGhpcy52YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICByZXR1cm4gKF90aGlzMi5saXN0LmZpbmQoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgICAgIHJldHVybiBvW190aGlzMi5vcHRpb25zVmFsdWVdID09PSB2YWw7XG5cdCAgICAgICAgfSkgfHwge30pW190aGlzMi5vcHRpb25zTGFiZWxdO1xuXHQgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZDtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdGVkJywgc2VsKTtcblx0ICAgICAgcmV0dXJuIHNlbC5qb2luKCcsICcpO1xuXHQgICAgfSxcblx0ICAgIHNob3dQbGFjZWhvbGRlcjogZnVuY3Rpb24gc2hvd1BsYWNlaG9sZGVyKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmhhc1BhcmVudCA/IHRoaXMucGxhY2Vob2xkZXIgfHwgdGhpcy50ZXh0Lm5vdFNlbGVjdGVkIDogbnVsbDtcblx0ICAgIH0sXG5cdCAgICB0ZXh0OiBmdW5jdGlvbiB0ZXh0KCkge1xuXHQgICAgICByZXR1cm4gKDAsIF91dGlscy50cmFuc2xhdGlvbnMpKHRoaXMubGFuZyk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwgOiB+W251bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih0aGlzLnZhbCkgPyBbXSA6IFt0aGlzLnZhbF07XG5cdCAgICB9LFxuXHQgICAgdmFsT3B0aW9uczogZnVuY3Rpb24gdmFsT3B0aW9ucygpIHtcblx0ICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cdFxuXHQgICAgICByZXR1cm4gdGhpcy5saXN0Lm1hcChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWxbX3RoaXMzLm9wdGlvbnNWYWx1ZV07XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIG9wdGlvbnM6IGZ1bmN0aW9uIG9wdGlvbnMoX29wdGlvbnMpIHtcblx0ICAgICAgaWYgKF9vcHRpb25zIGluc3RhbmNlb2YgQXJyYXkpIHRoaXMuc2V0T3B0aW9ucyhfb3B0aW9ucyk7XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyh2YWwpIHtcblx0ICAgICAgaWYgKHZhbCkge1xuXHQgICAgICAgIHRoaXMuJHJlZnMuc2VhcmNoID8gdGhpcy4kcmVmcy5zZWFyY2guZm9jdXMoKSA6IHRoaXMuJHJlZnMuYnRuLmZvY3VzKCk7XG5cdCAgICAgICAgLy8gb25CbHVyKHRoaXMuJHJlZnMuc2VsZWN0LCBlID0+IHsgdGhpcy5zaG93ID0gZmFsc2UgfSlcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIC8vIG9mZkJsdXIodGhpcy4kcmVmcy5zZWxlY3QpXG5cdCAgICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHVybDogZnVuY3Rpb24gdXJsKCkge1xuXHQgICAgICB0aGlzLnVybENoYW5nZWQoKTtcblx0ICAgIH0sXG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQgJiYgdGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoX3ZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSBfdmFsID0gbnVsbDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoX3ZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgX3ZhbCk7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoX3ZhbCBpbnN0YW5jZW9mIEFycmF5ICYmIF92YWwubGVuZ3RoID4gdGhpcy5saW1pdCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gX3ZhbC5zbGljZSgwLCB0aGlzLmxpbWl0KTtcblx0ICAgICAgICB0aGlzLm5vdGlmeSA9IHRydWU7XG5cdCAgICAgICAgaWYgKHRpbWVvdXQubGltaXQpIGNsZWFyVGltZW91dCh0aW1lb3V0LmxpbWl0KTtcblx0ICAgICAgICB0aW1lb3V0LmxpbWl0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICB0aW1lb3V0LmxpbWl0ID0gZmFsc2U7XG5cdCAgICAgICAgICBfdGhpczQubm90aWZ5ID0gZmFsc2U7XG5cdCAgICAgICAgfSwgMTUwMCk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcblx0ICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgY2hlY2tEYXRhOiBmdW5jdGlvbiBjaGVja0RhdGEoKSB7XG5cdCAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG5cdCAgICAgICAgaWYgKHRoaXMubGltaXQgPCAxKSB7XG5cdCAgICAgICAgICB0aGlzLmxpbWl0ID0gMTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCEodGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkpIHtcblx0ICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwgPT09IG51bGwgfHwgdGhpcy52YWwgPT09IHVuZGVmaW5lZCA/IFtdIDogW3RoaXMudmFsXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsT3B0aW9ucztcblx0ICAgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIHJldHVybiB+dmFsdWVzLmluZGV4T2YoZWwpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XG5cdCAgICAgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBpZiAoIX50aGlzLnZhbE9wdGlvbnMuaW5kZXhPZih0aGlzLnZhbCkpIHtcblx0ICAgICAgICAgIHRoaXMudmFsID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gW10gOiBudWxsO1xuXHQgICAgICB0aGlzLnRvZ2dsZSgpO1xuXHQgICAgfSxcblx0ICAgIGNsZWFyU2VhcmNoOiBmdW5jdGlvbiBjbGVhclNlYXJjaCgpIHtcblx0ICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuXHQgICAgICB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpO1xuXHQgICAgfSxcblx0ICAgIGlzU2VsZWN0ZWQ6IGZ1bmN0aW9uIGlzU2VsZWN0ZWQodikge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZXMuaW5kZXhPZih2KSA+IC0xO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHYpIHtcblx0ICAgICAgaWYgKHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcblx0ICAgICAgICB2YXIgbmV3VmFsID0gdGhpcy52YWwuc2xpY2UoMCk7XG5cdCAgICAgICAgaWYgKH5uZXdWYWwuaW5kZXhPZih2KSkge1xuXHQgICAgICAgICAgbmV3VmFsLnNwbGljZShuZXdWYWwuaW5kZXhPZih2KSwgMSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIG5ld1ZhbC5wdXNoKHYpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnZhbCA9IG5ld1ZhbDtcblx0ICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XG5cdCAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLnZhbCA9IHY7XG5cdCAgICAgICAgdGhpcy50b2dnbGUoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuXHQgICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblx0XG5cdCAgICAgIHRoaXMubGlzdCA9IG9wdGlvbnMubWFwKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIE9iamVjdCkge1xuXHQgICAgICAgICAgcmV0dXJuIGVsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgb2JqID0ge307XG5cdCAgICAgICAgb2JqW190aGlzNS5vcHRpb25zTGFiZWxdID0gZWw7XG5cdCAgICAgICAgb2JqW190aGlzNS5vcHRpb25zVmFsdWVdID0gZWw7XG5cdCAgICAgICAgcmV0dXJuIG9iajtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ29wdGlvbnMnLCB0aGlzLmxpc3QpO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgICBpZiAoIXRoaXMuc2hvdykgdGhpcy4kcmVmcy5idG4uZm9jdXMoKTtcblx0ICAgIH0sXG5cdCAgICB1cmxDaGFuZ2VkOiBmdW5jdGlvbiB1cmxDaGFuZ2VkKCkge1xuXHQgICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblx0XG5cdCAgICAgIGlmICghdGhpcy51cmwgfHwgIXRoaXMuJGh0dHApIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblx0ICAgICAgdGhpcy4kaHR0cC5nZXQodGhpcy51cmwpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdCAgICAgICAgdmFyIGRhdGEgPSByZXNwb25zZS5kYXRhIGluc3RhbmNlb2YgQXJyYXkgPyByZXNwb25zZS5kYXRhIDogW107XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cdCAgICAgICAgX3RoaXM2LnNldE9wdGlvbnMoZGF0YSk7XG5cdCAgICAgICAgX3RoaXM2LmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgICBfdGhpczYuY2hlY2tEYXRhKCk7XG5cdCAgICAgIH0sIGZ1bmN0aW9uIChyZXNwb25zZSkge1xuXHQgICAgICAgIF90aGlzNi5sb2FkaW5nID0gZmFsc2U7XG5cdCAgICAgIH0pO1xuXHQgICAgfSxcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgcmV0dXJuICF0aGlzLnJlcXVpcmVkID8gdHJ1ZSA6IHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLnZhbC5sZW5ndGggPiAwIDogdGhpcy52YWwgIT09IG51bGw7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucyk7XG5cdCAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWU7XG5cdCAgICB0aGlzLl9zZWxlY3QgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMudmFsID09PSB1bmRlZmluZWQgfHwgIXRoaXMucGFyZW50KSB7XG5cdCAgICAgIHRoaXMudmFsID0gbnVsbDtcblx0ICAgIH1cblx0ICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgIHRoaXMudmFsID0gdGhpcy52YWxbMF07XG5cdCAgICB9XG5cdCAgICB0aGlzLmNoZWNrRGF0YSgpO1xuXHQgICAgaWYgKHRoaXMudXJsKSB0aGlzLnVybENoYW5nZWQoKTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuXHQgICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucyk7XG5cdCAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWU7XG5cdCAgICB0aGlzLmNoZWNrRGF0YSgpO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcblx0ICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDE1NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcImNsaWNrLW91dHNpZGVcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LWNsaWNrLW91dHNpZGVcIixcblx0ICAgICAgdmFsdWU6IChfdm0uY2xvc2UpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImNsb3NlXCJcblx0ICAgIH1dLFxuXHQgICAgcmVmOiBcInNlbGVjdFwiLFxuXHQgICAgY2xhc3M6IF92bS5jbGFzc2VzXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgcmVmOiBcImJ0blwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sIGRyb3Bkb3duLXRvZ2dsZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0YWJpbmRleFwiOiBcIjFcIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWQgfHwgIV92bS5oYXNQYXJlbnQsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5XG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jYW5TZWFyY2ggPyBudWxsIDogX3ZtLmNsb3NlKClcblx0ICAgICAgfSxcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udG9nZ2xlKClcblx0ICAgICAgfSxcblx0ICAgICAgXCJrZXlkb3duXCI6IFtmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS5jbG9zZSgkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwic3BhY2VcIiwgMzIpKSB7IHJldHVybjsgfVxuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfSwgZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlbnRlclwiLCAxMykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS50b2dnbGUoJGV2ZW50KVxuXHQgICAgICB9XVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJidG4tY29udGVudFwiLFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJpbm5lckhUTUxcIjogX3ZtLl9zKF92bS5sb2FkaW5nID8gX3ZtLnRleHQubG9hZGluZyA6IF92bS5zaG93UGxhY2Vob2xkZXIgfHwgX3ZtLnNlbGVjdGVkKVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWx1ZXMubGVuZ3RoKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNsb3NlXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jbGVhcigpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc2VsZWN0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VsXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJzZWNyZXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJtdWx0aXBsZVwiOiBfdm0ubXVsdGlwbGUsXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seSxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNoYW5nZVwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udmFsID0gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKCRldmVudC50YXJnZXQub3B0aW9ucywgZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgcmV0dXJuIG8uc2VsZWN0ZWRcblx0ICAgICAgICB9KS5tYXAoZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgdmFyIHZhbCA9IFwiX3ZhbHVlXCIgaW4gbyA/IG8uX3ZhbHVlIDogby52YWx1ZTtcblx0ICAgICAgICAgIHJldHVybiB2YWxcblx0ICAgICAgICB9KVswXVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ucmVxdWlyZWQpID8gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInZhbHVlXCI6IFwiXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2woKF92bS5saXN0KSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJ2YWx1ZVwiOiBvcHRpb25bX3ZtLm9wdGlvbnNWYWx1ZV1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdihfdm0uX3Mob3B0aW9uW192bS5vcHRpb25zTGFiZWxdKSldKVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkcm9wZG93bi1tZW51XCJcblx0ICB9LCBbKF92bS5saXN0Lmxlbmd0aCkgPyBbKF92bS5jYW5TZWFyY2gpID8gX3ZtLl9jKCdsaScsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJzLXNlYXJjaGJveFwiXG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VhcmNoXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInRleHRcIixcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0uc2VhcmNoVGV4dCB8fCBfdm0udGV4dC5zZWFyY2gsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCJcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0uc2VhcmNoVmFsdWUpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLmNsb3NlKCRldmVudClcblx0ICAgICAgfSxcblx0ICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnNlYXJjaFZhbHVlID0gJGV2ZW50LnRhcmdldC52YWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uY2xlYXJTZWFyY2hcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0ucmVxdWlyZWQgJiYgIV92bS5jbGVhckJ1dHRvbikgPyBfdm0uX2MoJ2xpJywgW192bS5fYygnYScsIHtcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS5jbGVhcigpICYmIF92bS5jbG9zZSgpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0ucGxhY2Vob2xkZXIgfHwgX3ZtLnRleHQubm90U2VsZWN0ZWQpKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9sKChfdm0uZmlsdGVyZWRPcHRpb25zKSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgYXR0cnM6IHtcblx0ICAgICAgICBcImlkXCI6IG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uc2VsZWN0KG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXSlcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJpbm5lckhUTUxcIjogX3ZtLl9zKG9wdGlvbltfdm0ub3B0aW9uc0xhYmVsXSlcblx0ICAgICAgfVxuXHQgICAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICAgIHZhbHVlOiAoX3ZtLmlzU2VsZWN0ZWQob3B0aW9uW192bS5vcHRpb25zVmFsdWVdKSksXG5cdCAgICAgICAgZXhwcmVzc2lvbjogXCJpc1NlbGVjdGVkKG9wdGlvbltvcHRpb25zVmFsdWVdKVwiXG5cdCAgICAgIH1dLFxuXHQgICAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcIlxuXHQgICAgfSldKV0pXG5cdCAgfSldIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmICFfdm0uY2xvc2VPblNlbGVjdCkgPyBfdm0uX2MoJ3RyYW5zaXRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcIm5hbWVcIjogXCJmYWRlaW5cIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5vdGlmeSBpblwiXG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKSA6IF92bS5fZSgpXSwgMiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmIF92bS5jbG9zZU9uU2VsZWN0KSA/IF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImZhZGVpblwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibm90aWZ5IG91dFwiXG5cdCAgfSwgW192bS5fYygnZGl2JywgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKV0pIDogX3ZtLl9lKCldLCAxKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1lNTE0ZGJjNlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFNsaWRlci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzIxODViODJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTMyMTg1YjgyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gU2xpZGVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE1OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC4kY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcblx0ICAgIH0sXG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LmluZGV4ID09PSB0aGlzLmluZGV4O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLiRwYXJlbnQuaW5kaWNhdG9yX2xpc3QpIHtcblx0ICAgICAgdGhpcy4kcGFyZW50LmluZGljYXRvcl9saXN0LnB1c2godGhpcy5pbmRleCk7XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKHRoaXMuaW5kZXggPT09IDApIHtcblx0ICAgICAgdGhpcy4kZWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTYwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIml0ZW1cIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzIxODViODJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTYyKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTY0KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2NSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxTcGlubmVyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi04YjI5OGU3MFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtOGIyOThlNzBcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBTcGlubmVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE2MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYzKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi04YjI5OGU3MCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vU3Bpbm5lci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LThiMjk4ZTcwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TcGlubmVyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE2MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5Aa2V5ZnJhbWVzIHNwaW4ge1xcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbn1cXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXG59XFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvU3Bpbm5lci52dWU/NjVmYzVhOGZcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJGQTtBQUNBO0lBQ0EsMEJBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSxPQUFBO0VBQ0EsUUFBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0VBQ0EsY0FBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLGlDQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLDRCQUFBO0VBQ0EsbUJBQUE7RUFDQSxzQkFBQTtFQUNBLDRCQUFBO0VBQ0Esb0NBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxlQUFBO0VBQ0EsZUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsWUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7Ozs7O0VBS0EsNklBQUE7RUFDQSxnQkFBQTtFQUNBLGVBQUE7RUFDQSxnQkFBQTtFQUNBLGFBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtDQUNBXCIsXCJmaWxlXCI6XCJTcGlubmVyLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IDpjbGFzcz1cXFwiWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLHNwaW5uZXJTaXplLHsnc3Bpbm5lci1maXhlZCc6Zml4ZWR9XVxcXCIgdi1zaG93PVxcXCJhY3RpdmV8fGxvY2tlZFxcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItd3JhcHBlclxcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3Bpbm5lci1jaXJjbGVcXFwiPjwvZGl2PlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItdGV4dFxcXCI+e3t0ZXh0fX08L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtjb2VyY2UsIGRlbGF5ZXJ9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuY29uc3QgTUlOX1dBSVQgPSA1MDAgLy8gaW4gbXNcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBmaXhlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZ2xvYmFsOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBzaXplOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbWQnfSxcXHJcXG4gICAgdGV4dDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcXHJcXG4gICAgICBsb2NrZWQ6IGZhbHNlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBzcGlubmVyU2l6ZSAoKSB7IHJldHVybiAnc3Bpbm5lci0nICsgKHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZSA6ICdzbScpIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBhY3RpdmUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7IHRoaXNbdmFsID8gJ3Nob3cnIDogJ2hpZGUnXSgpIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgaGlkZSAoKSB7XFxyXFxuICAgICAgdmFyIGRlbGF5ID0gMFxcclxcbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAob3B0aW9ucykge1xcclxcbiAgICAgIGlmIChvcHRpb25zKSB7XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy50ZXh0KSB7IHRoaXMudGV4dCA9IG9wdGlvbnMudGV4dCB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7IHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZSB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5maXhlZCkgeyB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZCB9XFxyXFxuICAgICAgfVxcclxcbiAgICAgIC8vIGJsb2NrIHNjcm9sbGluZyB3aGVuIHNwaW5uZXIgaXMgb25cXHJcXG4gICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nXFxyXFxuICAgICAgLy8gYWN0aXZhdGUgc3Bpbm5lclxcclxcbiAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpXFxyXFxuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5sb2NrZWQgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5fdW5sb2NrKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9ib2R5ID0gZG9jdW1lbnQuYm9keVxcclxcbiAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WVxcclxcbiAgICB0aGlzLl91bmxvY2sgPSBkZWxheWVyKGZ1bmN0aW9uICgpIHtcXHJcXG4gICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gICAgfSwgTUlOX1dBSVQpXFxyXFxuICAgIGlmICh0aGlzLmdsb2JhbCkge1xcclxcbiAgICAgIGlmICghdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lcikge1xcclxcbiAgICAgICAgdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lciA9IHRydWVcXHJcXG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xcclxcbiAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xcclxcbiAgICAgICAgICBoaWRlICgpIHsgc2VsZi5oaWRlKCkgfSxcXHJcXG4gICAgICAgICAgc2hvdyAoKSB7IHNlbGYuc2hvdygpIH1cXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuJHJvb3QuJG9uKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICBpZiAodGhpcy5fZ2xvYmFsKSB7XFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpoaWRlJywgdGhpcy5fZ2xvYmFsLmhpZGUpXFxyXFxuICAgICAgZGVsZXRlIHRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXJcXHJcXG4gICAgfVxcclxcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc3Bpbm5lckFuaW1hdGlvbilcXHJcXG4gICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbkBrZXlmcmFtZXMgc3BpbiB7XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXHJcXG59XFxyXFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIE1JTl9XQUlUID0gNTAwOyAvLyBpbiBtc1xuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZml4ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGdsb2JhbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2l6ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdtZCcgfSxcblx0ICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcblx0ICAgICAgbG9ja2VkOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgc3Bpbm5lclNpemU6IGZ1bmN0aW9uIHNwaW5uZXJTaXplKCkge1xuXHQgICAgICByZXR1cm4gJ3NwaW5uZXItJyArICh0aGlzLnNpemUgPyB0aGlzLnNpemUgOiAnc20nKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpc1t2YWwgPyAnc2hvdycgOiAnaGlkZSddKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGhpZGU6IGZ1bmN0aW9uIGhpZGUoKSB7XG5cdCAgICAgIHZhciBkZWxheSA9IDA7XG5cdCAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyhvcHRpb25zKSB7XG5cdCAgICAgIGlmIChvcHRpb25zKSB7XG5cdCAgICAgICAgaWYgKG9wdGlvbnMudGV4dCkge1xuXHQgICAgICAgICAgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7XG5cdCAgICAgICAgICB0aGlzLnNpemUgPSBvcHRpb25zLnNpemU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChvcHRpb25zLmZpeGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgLy8gYmxvY2sgc2Nyb2xsaW5nIHdoZW4gc3Bpbm5lciBpcyBvblxuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuXHQgICAgICAvLyBhY3RpdmF0ZSBzcGlubmVyXG5cdCAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpO1xuXHQgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cdCAgICAgIHRoaXMubG9ja2VkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fdW5sb2NrKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5fYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WTtcblx0ICAgIHRoaXMuX3VubG9jayA9ICgwLCBfdXRpbHMuZGVsYXllcikoZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9IHRoaXMuX2JvZHlPdmVyZmxvdztcblx0ICAgIH0sIE1JTl9XQUlUKTtcblx0ICAgIGlmICh0aGlzLmdsb2JhbCkge1xuXHQgICAgICBpZiAoIXRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXIpIHtcblx0ICAgICAgICB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xuXHQgICAgICAgICAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcblx0ICAgICAgICAgICAgc2VsZi5oaWRlKCk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgICAgICAgc2VsZi5zaG93KCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6c2hvdycsIHRoaXMuX2dsb2JhbC5zaG93KTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9nbG9iYWwpIHtcblx0ICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpO1xuXHQgICAgICB0aGlzLiRyb290LiRvZmYoJ3NwaW5uZXI6OmhpZGUnLCB0aGlzLl9nbG9iYWwuaGlkZSk7XG5cdCAgICAgIGRlbGV0ZSB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyO1xuXHQgICAgfVxuXHQgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NwaW5uZXJBbmltYXRpb24pO1xuXHQgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3c7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5hY3RpdmUgfHwgX3ZtLmxvY2tlZCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiYWN0aXZlfHxsb2NrZWRcIlxuXHQgICAgfV0sXG5cdCAgICBjbGFzczogWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLCBfdm0uc3Bpbm5lclNpemUsIHtcblx0ICAgICAgJ3NwaW5uZXItZml4ZWQnOiBfdm0uZml4ZWRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci13cmFwcGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJzcGlubmVyLWNpcmNsZVwiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci10ZXh0XCJcblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSldKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LThiMjk4ZTcwXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTY2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFiLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0wOTg1ZTg3OFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtMDk4NWU4NzhcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBUYWIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTY3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGZhZGVpbjogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdmFyIGFjdGl2ZSA9ICF0aGlzLl90YWJzIHx8IHRoaXMuX3RhYnMuc2hvdyA9PT0gdGhpcztcblx0ICAgICAgdGhpcy5mYWRlaW4gPSBmYWxzZTtcblx0ICAgICAgaWYgKGFjdGl2ZSkge1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgX3RoaXMuZmFkZWluID0gdHJ1ZTtcblx0ICAgICAgICB9LCAwKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gYWN0aXZlO1xuXHQgICAgfSxcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3RhYnMudGFicy5pbmRleE9mKHRoaXMpO1xuXHQgICAgfSxcblx0ICAgIHRyYW5zaXRpb246IGZ1bmN0aW9uIHRyYW5zaXRpb24oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl90YWJzID8gdGhpcy5fdGFicy5lZmZlY3QgOiBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiID0gdHJ1ZTtcblx0ICAgIHZhciB0YWJzID0gdGhpcztcblx0ICAgIHdoaWxlICghdGhpcy5fdGFicyAmJiB0YWJzLiRwYXJlbnQpIHtcblx0ICAgICAgaWYgKHRhYnMuX2lzVGFiR3JvdXApIHtcblx0ICAgICAgICB0YWJzLnRhYnMucHVzaCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl90YWJHcm91cCA9IHRhYnM7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRhYnMuX2lzVGFicykge1xuXHQgICAgICAgIHRhYnMudGFicy5wdXNoKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3RhYnMgPSB0YWJzO1xuXHQgICAgICAgIGlmICghdGhpcy5fdGFiR3JvdXApIHRhYnMuaGVhZGVycy5wdXNoKHRoaXMpO1xuXHQgICAgICB9XG5cdCAgICAgIHRhYnMgPSB0YWJzLiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMuX3RhYnMpIHRocm93IEVycm9yKCd0YWIgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgaWYgKHRoaXMuX3RhYkdyb3VwKSB7XG5cdCAgICAgIHRoaXMuX3RhYkdyb3VwLnRhYnMgPSB0aGlzLl90YWJHcm91cC50YWJzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwgIT09IF90aGlzMjtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB0aGlzLl90YWJzLnRhYnMgPSB0aGlzLl90YWJzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbCAhPT0gX3RoaXMyO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl90YWJzKSB7XG5cdCAgICAgIGlmICh0aGlzLl90YWJzLmFjdGl2ZSA9PT0gdGhpcy5pbmRleCkge1xuXHQgICAgICAgIHRoaXMuX3RhYnMuaW5kZXggPSAwO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9pbmdyb3VwKSB7XG5cdCAgICAgICAgdmFyIGlkID0gdGhpcy4kcGFyZW50LnRhYnMuaW5kZXhPZih0aGlzKTtcblx0ICAgICAgICBpZiAofmlkKSB0aGlzLiRwYXJlbnQudGFicy5zcGxpY2UoaWQsIDEpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB2YXIgX2lkID0gdGhpcy5fdGFicy50YWJzLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIGlmICh+X2lkKSB0aGlzLl90YWJzLnRhYnMuc3BsaWNlKF9pZCwgMSk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwYW5lbFwiLFxuXHQgICAgY2xhc3M6IFsndGFiLXBhbmUnLCB7XG5cdCAgICAgICdhY3RpdmUgZmFkZSc6IF92bS5hY3RpdmUsXG5cdCAgICAgICdpbic6IF92bS5mYWRlaW5cblx0ICAgIH1dLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwidGFicGFuZWxcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMDk4NWU4NzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTcwKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTcyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Mylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUYWJHcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNTVmYWYzY2JcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTU1ZmFmM2NiXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFiR3JvdXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTcwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzEpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLnRhYi1jb250ZW50IC50YWItcGFuZSB7IGRpc3BsYXk6IG5vbmU7XFxufVxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVGFiR3JvdXAudnVlPzIyYWUxYzA4XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrQ0EseUJBQUEsY0FBQTtDQUFBO0FBQ0EsZ0NBQUEsZUFBQTtDQUFBXCIsXCJmaWxlXCI6XCJUYWJHcm91cC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPjxzcGFuPjxzbG90Pjwvc2xvdD48L3NwYW4+PC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgc2hvdzogZmFsc2UsXFxyXFxuICAgICAgdGFiczogW11cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGFjdGl2ZSAoKSB7IHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KSB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBibHVyICgpIHsgdGhpcy5zaG93ID0gZmFsc2UgfSxcXHJcXG4gICAgdG9nZ2xlICgpIHsgdGhpcy5zaG93ID0gIXRoaXMuc2hvdyB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlXFxyXFxuICAgIGlmICh0aGlzLiRwYXJlbnQpIHtcXHJcXG4gICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFxcXCd0IG5lc3QgdGFiLWdyb3Vwcy4nKVxcclxcbiAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJylcXHJcXG4gICAgfVxcclxcbiAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIHRoaXMuX3RhYnMuaGVhZGVycy5wdXNoKHRoaXMpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4udGFiLWNvbnRlbnQgLnRhYi1wYW5lIHsgZGlzcGxheTogbm9uZTsgfVxcclxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7IH1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTcyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHNob3c6IGZhbHNlLFxuXHQgICAgICB0YWJzOiBbXVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYWN0aXZlOiBmdW5jdGlvbiBhY3RpdmUoKSB7XG5cdCAgICAgIHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMuJHBhcmVudCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFwndCBuZXN0IHRhYi1ncm91cHMuJyk7XG5cdCAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50O1xuXHQgICAgdGhpcy5fdGFicy5oZWFkZXJzLnB1c2godGhpcyk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTczICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTU1ZmFmM2NiXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTc0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFicy52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzAxMDBkZGZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTcwMTAwZGRmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFicy52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzAxMDBkZGYhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1RhYnMudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi03MDEwMGRkZiEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vVGFicy52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1RhYnMudnVlPzQzMTdiOWFmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUEwRUE7RUFDQSxlQUFBO0NBQ0FcIixcImZpbGVcIjpcIlRhYnMudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgdGFicz5cXHJcXG4gICAgPHVsIDpjbGFzcz1cXFwibmF2U3R5bGVDbGFzc1xcXCIgcm9sZT1cXFwidGFibGlzdFxcXCI+XFxyXFxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVxcXCJoZWFkZXIgaW4gaGVhZGVyc1xcXCI+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwiaGVhZGVyLl9pc1RhYlxcXCIgOmNsYXNzPVxcXCJ7YWN0aXZlOmhlYWRlci5hY3RpdmUsIGRpc2FibGVkOmhlYWRlci5kaXNhYmxlZH1cXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QoaGVhZGVyKVxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+PGEgaHJlZj1cXFwiI1xcXCIgdi1odG1sPVxcXCJoZWFkZXIuaGVhZGVyXFxcIj48L2E+PC9zbG90PlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICAgIDxkcm9wZG93biB2LWlmPVxcXCJoZWFkZXIuX2lzVGFiR3JvdXBcXFwiIDp0ZXh0PVxcXCJoZWFkZXIuaGVhZGVyXFxcIiA6Y2xhc3M9XFxcInthY3RpdmU6aGVhZGVyLmFjdGl2ZX1cXFwiIDpkaXNhYmxlZD1cXFwiaGVhZGVyLmRpc2FibGVkXFxcIj5cXHJcXG4gICAgICAgICAgPGxpIHYtZm9yPVxcXCJ0YWIgaW4gaGVhZGVyLnRhYnNcXFwiIDpjbGFzcz1cXFwie2Rpc2FibGVkOnRhYi5kaXNhYmxlZH1cXFwiPjxhIGhyZWY9XFxcIiNcXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QodGFiKVxcXCI+e3t0YWIuaGVhZGVyfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDwvZHJvcGRvd24+XFxyXFxuICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPC91bD5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwidGFiLWNvbnRlbnRcXFwiPjxzbG90Pjwvc2xvdD48L2Rpdj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2NvZXJjZX0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgZHJvcGRvd24gZnJvbSAnLi9Ecm9wZG93bi52dWUnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgY29tcG9uZW50czoge1xcclxcbiAgICBkcm9wZG93blxcclxcbiAgfSxcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIC8vIGVmZmVjdDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2ZhZGVpbid9LFxcclxcbiAgICBqdXN0aWZpZWQ6IGZhbHNlLFxcclxcbiAgICBuYXZTdHlsZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICB2YXIgaW5kZXggPSB0aGlzLnZhbHVlIHx8IDBcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBpbmRleCxcXHJcXG4gICAgICBoZWFkZXJzOiBbXSxcXHJcXG4gICAgICB0YWJzOiBbXVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaW5kZXggKHZhbCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2FjdGl2ZScsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHRoaXMuaW5kZXggPSB2YWxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIG5hdlN0eWxlQ2xhc3MgKCkge1xcclxcbiAgICAgIHJldHVybiBbXFxyXFxuICAgICAgICAnbmF2JyxcXHJcXG4gICAgICAgIH5bJ3BpbGxzJywgJ3N0YWNrZWQnXS5pbmRleE9mKHRoaXMubmF2U3R5bGUpID8gJ25hdi0nICsgdGhpcy5uYXZTdHlsZSA6ICduYXYtdGFicycsXFxyXFxuICAgICAgICB7XFxyXFxuICAgICAgICAgICduYXYtanVzdGlmaWVkJzogY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxcclxcbiAgICAgICAgICAnbmF2LXBpbGxzJzogdGhpcy5uYXZTdHlsZSA9PT0gJ3N0YWNrZWQnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgXVxcclxcbiAgICB9LFxcclxcbiAgICBzaG93ICgpIHsgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF0gfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgc2VsZWN0ICh0YWIpIHtcXHJcXG4gICAgICBpZiAoIXRhYi5kaXNhYmxlZCkge1xcclxcbiAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMudGFicy5pbmRleE9mKHRhYilcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5faXNUYWJzID0gdHJ1ZVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcclxcbn1cXHJcXG48L3N0eWxlPlwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTc3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdHZhciBfRHJvcGRvd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNSk7XG5cdFxuXHR2YXIgX0Ryb3Bkb3duMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Ryb3Bkb3duKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGNvbXBvbmVudHM6IHtcblx0ICAgIGRyb3Bkb3duOiBfRHJvcGRvd24yLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICAvLyBlZmZlY3Q6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdmYWRlaW4nfSxcblx0ICAgIGp1c3RpZmllZDogZmFsc2UsXG5cdCAgICBuYXZTdHlsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIGluZGV4ID0gdGhpcy52YWx1ZSB8fCAwO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaW5kZXg6IGluZGV4LFxuXHQgICAgICBoZWFkZXJzOiBbXSxcblx0ICAgICAgdGFiczogW11cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCh2YWwpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnYWN0aXZlJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy5pbmRleCA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBuYXZTdHlsZUNsYXNzOiBmdW5jdGlvbiBuYXZTdHlsZUNsYXNzKCkge1xuXHQgICAgICByZXR1cm4gWyduYXYnLCB+WydwaWxscycsICdzdGFja2VkJ10uaW5kZXhPZih0aGlzLm5hdlN0eWxlKSA/ICduYXYtJyArIHRoaXMubmF2U3R5bGUgOiAnbmF2LXRhYnMnLCB7XG5cdCAgICAgICAgJ25hdi1qdXN0aWZpZWQnOiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxuXHQgICAgICAgICduYXYtcGlsbHMnOiB0aGlzLm5hdlN0eWxlID09PSAnc3RhY2tlZCdcblx0ICAgICAgfV07XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF07XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdCh0YWIpIHtcblx0ICAgICAgaWYgKCF0YWIuZGlzYWJsZWQpIHtcblx0ICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy50YWJzLmluZGV4T2YodGFiKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFicyA9IHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTc4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidGFic1wiOiBcIlwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygndWwnLCB7XG5cdCAgICBjbGFzczogX3ZtLm5hdlN0eWxlQ2xhc3MsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJ0YWJsaXN0XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9sKChfdm0uaGVhZGVycyksIGZ1bmN0aW9uKGhlYWRlcikge1xuXHQgICAgcmV0dXJuIFsoaGVhZGVyLl9pc1RhYikgPyBfdm0uX2MoJ2xpJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZSwgZGlzYWJsZWQ6IGhlYWRlci5kaXNhYmxlZFxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICAgIF92bS5zZWxlY3QoaGVhZGVyKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICB9LFxuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhoZWFkZXIuaGVhZGVyKVxuXHQgICAgICB9XG5cdCAgICB9KV0pXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKGhlYWRlci5faXNUYWJHcm91cCkgPyBfdm0uX2MoJ2Ryb3Bkb3duJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZVxuXHQgICAgICB9LFxuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwidGV4dFwiOiBoZWFkZXIuaGVhZGVyLFxuXHQgICAgICAgIFwiZGlzYWJsZWRcIjogaGVhZGVyLmRpc2FibGVkXG5cdCAgICAgIH1cblx0ICAgIH0sIF92bS5fbCgoaGVhZGVyLnRhYnMpLCBmdW5jdGlvbih0YWIpIHtcblx0ICAgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAgIGRpc2FibGVkOiB0YWIuZGlzYWJsZWRcblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX2MoJ2EnLCB7XG5cdCAgICAgICAgYXR0cnM6IHtcblx0ICAgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgb246IHtcblx0ICAgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICBfdm0uc2VsZWN0KHRhYilcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX3YoX3ZtLl9zKHRhYi5oZWFkZXIpKV0pXSlcblx0ICAgIH0pKSA6IF92bS5fZSgpXVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwidGFiLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03MDEwMGRkZlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE3OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODApXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTgxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvZ2dsZUJ1dHRvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtZjAzNGE1ZjJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWYwMzRhNWYyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVG9nZ2xlQnV0dG9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE4MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGRpc2FibGVkOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGZhbHNlVHlwZTogeyBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBuYW1lOiBudWxsLFxuXHQgICAgcmVhZG9ubHk6IHsgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHJ1ZVR5cGU6IHsgZGVmYXVsdDogJ3ByaW1hcnknIH0sXG5cdCAgICB2YWx1ZTogZmFsc2Vcblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBhY3RpdmU6IF91dGlscy5jb2VyY2UuYm9vbGVhbih0aGlzLnZhbHVlKSxcblx0ICAgICAgdHlwZXM6IHtcblx0ICAgICAgICBkYW5nZXI6ICdidG4tZGFuZ2VyJyxcblx0ICAgICAgICBpbmZvOiAnYnRuLWluZm8nLFxuXHQgICAgICAgIHByaW1hcnk6ICdidG4tcHJpbWFyeScsXG5cdCAgICAgICAgc3VjY2VzczogJ2J0bi1zdWNjZXNzJyxcblx0ICAgICAgICB3YXJuaW5nOiAnYnRuLXdhcm5pbmcnXG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZWQnLCB2YWwpO1xuXHQgICAgICAgIHRoaXMuJGVtaXQodmFsID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJyk7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuYWN0aXZlID0gX3V0aWxzLmNvZXJjZS5ib29sZWFuKHRoaXMudmFsdWUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYm9vbERpc2FibGVkOiBmdW5jdGlvbiBib29sRGlzYWJsZWQoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5kaXNhYmxlZCk7XG5cdCAgICB9LFxuXHQgICAgYm9vbFJlYWRvbmx5OiBmdW5jdGlvbiBib29sUmVhZG9ubHkoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5yZWFkb25seSk7XG5cdCAgICB9LFxuXHQgICAgdHlwZTogZnVuY3Rpb24gdHlwZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZXNbdGhpcy52YWx1ZSA/IHRoaXMudHJ1ZVR5cGUgOiB0aGlzLmZhbHNlVHlwZV0gfHwgJ2J0bi1kZWZhdWx0Jztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAodGhpcy5ib29sRGlzYWJsZWQgfHwgdGhpcy5ib29sUmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5hY3RpdmUgPSAhdGhpcy5hY3RpdmU7XG5cdCAgICB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTgxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2EnLCB7XG5cdCAgICBjbGFzczogWydidG4nLCBfdm0udHlwZSwge1xuXHQgICAgICByZWFkb25seTogX3ZtLmJvb2xSZWFkb25seVxuXHQgICAgfV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImhyZWZcIjogXCJqYXZhc2NyaXB0OnZvaWQoMClcIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uYm9vbERpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2dseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsdWUgPyAnb2snIDogJ3JlbW92ZScpXVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLm5hbWUpID8gX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImhpZGRlblwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5hY3RpdmUgPyAxIDogMFxuXHQgICAgfVxuXHQgIH0pIDogX3ZtLl9lKCldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1mMDM0YTVmMlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE4MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxODMpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODUpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTg2KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvb2x0aXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTQ4ZmI1MWIyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi00OGZiNTFiMlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFRvb2x0aXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTgzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODQpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQ4ZmI1MWIyIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Ub29sdGlwLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNDhmYjUxYjIhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1Rvb2x0aXAudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXG59XFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXG59XFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXG59XFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcbjAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG59XFxuQGtleWZyYW1lcyBmYWRlaW4tb3V0IHtcXG4wJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVG9vbHRpcC52dWU/MzdkMTgzZWNcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJCQTs7OztFQUlBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtBQUNBO0lBQ0EsV0FBQTtDQUNBO0NBQ0FcIixcImZpbGVcIjpcIlRvb2x0aXAudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxzcGFuIHJlZj1cXFwidHJpZ2dlclxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPHRyYW5zaXRpb24gOm5hbWU9XFxcImVmZmVjdFxcXCI+XFxyXFxuICAgICAgPGRpdiByZWY9XFxcInBvcG92ZXJcXFwiIHYtaWY9XFxcInNob3dcXFwiIDpjbGFzcz1cXFwiWyd0b29sdGlwJyxwbGFjZW1lbnRdXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInRvb2x0aXAtYXJyb3dcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwidG9vbHRpcC1pbm5lclxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImNvbnRlbnRcXFwiPjxkaXYgdi1odG1sPVxcXCJjb250ZW50XFxcIj48L2Rpdj48L3Nsb3Q+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC90cmFuc2l0aW9uPlxcclxcbiAgPC9zcGFuPlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQgUG9wb3Zlck1peGluIGZyb20gJy4vdXRpbHMvcG9wb3Zlck1peGlucy5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBtaXhpbnM6IFtQb3BvdmVyTWl4aW5dLFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgZWZmZWN0OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnfSxcXHJcXG4gICAgdHJpZ2dlcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJ31cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXHJcXG59XFxyXFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXHJcXG59XFxyXFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIGZhZGVpbi1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAuOTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTg1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGlucyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQzKTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3BvdmVyTWl4aW5zKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgbWl4aW5zOiBbX3BvcG92ZXJNaXhpbnMyLmRlZmF1bHRdLFxuXHQgIHByb3BzOiB7XG5cdCAgICBlZmZlY3Q6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnIH0sXG5cdCAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJyB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTg2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICByZWY6IFwidHJpZ2dlclwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0uZWZmZWN0XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwb3BvdmVyXCIsXG5cdCAgICBjbGFzczogWyd0b29sdGlwJywgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWFycm93XCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWlubmVyXCJcblx0ICB9LCBbX3ZtLl90KFwiY29udGVudFwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcImlubmVySFRNTFwiOiBfdm0uX3MoX3ZtLmNvbnRlbnQpXG5cdCAgICB9XG5cdCAgfSldKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDhmYjUxYjJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxODcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTg4KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwNilcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUeXBlYWhlYWQudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTViNWY1ZTk0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi01YjVmNWU5NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFR5cGVhaGVhZC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxODggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4OSk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNWI1ZjVlOTQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1R5cGVhaGVhZC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTViNWY1ZTk0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UeXBlYWhlYWQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9UeXBlYWhlYWQudnVlPzZhMDM5OTdmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFvSUE7RUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJUeXBlYWhlYWQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgc3R5bGU9XFxcInBvc2l0aW9uOiByZWxhdGl2ZVxcXCIgOmNsYXNzPVxcXCJ7J29wZW4nOnNob3dEcm9wZG93bn1cXFwiPlxcclxcbiAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiXFxyXFxuICAgICAgdi1tb2RlbD1cXFwidmFsXFxcIlxcclxcbiAgICAgIDpwbGFjZWhvbGRlcj1cXFwicGxhY2Vob2xkZXJcXFwiXFxyXFxuICAgICAgQGJsdXI9XFxcInNob3dEcm9wZG93biA9IGZhbHNlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmRvd249XFxcImRvd25cXFwiXFxyXFxuICAgICAgQGtleWRvd24uZW50ZXI9IFxcXCJoaXRcXFwiXFxyXFxuICAgICAgQGtleWRvd24uZXNjPVxcXCJyZXNldFxcXCJcXHJcXG4gICAgICBAa2V5ZG93bi51cD1cXFwidXBcXFwiXFxyXFxuICAgIC8+XFxyXFxuICAgIDx1bCBjbGFzcz1cXFwiZHJvcGRvd24tbWVudVxcXCIgcmVmPVxcXCJkcm9wZG93blxcXCI+XFxyXFxuICAgICAgPGxpIHYtZm9yPVxcXCIoaXRlbSwgaSkgaW4gaXRlbXNcXFwiIDpjbGFzcz1cXFwieydhY3RpdmUnOiBpc0FjdGl2ZShpKX1cXFwiPlxcclxcbiAgICAgICAgPGEgQG1vdXNlZG93bi5wcmV2ZW50PVxcXCJoaXRcXFwiIEBtb3VzZW1vdmU9XFxcInNldEFjdGl2ZShpKVxcXCI+XFxyXFxuICAgICAgICAgIDxjb21wb25lbnQgOmlzPVxcXCJ0bXBsXFxcIiA6aXRlbT1cXFwiaXRlbVxcXCI+PC9jb21wb25lbnQ+XFxyXFxuICAgICAgICA8L2E+XFxyXFxuICAgICAgPC9saT5cXHJcXG4gICAgPC91bD5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2RlbGF5ZXIsIGdldEpTT059IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxudmFyIERFTEFZID0gMzAwXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgYXN5bmM6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBkYXRhOiB7dHlwZTogQXJyYXl9LFxcclxcbiAgICBkZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogREVMQVl9LFxcclxcbiAgICBhc3luY0tleToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxpbWl0OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiA4fSxcXHJcXG4gICAgbWF0Y2hDYXNlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBtYXRjaFN0YXJ0OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBvbkhpdDoge1xcclxcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxcclxcbiAgICAgIGRlZmF1bHQgKGl0ZW0pIHtcXHJcXG4gICAgICAgIHRoaXMucmVzZXQoKVxcclxcbiAgICAgICAgdGhpcy52YWx1ZSA9IGl0ZW1cXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHBsYWNlaG9sZGVyOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgdGVtcGxhdGU6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICB2YWx1ZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgc2hvd0Ryb3Bkb3duOiBmYWxzZSxcXHJcXG4gICAgICBub1Jlc3VsdHM6IHRydWUsXFxyXFxuICAgICAgY3VycmVudDogMCxcXHJcXG4gICAgICBpdGVtczogW10sXFxyXFxuICAgICAgdmFsOiAnJ1xcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgdGVtcGxhdGVIdG1sICgpIHsgcmV0dXJuIHR5cGVvZiB0aGlzLnRlbXBsYXRlID09PSAnc3RyaW5nJyA/ICc8c3Bhbj4nICsgdGhpcy50ZW1wbGF0ZSArICc8L3NwYW4+JyA6IG51bGwgfSxcXHJcXG4gICAgdG1wbCAoKSB7IHJldHVybiB0aGlzLl90bXBsfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuX3VwZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIHNldEl0ZW1zIChkYXRhKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcXHJcXG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmFzeW5jS2V5ID8gZGF0YVt0aGlzLmFzeW5jS2V5XSA6IGRhdGFcXHJcXG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHRoaXMubGltaXQpXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIHRoaXMuaXRlbXMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKHZhbHVlID0+IHtcXHJcXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHsgcmV0dXJuIHRydWUgfVxcclxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMubWF0Y2hDYXNlID8gdmFsdWUgOiB2YWx1ZS50b0xvd2VyQ2FzZSgpXFxyXFxuICAgICAgICAgIHZhciBxdWVyeSA9IHRoaXMubWF0Y2hDYXNlID8gdGhpcy52YWwgOiB0aGlzLnZhbC50b0xvd2VyQ2FzZSgpXFxyXFxuICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoU3RhcnQgPyB2YWx1ZS5pbmRleE9mKHF1ZXJ5KSA9PT0gMCA6IHZhbHVlLmluZGV4T2YocXVlcnkpICE9PSAtMVxcclxcbiAgICAgICAgfSkuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICB9XFxyXFxuICAgICAgdGhpcy5zaG93RHJvcGRvd24gPSB0aGlzLml0ZW1zLmxlbmd0aCA+IDBcXHJcXG4gICAgfSxcXHJcXG4gICAgcmVzZXQgKCkge1xcclxcbiAgICAgIHRoaXMuaXRlbXMgPSBbXVxcclxcbiAgICAgIHRoaXMudmFsID0gJydcXHJcXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgc2V0QWN0aXZlIChpbmRleCkge1xcclxcbiAgICAgIHRoaXMuY3VycmVudCA9IGluZGV4XFxyXFxuICAgIH0sXFxyXFxuICAgIGlzQWN0aXZlIChpbmRleCkge1xcclxcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQgPT09IGluZGV4XFxyXFxuICAgIH0sXFxyXFxuICAgIGhpdCAoZSkge1xcclxcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxcclxcbiAgICAgIHRoaXMub25IaXQodGhpcy5pdGVtc1t0aGlzLmN1cnJlbnRdLCB0aGlzKVxcclxcbiAgICB9LFxcclxcbiAgICB1cCAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuY3VycmVudCA+IDApIHRoaXMuY3VycmVudC0tXFxyXFxuICAgIH0sXFxyXFxuICAgIGRvd24gKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmN1cnJlbnQgPCB0aGlzLml0ZW1zLmxlbmd0aCAtIDEpIHRoaXMuY3VycmVudCsrXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHRoaXMuX3RtcGwgPSB7XFxyXFxuICAgICAgdGVtcGxhdGU6IHRoaXMudGVtcGxhdGVIdG1sIHx8ICc8c3Ryb25nIHYtaHRtbD1cXFwiaXRlbVxcXCI+PC9zdHJvbmc+JyxcXHJcXG4gICAgICBwcm9wczoge1xcclxcbiAgICAgICAgaXRlbToge2RlZmF1bHQ6IG51bGx9XFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICAgIHRoaXMuX3VwZGF0ZSA9IGRlbGF5ZXIoZnVuY3Rpb24gKCkge1xcclxcbiAgICAgIGlmICghdGhpcy52YWwpIHtcXHJcXG4gICAgICAgIHRoaXMucmVzZXQoKVxcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfVxcclxcbiAgICAgIGlmICh0aGlzLmFzeW5jKSB7XFxyXFxuICAgICAgICBnZXRKU09OKHRoaXMuYXN5bmMgKyB0aGlzLnZhbCkudGhlbihkYXRhID0+IHtcXHJcXG4gICAgICAgICAgdGhpcy5zZXRJdGVtcyhkYXRhKVxcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YSkge1xcclxcbiAgICAgICAgdGhpcy5zZXRJdGVtcyh0aGlzLmRhdGEpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LCAnZGVsYXknLCBERUxBWSlcXHJcXG4gICAgdGhpcy5fdXBkYXRlKClcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuPC9zdHlsZT5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE5MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3R5cGVvZjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5MSk7XG5cdFxuXHR2YXIgX3R5cGVvZjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90eXBlb2YyKTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHR2YXIgREVMQVkgPSAzMDA7IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGFzeW5jOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgZGF0YTogeyB0eXBlOiBBcnJheSB9LFxuXHQgICAgZGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBERUxBWSB9LFxuXHQgICAgYXN5bmNLZXk6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBsaW1pdDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDggfSxcblx0ICAgIG1hdGNoQ2FzZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbWF0Y2hTdGFydDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgb25IaXQ6IHtcblx0ICAgICAgdHlwZTogRnVuY3Rpb24sXG5cdCAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KGl0ZW0pIHtcblx0ICAgICAgICB0aGlzLnJlc2V0KCk7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IGl0ZW07XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHRlbXBsYXRlOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgc2hvd0Ryb3Bkb3duOiBmYWxzZSxcblx0ICAgICAgbm9SZXN1bHRzOiB0cnVlLFxuXHQgICAgICBjdXJyZW50OiAwLFxuXHQgICAgICBpdGVtczogW10sXG5cdCAgICAgIHZhbDogJydcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHRlbXBsYXRlSHRtbDogZnVuY3Rpb24gdGVtcGxhdGVIdG1sKCkge1xuXHQgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudGVtcGxhdGUgPT09ICdzdHJpbmcnID8gJzxzcGFuPicgKyB0aGlzLnRlbXBsYXRlICsgJzwvc3Bhbj4nIDogbnVsbDtcblx0ICAgIH0sXG5cdCAgICB0bXBsOiBmdW5jdGlvbiB0bXBsKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fdG1wbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgaWYgKF92YWwgIT09IG9sZCkgdGhpcy5fdXBkYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZXRJdGVtczogZnVuY3Rpb24gc2V0SXRlbXMoZGF0YSkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcblx0ICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5hc3luY0tleSA/IGRhdGFbdGhpcy5hc3luY0tleV0gOiBkYXRhO1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgICAgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkodmFsdWUpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB2YWx1ZSA9IF90aGlzLm1hdGNoQ2FzZSA/IHZhbHVlIDogdmFsdWUudG9Mb3dlckNhc2UoKTtcblx0ICAgICAgICAgIHZhciBxdWVyeSA9IF90aGlzLm1hdGNoQ2FzZSA/IF90aGlzLnZhbCA6IF90aGlzLnZhbC50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzLm1hdGNoU3RhcnQgPyB2YWx1ZS5pbmRleE9mKHF1ZXJ5KSA9PT0gMCA6IHZhbHVlLmluZGV4T2YocXVlcnkpICE9PSAtMTtcblx0ICAgICAgICB9KS5zbGljZSgwLCB0aGlzLmxpbWl0KTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnNob3dEcm9wZG93biA9IHRoaXMuaXRlbXMubGVuZ3RoID4gMDtcblx0ICAgIH0sXG5cdCAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG5cdCAgICAgIHRoaXMuaXRlbXMgPSBbXTtcblx0ICAgICAgdGhpcy52YWwgPSAnJztcblx0ICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2V0QWN0aXZlOiBmdW5jdGlvbiBzZXRBY3RpdmUoaW5kZXgpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50ID0gaW5kZXg7XG5cdCAgICB9LFxuXHQgICAgaXNBY3RpdmU6IGZ1bmN0aW9uIGlzQWN0aXZlKGluZGV4KSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQgPT09IGluZGV4O1xuXHQgICAgfSxcblx0ICAgIGhpdDogZnVuY3Rpb24gaGl0KGUpIHtcblx0ICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLm9uSGl0KHRoaXMuaXRlbXNbdGhpcy5jdXJyZW50XSwgdGhpcyk7XG5cdCAgICB9LFxuXHQgICAgdXA6IGZ1bmN0aW9uIHVwKCkge1xuXHQgICAgICBpZiAodGhpcy5jdXJyZW50ID4gMCkgdGhpcy5jdXJyZW50LS07XG5cdCAgICB9LFxuXHQgICAgZG93bjogZnVuY3Rpb24gZG93bigpIHtcblx0ICAgICAgaWYgKHRoaXMuY3VycmVudCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkgdGhpcy5jdXJyZW50Kys7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgdGhpcy5fdG1wbCA9IHtcblx0ICAgICAgdGVtcGxhdGU6IHRoaXMudGVtcGxhdGVIdG1sIHx8ICc8c3Ryb25nIHYtaHRtbD1cIml0ZW1cIj48L3N0cm9uZz4nLFxuXHQgICAgICBwcm9wczoge1xuXHQgICAgICAgIGl0ZW06IHsgZGVmYXVsdDogbnVsbCB9XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICB0aGlzLl91cGRhdGUgPSAoMCwgX3V0aWxzLmRlbGF5ZXIpKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoIXRoaXMudmFsKSB7XG5cdCAgICAgICAgdGhpcy5yZXNldCgpO1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5hc3luYykge1xuXHQgICAgICAgICgwLCBfdXRpbHMuZ2V0SlNPTikodGhpcy5hc3luYyArIHRoaXMudmFsKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICBfdGhpczIuc2V0SXRlbXMoZGF0YSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhKSB7XG5cdCAgICAgICAgdGhpcy5zZXRJdGVtcyh0aGlzLmRhdGEpO1xuXHQgICAgICB9XG5cdCAgICB9LCAnZGVsYXknLCBERUxBWSk7XG5cdCAgICB0aGlzLl91cGRhdGUoKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0XG5cdHZhciBfaXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcblx0XG5cdHZhciBfaXRlcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXRlcmF0b3IpO1xuXHRcblx0dmFyIF9zeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5Mik7XG5cdFxuXHR2YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXHRcblx0dmFyIF90eXBlb2YgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBfaXRlcmF0b3IyLmRlZmF1bHQgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBfc3ltYm9sMi5kZWZhdWx0ICYmIG9iaiAhPT0gX3N5bWJvbDIuZGVmYXVsdC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YoX2l0ZXJhdG9yMi5kZWZhdWx0KSA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcblx0ICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKG9iaik7XG5cdH0gOiBmdW5jdGlvbiAob2JqKSB7XG5cdCAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTkyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oMTkzKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogMTkzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE5NCk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMjAzKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMDQpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIwNSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KS5TeW1ib2w7XG5cbi8qKiovIH0sXG4vKiAxOTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0Ly8gRUNNQVNjcmlwdCA2IHN5bWJvbHMgc2hpbVxuXHR2YXIgZ2xvYmFsICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBoYXMgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBERVNDUklQVE9SUyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpXG5cdCAgLCAkZXhwb3J0ICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNSlcblx0ICAsIHJlZGVmaW5lICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOClcblx0ICAsIE1FVEEgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTUpLktFWVxuXHQgICwgJGZhaWxzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KVxuXHQgICwgc2hhcmVkICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzKVxuXHQgICwgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KVxuXHQgICwgdWlkICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KVxuXHQgICwgd2tzICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KVxuXHQgICwgd2tzRXh0ICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1KVxuXHQgICwgd2tzRGVmaW5lICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5Nilcblx0ICAsIGtleU9mICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTcpXG5cdCAgLCBlbnVtS2V5cyAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk4KVxuXHQgICwgaXNBcnJheSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMSlcblx0ICAsIGFuT2JqZWN0ICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcblx0ICAsIHRvSU9iamVjdCAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIHRvUHJpbWl0aXZlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0ICAsIGNyZWF0ZURlc2MgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSlcblx0ICAsIF9jcmVhdGUgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMilcblx0ICAsIGdPUE5FeHQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MClcblx0ICAsICRHT1BEICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDIpXG5cdCAgLCAkRFAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG5cdCAgLCAka2V5cyAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpXG5cdCAgLCBnT1BEICAgICAgICAgICA9ICRHT1BELmZcblx0ICAsIGRQICAgICAgICAgICAgID0gJERQLmZcblx0ICAsIGdPUE4gICAgICAgICAgID0gZ09QTkV4dC5mXG5cdCAgLCAkU3ltYm9sICAgICAgICA9IGdsb2JhbC5TeW1ib2xcblx0ICAsICRKU09OICAgICAgICAgID0gZ2xvYmFsLkpTT05cblx0ICAsIF9zdHJpbmdpZnkgICAgID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5XG5cdCAgLCBQUk9UT1RZUEUgICAgICA9ICdwcm90b3R5cGUnXG5cdCAgLCBISURERU4gICAgICAgICA9IHdrcygnX2hpZGRlbicpXG5cdCAgLCBUT19QUklNSVRJVkUgICA9IHdrcygndG9QcmltaXRpdmUnKVxuXHQgICwgaXNFbnVtICAgICAgICAgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZVxuXHQgICwgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpXG5cdCAgLCBBbGxTeW1ib2xzICAgICA9IHNoYXJlZCgnc3ltYm9scycpXG5cdCAgLCBPUFN5bWJvbHMgICAgICA9IHNoYXJlZCgnb3Atc3ltYm9scycpXG5cdCAgLCBPYmplY3RQcm90byAgICA9IE9iamVjdFtQUk9UT1RZUEVdXG5cdCAgLCBVU0VfTkFUSVZFICAgICA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbidcblx0ICAsIFFPYmplY3QgICAgICAgID0gZ2xvYmFsLlFPYmplY3Q7XG5cdC8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xuXHR2YXIgc2V0dGVyID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblx0XG5cdC8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xuXHR2YXIgc2V0U3ltYm9sRGVzYyA9IERFU0NSSVBUT1JTICYmICRmYWlscyhmdW5jdGlvbigpe1xuXHQgIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcblx0ICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIGRQKHRoaXMsICdhJywge3ZhbHVlOiA3fSkuYTsgfVxuXHQgIH0pKS5hICE9IDc7XG5cdH0pID8gZnVuY3Rpb24oaXQsIGtleSwgRCl7XG5cdCAgdmFyIHByb3RvRGVzYyA9IGdPUEQoT2JqZWN0UHJvdG8sIGtleSk7XG5cdCAgaWYocHJvdG9EZXNjKWRlbGV0ZSBPYmplY3RQcm90b1trZXldO1xuXHQgIGRQKGl0LCBrZXksIEQpO1xuXHQgIGlmKHByb3RvRGVzYyAmJiBpdCAhPT0gT2JqZWN0UHJvdG8pZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcblx0fSA6IGRQO1xuXHRcblx0dmFyIHdyYXAgPSBmdW5jdGlvbih0YWcpe1xuXHQgIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG5cdCAgc3ltLl9rID0gdGFnO1xuXHQgIHJldHVybiBzeW07XG5cdH07XG5cdFxuXHR2YXIgaXNTeW1ib2wgPSBVU0VfTkFUSVZFICYmIHR5cGVvZiAkU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnID8gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG5cdH0gOiBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcblx0fTtcblx0XG5cdHZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKXtcblx0ICBpZihpdCA9PT0gT2JqZWN0UHJvdG8pJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKTtcblx0ICBhbk9iamVjdChpdCk7XG5cdCAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcblx0ICBhbk9iamVjdChEKTtcblx0ICBpZihoYXMoQWxsU3ltYm9scywga2V5KSl7XG5cdCAgICBpZighRC5lbnVtZXJhYmxlKXtcblx0ICAgICAgaWYoIWhhcyhpdCwgSElEREVOKSlkUChpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG5cdCAgICAgIGl0W0hJRERFTl1ba2V5XSA9IHRydWU7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBpZihoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKWl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuXHQgICAgICBEID0gX2NyZWF0ZShELCB7ZW51bWVyYWJsZTogY3JlYXRlRGVzYygwLCBmYWxzZSl9KTtcblx0ICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG5cdCAgfSByZXR1cm4gZFAoaXQsIGtleSwgRCk7XG5cdH07XG5cdHZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApe1xuXHQgIGFuT2JqZWN0KGl0KTtcblx0ICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpXG5cdCAgICAsIGkgICAgPSAwXG5cdCAgICAsIGwgPSBrZXlzLmxlbmd0aFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobCA+IGkpJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG5cdCAgcmV0dXJuIGl0O1xuXHR9O1xuXHR2YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCl7XG5cdCAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xuXHR9O1xuXHR2YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KXtcblx0ICB2YXIgRSA9IGlzRW51bS5jYWxsKHRoaXMsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpO1xuXHQgIGlmKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKXJldHVybiBmYWxzZTtcblx0ICByZXR1cm4gRSB8fCAhaGFzKHRoaXMsIGtleSkgfHwgIWhhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IGhhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtrZXldID8gRSA6IHRydWU7XG5cdH07XG5cdHZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuXHQgIGl0ICA9IHRvSU9iamVjdChpdCk7XG5cdCAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcblx0ICBpZihpdCA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpcmV0dXJuO1xuXHQgIHZhciBEID0gZ09QRChpdCwga2V5KTtcblx0ICBpZihEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpRC5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0ICByZXR1cm4gRDtcblx0fTtcblx0dmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG5cdCAgdmFyIG5hbWVzICA9IGdPUE4odG9JT2JqZWN0KGl0KSlcblx0ICAgICwgcmVzdWx0ID0gW11cblx0ICAgICwgaSAgICAgID0gMFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSl7XG5cdCAgICBpZighaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIGtleSAhPSBISURERU4gJiYga2V5ICE9IE1FVEEpcmVzdWx0LnB1c2goa2V5KTtcblx0ICB9IHJldHVybiByZXN1bHQ7XG5cdH07XG5cdHZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KXtcblx0ICB2YXIgSVNfT1AgID0gaXQgPT09IE9iamVjdFByb3RvXG5cdCAgICAsIG5hbWVzICA9IGdPUE4oSVNfT1AgPyBPUFN5bWJvbHMgOiB0b0lPYmplY3QoaXQpKVxuXHQgICAgLCByZXN1bHQgPSBbXVxuXHQgICAgLCBpICAgICAgPSAwXG5cdCAgICAsIGtleTtcblx0ICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKXtcblx0ICAgIGlmKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAoSVNfT1AgPyBoYXMoT2JqZWN0UHJvdG8sIGtleSkgOiB0cnVlKSlyZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuXHQgIH0gcmV0dXJuIHJlc3VsdDtcblx0fTtcblx0XG5cdC8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuXHRpZighVVNFX05BVElWRSl7XG5cdCAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpe1xuXHQgICAgaWYodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG5cdCAgICB2YXIgdGFnID0gdWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcblx0ICAgIHZhciAkc2V0ID0gZnVuY3Rpb24odmFsdWUpe1xuXHQgICAgICBpZih0aGlzID09PSBPYmplY3RQcm90bykkc2V0LmNhbGwoT1BTeW1ib2xzLCB2YWx1ZSk7XG5cdCAgICAgIGlmKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcblx0ICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcblx0ICAgIH07XG5cdCAgICBpZihERVNDUklQVE9SUyAmJiBzZXR0ZXIpc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7Y29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6ICRzZXR9KTtcblx0ICAgIHJldHVybiB3cmFwKHRhZyk7XG5cdCAgfTtcblx0ICByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG5cdCAgICByZXR1cm4gdGhpcy5faztcblx0ICB9KTtcblx0XG5cdCAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdCAgJERQLmYgICA9ICRkZWZpbmVQcm9wZXJ0eTtcblx0ICBfX3dlYnBhY2tfcmVxdWlyZV9fKDYxKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG5cdCAgX193ZWJwYWNrX3JlcXVpcmVfXygyMDApLmYgID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXHQgIF9fd2VicGFja19yZXF1aXJlX18oMTk5KS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblx0XG5cdCAgaWYoREVTQ1JJUFRPUlMgJiYgIV9fd2VicGFja19yZXF1aXJlX18oMjcpKXtcblx0ICAgIHJlZGVmaW5lKE9iamVjdFByb3RvLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHRydWUpO1xuXHQgIH1cblx0XG5cdCAgd2tzRXh0LmYgPSBmdW5jdGlvbihuYW1lKXtcblx0ICAgIHJldHVybiB3cmFwKHdrcyhuYW1lKSk7XG5cdCAgfVxuXHR9XG5cdFxuXHQkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7U3ltYm9sOiAkU3ltYm9sfSk7XG5cdFxuXHRmb3IodmFyIHN5bWJvbHMgPSAoXG5cdCAgLy8gMTkuNC4yLjIsIDE5LjQuMi4zLCAxOS40LjIuNCwgMTkuNC4yLjYsIDE5LjQuMi44LCAxOS40LjIuOSwgMTkuNC4yLjEwLCAxOS40LjIuMTEsIDE5LjQuMi4xMiwgMTkuNC4yLjEzLCAxOS40LjIuMTRcblx0ICAnaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLHNwZWNpZXMsc3BsaXQsdG9QcmltaXRpdmUsdG9TdHJpbmdUYWcsdW5zY29wYWJsZXMnXG5cdCkuc3BsaXQoJywnKSwgaSA9IDA7IHN5bWJvbHMubGVuZ3RoID4gaTsgKXdrcyhzeW1ib2xzW2krK10pO1xuXHRcblx0Zm9yKHZhciBzeW1ib2xzID0gJGtleXMod2tzLnN0b3JlKSwgaSA9IDA7IHN5bWJvbHMubGVuZ3RoID4gaTsgKXdrc0RlZmluZShzeW1ib2xzW2krK10pO1xuXHRcblx0JGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ1N5bWJvbCcsIHtcblx0ICAvLyAxOS40LjIuMSBTeW1ib2wuZm9yKGtleSlcblx0ICAnZm9yJzogZnVuY3Rpb24oa2V5KXtcblx0ICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcblx0ICAgICAgPyBTeW1ib2xSZWdpc3RyeVtrZXldXG5cdCAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcblx0ICB9LFxuXHQgIC8vIDE5LjQuMi41IFN5bWJvbC5rZXlGb3Ioc3ltKVxuXHQgIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKGtleSl7XG5cdCAgICBpZihpc1N5bWJvbChrZXkpKXJldHVybiBrZXlPZihTeW1ib2xSZWdpc3RyeSwga2V5KTtcblx0ICAgIHRocm93IFR5cGVFcnJvcihrZXkgKyAnIGlzIG5vdCBhIHN5bWJvbCEnKTtcblx0ICB9LFxuXHQgIHVzZVNldHRlcjogZnVuY3Rpb24oKXsgc2V0dGVyID0gdHJ1ZTsgfSxcblx0ICB1c2VTaW1wbGU6IGZ1bmN0aW9uKCl7IHNldHRlciA9IGZhbHNlOyB9XG5cdH0pO1xuXHRcblx0JGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcblx0ICAvLyAxOS4xLjIuMiBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG5cdCAgY3JlYXRlOiAkY3JlYXRlLFxuXHQgIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuXHQgIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG5cdCAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcblx0ICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcblx0ICAvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG5cdCAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuXHQgIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG5cdCAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG5cdCAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuXHQgIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xuXHR9KTtcblx0XG5cdC8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuXHQkSlNPTiAmJiAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCAkZmFpbHMoZnVuY3Rpb24oKXtcblx0ICB2YXIgUyA9ICRTeW1ib2woKTtcblx0ICAvLyBNUyBFZGdlIGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyB7fVxuXHQgIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuXHQgIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG5cdCAgcmV0dXJuIF9zdHJpbmdpZnkoW1NdKSAhPSAnW251bGxdJyB8fCBfc3RyaW5naWZ5KHthOiBTfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcblx0fSkpLCAnSlNPTicsIHtcblx0ICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCl7XG5cdCAgICBpZihpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSlyZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcblx0ICAgIHZhciBhcmdzID0gW2l0XVxuXHQgICAgICAsIGkgICAgPSAxXG5cdCAgICAgICwgcmVwbGFjZXIsICRyZXBsYWNlcjtcblx0ICAgIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG5cdCAgICByZXBsYWNlciA9IGFyZ3NbMV07XG5cdCAgICBpZih0eXBlb2YgcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykkcmVwbGFjZXIgPSByZXBsYWNlcjtcblx0ICAgIGlmKCRyZXBsYWNlciB8fCAhaXNBcnJheShyZXBsYWNlcikpcmVwbGFjZXIgPSBmdW5jdGlvbihrZXksIHZhbHVlKXtcblx0ICAgICAgaWYoJHJlcGxhY2VyKXZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG5cdCAgICAgIGlmKCFpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIHZhbHVlO1xuXHQgICAgfTtcblx0ICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcblx0ICAgIHJldHVybiBfc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmdzKTtcblx0ICB9XG5cdH0pO1xuXHRcblx0Ly8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuXHQkU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSB8fCBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpO1xuXHQvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5cdHNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcblx0Ly8gMjAuMi4xLjkgTWF0aFtAQHRvU3RyaW5nVGFnXVxuXHRzZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuXHQvLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuXHRzZXRUb1N0cmluZ1RhZyhnbG9iYWwuSlNPTiwgJ0pTT04nLCB0cnVlKTtcblxuLyoqKi8gfSxcbi8qIDE5NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIE1FVEEgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NCkoJ21ldGEnKVxuXHQgICwgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKVxuXHQgICwgaGFzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgc2V0RGVzYyAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKS5mXG5cdCAgLCBpZCAgICAgICA9IDA7XG5cdHZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uKCl7XG5cdCAgcmV0dXJuIHRydWU7XG5cdH07XG5cdHZhciBGUkVFWkUgPSAhX193ZWJwYWNrX3JlcXVpcmVfXygxNikoZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xuXHR9KTtcblx0dmFyIHNldE1ldGEgPSBmdW5jdGlvbihpdCl7XG5cdCAgc2V0RGVzYyhpdCwgTUVUQSwge3ZhbHVlOiB7XG5cdCAgICBpOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSURcblx0ICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG5cdCAgfX0pO1xuXHR9O1xuXHR2YXIgZmFzdEtleSA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuXHQgIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcblx0ICBpZighaXNPYmplY3QoaXQpKXJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG5cdCAgaWYoIWhhcyhpdCwgTUVUQSkpe1xuXHQgICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3Rcblx0ICAgIGlmKCFpc0V4dGVuc2libGUoaXQpKXJldHVybiAnRic7XG5cdCAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuXHQgICAgaWYoIWNyZWF0ZSlyZXR1cm4gJ0UnO1xuXHQgICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcblx0ICAgIHNldE1ldGEoaXQpO1xuXHQgIC8vIHJldHVybiBvYmplY3QgSURcblx0ICB9IHJldHVybiBpdFtNRVRBXS5pO1xuXHR9O1xuXHR2YXIgZ2V0V2VhayA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuXHQgIGlmKCFoYXMoaXQsIE1FVEEpKXtcblx0ICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG5cdCAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gdHJ1ZTtcblx0ICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG5cdCAgICBpZighY3JlYXRlKXJldHVybiBmYWxzZTtcblx0ICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG5cdCAgICBzZXRNZXRhKGl0KTtcblx0ICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuXHQgIH0gcmV0dXJuIGl0W01FVEFdLnc7XG5cdH07XG5cdC8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xuXHR2YXIgb25GcmVlemUgPSBmdW5jdGlvbihpdCl7XG5cdCAgaWYoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKXNldE1ldGEoaXQpO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblx0dmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcblx0ICBLRVk6ICAgICAgTUVUQSxcblx0ICBORUVEOiAgICAgZmFsc2UsXG5cdCAgZmFzdEtleTogIGZhc3RLZXksXG5cdCAgZ2V0V2VhazogIGdldFdlYWssXG5cdCAgb25GcmVlemU6IG9uRnJlZXplXG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnbG9iYWwgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0ICAsIGNvcmUgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuXHQgICwgTElCUkFSWSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KVxuXHQgICwgd2tzRXh0ICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1KVxuXHQgICwgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKS5mO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuXHQgIHZhciAkU3ltYm9sID0gY29yZS5TeW1ib2wgfHwgKGNvcmUuU3ltYm9sID0gTElCUkFSWSA/IHt9IDogZ2xvYmFsLlN5bWJvbCB8fCB7fSk7XG5cdCAgaWYobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSlkZWZpbmVQcm9wZXJ0eSgkU3ltYm9sLCBuYW1lLCB7dmFsdWU6IHdrc0V4dC5mKG5hbWUpfSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnZXRLZXlzICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KVxuXHQgICwgdG9JT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNik7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBlbCl7XG5cdCAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG5cdCAgICAsIGtleXMgICA9IGdldEtleXMoTylcblx0ICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcblx0ICAgICwgaW5kZXggID0gMFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobGVuZ3RoID4gaW5kZXgpaWYoT1trZXkgPSBrZXlzW2luZGV4KytdXSA9PT0gZWwpcmV0dXJuIGtleTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gYWxsIGVudW1lcmFibGUgb2JqZWN0IGtleXMsIGluY2x1ZGVzIHN5bWJvbHNcblx0dmFyIGdldEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KVxuXHQgICwgZ09QUyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk5KVxuXHQgICwgcElFICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjAwKTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgdmFyIHJlc3VsdCAgICAgPSBnZXRLZXlzKGl0KVxuXHQgICAgLCBnZXRTeW1ib2xzID0gZ09QUy5mO1xuXHQgIGlmKGdldFN5bWJvbHMpe1xuXHQgICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KVxuXHQgICAgICAsIGlzRW51bSAgPSBwSUUuZlxuXHQgICAgICAsIGkgICAgICAgPSAwXG5cdCAgICAgICwga2V5O1xuXHQgICAgd2hpbGUoc3ltYm9scy5sZW5ndGggPiBpKWlmKGlzRW51bS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pKXJlc3VsdC5wdXNoKGtleSk7XG5cdCAgfSByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTk5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKioqLyB9LFxuLyogMjAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRleHBvcnRzLmYgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqKi8gfSxcbi8qIDIwMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcblx0dmFyIGNvZiA9IF9fd2VicGFja19yZXF1aXJlX18oMzgpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpe1xuXHQgIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjAyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgcElFICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMClcblx0ICAsIGNyZWF0ZURlc2MgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSlcblx0ICAsIHRvSU9iamVjdCAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIHRvUHJpbWl0aXZlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0ICAsIGhhcyAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNClcblx0ICAsIGdPUEQgICAgICAgICAgID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblx0XG5cdGV4cG9ydHMuZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpID8gZ09QRCA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKXtcblx0ICBPID0gdG9JT2JqZWN0KE8pO1xuXHQgIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcblx0ICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuXHQgICAgcmV0dXJuIGdPUEQoTywgUCk7XG5cdCAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuXHQgIGlmKGhhcyhPLCBQKSlyZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyMDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cblxuLyoqKi8gfSxcbi8qIDIwNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxOTYpKCdhc3luY0l0ZXJhdG9yJyk7XG5cbi8qKiovIH0sXG4vKiAyMDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTk2KSgnb2JzZXJ2YWJsZScpO1xuXG4vKioqLyB9LFxuLyogMjA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGNsYXNzOiB7XG5cdCAgICAgICdvcGVuJzogX3ZtLnNob3dEcm9wZG93blxuXHQgICAgfSxcblx0ICAgIHN0YXRpY1N0eWxlOiB7XG5cdCAgICAgIFwicG9zaXRpb25cIjogXCJyZWxhdGl2ZVwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImZvcm0tY29udHJvbFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwidGV4dFwiLFxuXHQgICAgICBcImF1dG9jb21wbGV0ZVwiOiBcIm9mZlwiLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlclxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5zaG93RHJvcGRvd24gPSBmYWxzZVxuXHQgICAgICB9LFxuXHQgICAgICBcImtleWRvd25cIjogW2Z1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZG93blwiLCA0MCkpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLmRvd24oJGV2ZW50KVxuXHQgICAgICB9LCBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzKSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0uaGl0KCRldmVudClcblx0ICAgICAgfSwgZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS5yZXNldCgkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwidXBcIiwgMzgpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS51cCgkZXZlbnQpXG5cdCAgICAgIH1dLFxuXHQgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmICgkZXZlbnQudGFyZ2V0LmNvbXBvc2luZykgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0udmFsID0gJGV2ZW50LnRhcmdldC52YWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygndWwnLCB7XG5cdCAgICByZWY6IFwiZHJvcGRvd25cIixcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRyb3Bkb3duLW1lbnVcIlxuXHQgIH0sIF92bS5fbCgoX3ZtLml0ZW1zKSwgZnVuY3Rpb24oaXRlbSwgaSkge1xuXHQgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgIGNsYXNzOiB7XG5cdCAgICAgICAgJ2FjdGl2ZSc6IF92bS5pc0FjdGl2ZShpKVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uaGl0KCRldmVudClcblx0ICAgICAgICB9LFxuXHQgICAgICAgIFwibW91c2Vtb3ZlXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLnNldEFjdGl2ZShpKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fYyhfdm0udG1wbCwge1xuXHQgICAgICB0YWc6IFwiY29tcG9uZW50XCIsXG5cdCAgICAgIGF0dHJzOiB7XG5cdCAgICAgICAgXCJpdGVtXCI6IGl0ZW1cblx0ICAgICAgfVxuXHQgICAgfSldLCAxKV0pXG5cdCAgfSkpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNWI1ZjVlOTRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH1cbi8qKioqKiovIF0pXG59KTtcbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZ1ZS1zdHJhcC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdnVlLXN0cmFwL2Rpc3QvdnVlLXN0cmFwLmpzXG4vLyBtb2R1bGUgaWQgPSA0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); +eval("// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 78 */\n/***/ function(module, exports) {\n\n\t/*\r\n\t\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\t\tAuthor Tobias Koppers @sokra\r\n\t*/\r\n\t// css base code, injected by the css-loader\r\n\tmodule.exports = function() {\r\n\t\tvar list = [];\r\n\t\r\n\t\t// return the list of modules as css string\r\n\t\tlist.toString = function toString() {\r\n\t\t\tvar result = [];\r\n\t\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\t\tvar item = this[i];\r\n\t\t\t\tif(item[2]) {\r\n\t\t\t\t\tresult.push(\"@media \" + item[2] + \"{\" + item[1] + \"}\");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult.push(item[1]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn result.join(\"\");\r\n\t\t};\r\n\t\r\n\t\t// import a list of modules into the list\r\n\t\tlist.i = function(modules, mediaQuery) {\r\n\t\t\tif(typeof modules === \"string\")\r\n\t\t\t\tmodules = [[null, modules, \"\"]];\r\n\t\t\tvar alreadyImportedModules = {};\r\n\t\t\tfor(var i = 0; i < this.length; i++) {\r\n\t\t\t\tvar id = this[i][0];\r\n\t\t\t\tif(typeof id === \"number\")\r\n\t\t\t\t\talreadyImportedModules[id] = true;\r\n\t\t\t}\r\n\t\t\tfor(i = 0; i < modules.length; i++) {\r\n\t\t\t\tvar item = modules[i];\r\n\t\t\t\t// skip already imported module\r\n\t\t\t\t// this implementation is not 100% perfect for weird media query combinations\r\n\t\t\t\t// when a module is imported multiple times with different media queries.\r\n\t\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\r\n\t\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\r\n\t\t\t\t\tif(mediaQuery && !item[2]) {\r\n\t\t\t\t\t\titem[2] = mediaQuery;\r\n\t\t\t\t\t} else if(mediaQuery) {\r\n\t\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlist.push(item);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\treturn list;\r\n\t};\r\n\n\n/***/ },\n/* 79 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*\n\t\tMIT License http://www.opensource.org/licenses/mit-license.php\n\t\tAuthor Tobias Koppers @sokra\n\t*/\n\tvar stylesInDom = {},\n\t\tmemoize = function(fn) {\n\t\t\tvar memo;\n\t\t\treturn function () {\n\t\t\t\tif (typeof memo === \"undefined\") memo = fn.apply(this, arguments);\n\t\t\t\treturn memo;\n\t\t\t};\n\t\t},\n\t\tisOldIE = memoize(function() {\n\t\t\treturn /msie [6-9]\\b/.test(window.navigator.userAgent.toLowerCase());\n\t\t}),\n\t\tgetHeadElement = memoize(function () {\n\t\t\treturn document.head || document.getElementsByTagName(\"head\")[0];\n\t\t}),\n\t\tsingletonElement = null,\n\t\tsingletonCounter = 0,\n\t\tstyleElementsInsertedAtTop = [];\n\t\n\tmodule.exports = function(list, options) {\n\t\tif(false) {\n\t\t\tif(typeof document !== \"object\") throw new Error(\"The style-loader cannot be used in a non-browser environment\");\n\t\t}\n\t\n\t\toptions = options || {};\n\t\t// Force single-tag solution on IE6-9, which has a hard limit on the # of \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 85 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t header: { type: String },\n\t placement: { type: String, default: 'right' },\n\t show: { type: Boolean, required: true },\n\t width: { type: Number, default: 320 }\n\t },\n\t watch: {\n\t show: function show(val, old) {\n\t var _this = this;\n\t\n\t this.$emit('input', val);\n\t this.$emit(this.show ? 'open' : 'close');\n\t var body = document.body;\n\t var scrollBarWidth = (0, _utils.getScrollBarWidth)();\n\t if (val) {\n\t if (!this._backdrop) {\n\t this._backdrop = document.createElement('div');\n\t }\n\t this._backdrop.className = 'aside-backdrop';\n\t body.appendChild(this._backdrop);\n\t body.classList.add('modal-open');\n\t if (scrollBarWidth !== 0) {\n\t body.style.paddingRight = scrollBarWidth + 'px';\n\t }\n\t // request property that requires layout to force a layout\n\t var x = this._backdrop.clientHeight;\n\t this._backdrop.classList.add('in');\n\t (0, _NodeList2.default)(this._backdrop).on('click', function () {\n\t return _this.trigger_close();\n\t });\n\t } else {\n\t (0, _NodeList2.default)(this._backdrop).on('transitionend', function () {\n\t (0, _NodeList2.default)(_this._backdrop).off();\n\t try {\n\t body.classList.remove('modal-open');\n\t body.style.paddingRight = '0';\n\t body.removeChild(_this._backdrop);\n\t _this._backdrop = null;\n\t } catch (e) {}\n\t });\n\t this._backdrop.className = 'aside-backdrop';\n\t }\n\t }\n\t },\n\t methods: {\n\t trigger: function trigger() {\n\t var _this2 = this;\n\t\n\t return {\n\t close: function close() {\n\t return _this2.trigger_close();\n\t },\n\t open: function open() {\n\t return _this2.trigger_open();\n\t }\n\t };\n\t },\n\t trigger_close: function trigger_close() {\n\t this.$emit('close');\n\t },\n\t trigger_open: function trigger_open() {\n\t this.$emit('open');\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this3 = this;\n\t\n\t this.$emit('trigger', function () {\n\t return _this3.trigger;\n\t });\n\t }\n\t};\n\n/***/ },\n/* 86 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('transition', {\n\t attrs: {\n\t \"name\": 'slide' + _vm.placement\n\t }\n\t }, [(_vm.show) ? _vm._c('div', {\n\t staticClass: \"aside\",\n\t class: _vm.placement,\n\t style: ({\n\t width: _vm.width + 'px'\n\t })\n\t }, [_vm._c('div', {\n\t staticClass: \"aside-dialog\"\n\t }, [_vm._c('div', {\n\t staticClass: \"aside-content\"\n\t }, [_vm._c('div', {\n\t staticClass: \"aside-header\"\n\t }, [_vm._c('button', {\n\t staticClass: \"close\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.trigger_close\n\t }\n\t }, [_vm._c('span', [_vm._v(\"×\")])]), _vm._v(\" \"), _vm._c('h4', {\n\t staticClass: \"aside-title\"\n\t }, [_vm._t(\"header\", [_vm._v(_vm._s(_vm.header))])], 2)]), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"aside-body\"\n\t }, [_vm._t(\"default\")], 2)])])]) : _vm._e()])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-3a4bde27\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 87 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(88)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(89)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\ButtonGroup.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-125eb0c8\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-125eb0c8\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] ButtonGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 88 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t buttons: { default: true },\n\t justified: { type: Boolean, default: false },\n\t type: { type: String, default: 'default' },\n\t value: { default: null },\n\t vertical: { type: Boolean, default: false }\n\t },\n\t data: function data() {\n\t this._btnGroup = true;\n\t return {\n\t val: this.value\n\t };\n\t },\n\t\n\t watch: {\n\t val: function val(_val) {\n\t this.$emit('input', _val);\n\t }\n\t }\n\t};\n\n/***/ },\n/* 89 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: {\n\t 'btn-group': _vm.buttons, 'btn-group-justified': _vm.justified, 'btn-group-vertical': _vm.vertical\n\t },\n\t attrs: {\n\t \"data-toggle\": _vm.buttons && 'buttons'\n\t }\n\t }, [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-125eb0c8\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 90 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(91)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(93)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(94)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Carousel.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t__vue_options__._scopeId = \"data-v-322dee41\"\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-322dee41\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-322dee41\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Carousel.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 91 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 93 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// let coerce = {\n\t// interval: 'number'\n\t// }\n\t\n\texports.default = {\n\t props: {\n\t indicators: {\n\t type: Boolean,\n\t default: true\n\t },\n\t controls: {\n\t type: Boolean,\n\t default: true\n\t },\n\t interval: {\n\t type: Number,\n\t default: 5000\n\t }\n\t },\n\t data: function data() {\n\t return {\n\t indicator_list: [],\n\t index: 0,\n\t isAnimating: false\n\t };\n\t },\n\t\n\t watch: {\n\t index: function index(newVal, oldVal) {\n\t this.slide(newVal > oldVal ? 'left' : 'right', newVal, oldVal);\n\t }\n\t },\n\t methods: {\n\t indicatorClick: function indicatorClick(index) {\n\t if (this.isAnimating || this.index === index) return false;\n\t this.isAnimating = true;\n\t this.index = index;\n\t },\n\t slide: function slide(direction, next, prev) {\n\t var _this = this;\n\t\n\t if (!this.$el) {\n\t return;\n\t }\n\t var $slider = (0, _NodeList2.default)('.item', this.$el);\n\t if (!$slider.length) {\n\t return;\n\t }\n\t var selected = $slider[next] || $slider[0];\n\t (0, _NodeList2.default)(selected).addClass(direction === 'left' ? 'next' : 'prev');\n\t // request property that requires layout to force a layout\n\t var x = selected.clientHeight;\n\t (0, _NodeList2.default)([$slider[prev], selected]).addClass(direction).on('transitionend', function () {\n\t $slider.off('transitionend').className = 'item';\n\t (0, _NodeList2.default)(selected).addClass('active');\n\t _this.isAnimating = false;\n\t });\n\t },\n\t next: function next() {\n\t if (!this.$el || this.isAnimating) {\n\t return false;\n\t }\n\t this.isAnimating = true;\n\t this.index + 1 < (0, _NodeList2.default)('.item', this.$el).length ? this.index += 1 : this.index = 0;\n\t },\n\t prev: function prev() {\n\t if (!this.$el || this.isAnimating) {\n\t return false;\n\t }\n\t this.isAnimating = true;\n\t this.index === 0 ? this.index = (0, _NodeList2.default)('.item', this.$el).length - 1 : this.index -= 1;\n\t },\n\t toggleInterval: function toggleInterval(val) {\n\t if (val === undefined) {\n\t val = this._intervalID;\n\t }\n\t if (this._intervalID) {\n\t clearInterval(this._intervalID);\n\t delete this._intervalID;\n\t }\n\t if (val && this.interval > 0) {\n\t this._intervalID = setInterval(this.next, this.interval);\n\t }\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this2 = this;\n\t\n\t this.toggleInterval(true);\n\t (0, _NodeList2.default)(this.$el).on('mouseenter', function () {\n\t return _this2.toggleInterval(false);\n\t }).on('mouseleave', function () {\n\t return _this2.toggleInterval(true);\n\t });\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t this.toggleInterval(false);\n\t (0, _NodeList2.default)(this.$el).off('mouseenter mouseleave');\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 94 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t staticClass: \"carousel slide\",\n\t attrs: {\n\t \"data-ride\": \"carousel\"\n\t }\n\t }, [_vm._c('ol', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.indicators),\n\t expression: \"indicators\"\n\t }],\n\t staticClass: \"carousel-indicators\"\n\t }, _vm._l((_vm.indicator_list), function(indicator, i) {\n\t return _vm._c('li', {\n\t class: {\n\t active: i === _vm.index\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.indicatorClick(i)\n\t }\n\t }\n\t }, [_vm._c('span')])\n\t })), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"carousel-inner\",\n\t attrs: {\n\t \"role\": \"listbox\"\n\t }\n\t }, [_vm._t(\"default\")], 2), _vm._v(\" \"), _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.controls),\n\t expression: \"controls\"\n\t }],\n\t staticClass: \"carousel-controls hidden-xs\"\n\t }, [_vm._c('a', {\n\t staticClass: \"left carousel-control\",\n\t attrs: {\n\t \"role\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.prev\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"glyphicon glyphicon-chevron-left\",\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t }\n\t })]), _vm._v(\" \"), _vm._c('a', {\n\t staticClass: \"right carousel-control\",\n\t attrs: {\n\t \"role\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.next\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"glyphicon glyphicon-chevron-right\",\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t }\n\t })])])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-322dee41\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 95 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(96)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(98)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(99)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Checkbox.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t__vue_options__._scopeId = \"data-v-6922bf24\"\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-6922bf24\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-6922bf24\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Checkbox.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 96 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 98 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t button: { type: Boolean, default: false },\n\t disabled: { type: Boolean, default: false },\n\t falseValue: { default: false },\n\t name: { type: String, default: null },\n\t readonly: { type: Boolean, default: false },\n\t trueValue: { default: true },\n\t type: { type: String, default: null },\n\t value: { default: false }\n\t },\n\t data: function data() {\n\t return {\n\t checked: this.value === this.trueValue\n\t };\n\t },\n\t\n\t computed: {\n\t isButton: function isButton() {\n\t return this.button || this._inGroup && this.$parent.buttons;\n\t },\n\t isFalse: function isFalse() {\n\t return this.value === this.falseValue;\n\t },\n\t isTrue: function isTrue() {\n\t return this.value === this.trueValue;\n\t },\n\t parentValue: function parentValue() {\n\t return this._ingroup && this.$parent.val;\n\t },\n\t typeColor: function typeColor() {\n\t return this.type || this.$parent && this.$parent.type || 'default';\n\t }\n\t },\n\t watch: {\n\t checked: function checked(val, old) {\n\t var value = val ? this.trueValue : this.falseValue;\n\t this.$emit('checked', val);\n\t this.$emit('input', value);\n\t this.eval();\n\t },\n\t parentValue: function parentValue(val) {\n\t var checked = val === this.trueValue;\n\t if (this.checked !== checked) {\n\t this.checked = checked;\n\t }\n\t },\n\t value: function value(val, old) {\n\t var checked = val === this.trueValue;\n\t if (this.checked !== checked) {\n\t this.checked = checked;\n\t }\n\t }\n\t },\n\t created: function created() {\n\t var parent = this.$parent;\n\t if (parent && parent._btnGroup && !parent._radioGroup) {\n\t this._inGroup = true;\n\t parent._checkboxGroup = true;\n\t if (!(parent.val instanceof Array)) {\n\t parent.val = [];\n\t }\n\t this.eval();\n\t }\n\t },\n\t mounted: function mounted() {\n\t if (!this.$parent._checkboxGroup || typeof this.value === 'boolean') {\n\t return;\n\t }\n\t if (this.$parent.val.length) {\n\t // this.checked = ~this.$parent.val.indexOf(this.value)\n\t this.$emit('checked', ~this.$parent.val.indexOf(this.value));\n\t } else if (this.checked) {\n\t this.$parent.val.push(this.value);\n\t }\n\t },\n\t\n\t methods: {\n\t eval: function _eval() {\n\t if (this._inGroup) {\n\t var value = this.checked ? this.isTrue : this.isFalse;\n\t var index = this.$parent.val.indexOf(value);\n\t if (this.checked && !~index) this.$parent.val.push(value);\n\t if (!this.checked && ~index) this.$parent.val.splice(index, 1);\n\t }\n\t },\n\t toggle: function toggle() {\n\t if (this.disabled || this.readonly) {\n\t return;\n\t }\n\t this.checked = !this.checked;\n\t }\n\t }\n\t};\n\n/***/ },\n/* 99 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c(_vm.isButton ? 'a' : 'label', {\n\t tag: \"a\",\n\t class: [_vm.isButton ? 'btn btn-' + _vm.typeColor : 'open checkbox ' + _vm.typeColor, {\n\t active: _vm.checked,\n\t disabled: _vm.disabled,\n\t readonly: _vm.readonly\n\t }],\n\t on: {\n\t \"click\": _vm.toggle\n\t }\n\t }, [(_vm.name) ? _vm._c('input', {\n\t attrs: {\n\t \"type\": \"hidden\",\n\t \"name\": _vm.name\n\t },\n\t domProps: {\n\t \"value\": _vm.checked ? _vm.trueValue : _vm.falseValue\n\t }\n\t }) : _vm._e(), _vm._v(\" \"), (!_vm.isButton) ? _vm._c('span', {\n\t staticClass: \"icon dropdown-toggle\",\n\t class: [_vm.checked ? 'btn-' + _vm.typeColor : '', {\n\t bg: _vm.typeColor === 'default'\n\t }]\n\t }) : _vm._e(), _vm._v(\" \"), (!_vm.isButton && _vm.checked && _vm.typeColor === 'default') ? _vm._c('span', {\n\t staticClass: \"icon\"\n\t }) : _vm._e(), _vm._v(\" \"), _vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-6922bf24\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 100 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(101)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(103)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(104)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Datepicker.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-477b8e5d\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-477b8e5d\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Datepicker.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 101 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 103 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\t// import $ from './utils/NodeList.js'\n\t\n\texports.default = {\n\t props: {\n\t value: { type: String },\n\t format: { default: 'MM/dd/yyyy' },\n\t disabledDaysOfWeek: { type: Array, default: function _default() {\n\t return [];\n\t }\n\t },\n\t width: { type: String /*, default: '200px'*/ },\n\t clearButton: { type: Boolean, default: false },\n\t lang: { type: String, default: navigator.language },\n\t placeholder: { type: String },\n\t iconsFont: { type: String, default: 'glyphicon' }\n\t },\n\t data: function data() {\n\t return {\n\t currDate: new Date(),\n\t dateRange: [],\n\t decadeRange: [],\n\t displayDayView: false,\n\t displayMonthView: false,\n\t displayYearView: false\n\t };\n\t },\n\t\n\t watch: {\n\t currDate: function currDate() {\n\t this.getDateRange();\n\t },\n\t format: function format() {\n\t this.$emit('input', this.stringify(this.currDate));\n\t }\n\t },\n\t computed: {\n\t text: function text() {\n\t return (0, _utils.translations)(this.lang);\n\t },\n\t preBtnClasses: function preBtnClasses() {\n\t return 'datepicker-preBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-left';\n\t },\n\t nextBtnClasses: function nextBtnClasses() {\n\t return 'datepicker-nextBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-right';\n\t },\n\t disabledDaysArray: function disabledDaysArray() {\n\t return this.disabledDaysOfWeek.map(function (d) {\n\t return parseInt(d, 10);\n\t });\n\t }\n\t },\n\t methods: {\n\t close: function close() {\n\t this.displayDayView = this.displayMonthView = this.displayYearView = false;\n\t },\n\t inputClick: function inputClick() {\n\t this.currDate = this.parse(this.value) || this.parse(new Date());\n\t if (this.displayMonthView || this.displayYearView) {\n\t this.displayDayView = false;\n\t } else {\n\t this.displayDayView = !this.displayDayView;\n\t }\n\t },\n\t preNextDecadeClick: function preNextDecadeClick(flag) {\n\t var year = this.currDate.getFullYear();\n\t var months = this.currDate.getMonth();\n\t var date = this.currDate.getDate();\n\t\n\t if (flag === 0) {\n\t this.currDate = new Date(year - 10, months, date);\n\t } else {\n\t this.currDate = new Date(year + 10, months, date);\n\t }\n\t },\n\t preNextMonthClick: function preNextMonthClick(flag) {\n\t var year = this.currDate.getFullYear();\n\t var month = this.currDate.getMonth();\n\t var date = this.currDate.getDate();\n\t\n\t if (flag === 0) {\n\t var preMonth = this.getYearMonth(year, month - 1);\n\t this.currDate = new Date(preMonth.year, preMonth.month, date);\n\t } else {\n\t var nextMonth = this.getYearMonth(year, month + 1);\n\t this.currDate = new Date(nextMonth.year, nextMonth.month, date);\n\t }\n\t },\n\t preNextYearClick: function preNextYearClick(flag) {\n\t var year = this.currDate.getFullYear();\n\t var months = this.currDate.getMonth();\n\t var date = this.currDate.getDate();\n\t\n\t if (flag === 0) {\n\t this.currDate = new Date(year - 1, months, date);\n\t } else {\n\t this.currDate = new Date(year + 1, months, date);\n\t }\n\t },\n\t yearSelect: function yearSelect(year) {\n\t this.displayYearView = false;\n\t this.displayMonthView = true;\n\t this.currDate = new Date(year, this.currDate.getMonth(), this.currDate.getDate());\n\t },\n\t daySelect: function daySelect(day) {\n\t if (day.sclass === 'datepicker-item-disable') {\n\t return false;\n\t } else {\n\t this.currDate = day.date;\n\t this.$emit('input', this.stringify(this.currDate));\n\t this.displayDayView = false;\n\t }\n\t },\n\t switchMonthView: function switchMonthView() {\n\t this.displayDayView = false;\n\t this.displayMonthView = true;\n\t },\n\t switchDecadeView: function switchDecadeView() {\n\t this.displayMonthView = false;\n\t this.displayYearView = true;\n\t },\n\t monthSelect: function monthSelect(index) {\n\t this.displayMonthView = false;\n\t this.displayDayView = true;\n\t this.currDate = new Date(this.currDate.getFullYear(), index, this.currDate.getDate());\n\t },\n\t getYearMonth: function getYearMonth(year, month) {\n\t if (month > 11) {\n\t year++;\n\t month = 0;\n\t } else if (month < 0) {\n\t year--;\n\t month = 11;\n\t }\n\t return { year: year, month: month };\n\t },\n\t stringifyDecadeHeader: function stringifyDecadeHeader(date) {\n\t var yearStr = date.getFullYear().toString();\n\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0;\n\t var lastYearOfDecade = parseInt(firstYearOfDecade, 10) + 10;\n\t return firstYearOfDecade + '-' + lastYearOfDecade;\n\t },\n\t stringifyDayHeader: function stringifyDayHeader(date) {\n\t return this.text.months[date.getMonth()] + ' ' + date.getFullYear();\n\t },\n\t parseMonth: function parseMonth(date) {\n\t return this.text.months[date.getMonth()];\n\t },\n\t stringifyYearHeader: function stringifyYearHeader(date) {\n\t return date.getFullYear();\n\t },\n\t stringify: function stringify(date) {\n\t var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.format;\n\t\n\t if (!date) date = this.parse();\n\t if (!date) return '';\n\t var year = date.getFullYear();\n\t var month = date.getMonth() + 1;\n\t var day = date.getDate();\n\t var monthName = this.parseMonth(date);\n\t\n\t return format.replace(/yyyy/g, year).replace(/MMMM/g, monthName).replace(/MMM/g, monthName.substring(0, 3)).replace(/MM/g, ('0' + month).slice(-2)).replace(/dd/g, ('0' + day).slice(-2)).replace(/yy/g, year).replace(/M(?!a)/g, month).replace(/d/g, day);\n\t },\n\t parse: function parse() {\n\t var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.value;\n\t\n\t var date = void 0;\n\t if (str.length === 10 && (this.format === 'dd-MM-yyyy' || this.format === 'dd/MM/yyyy')) {\n\t date = new Date(str.substring(6, 10), str.substring(3, 5) - 1, str.substring(0, 2));\n\t } else {\n\t date = new Date(str);\n\t }\n\t return isNaN(date.getFullYear()) ? new Date() : date;\n\t },\n\t getDayCount: function getDayCount(year, month) {\n\t var dict = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\t if (month === 1) {\n\t if (year % 400 === 0 || year % 4 === 0 && year % 100 !== 0) {\n\t return 29;\n\t }\n\t }\n\t return dict[month];\n\t },\n\t getDateRange: function getDateRange() {\n\t this.dateRange = [];\n\t this.decadeRange = [];\n\t var time = {\n\t year: this.currDate.getFullYear(),\n\t month: this.currDate.getMonth(),\n\t day: this.currDate.getDate()\n\t };\n\t var yearStr = time.year.toString();\n\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0 - 1;\n\t for (var i = 0; i < 12; i++) {\n\t this.decadeRange.push({\n\t text: firstYearOfDecade + i\n\t });\n\t }\n\t\n\t var currMonthFirstDay = new Date(time.year, time.month, 1);\n\t var firstDayWeek = currMonthFirstDay.getDay() + 1;\n\t if (firstDayWeek === 0) {\n\t firstDayWeek = 7;\n\t }\n\t var dayCount = this.getDayCount(time.year, time.month);\n\t if (firstDayWeek > 1) {\n\t var preMonth = this.getYearMonth(time.year, time.month - 1);\n\t var prevMonthDayCount = this.getDayCount(preMonth.year, preMonth.month);\n\t for (var _i = 1; _i < firstDayWeek; _i++) {\n\t var dayText = prevMonthDayCount - firstDayWeek + _i + 1;\n\t var date = new Date(preMonth.year, preMonth.month, dayText);\n\t var sclass = 'datepicker-item-gray';\n\t if (this.disabledDaysArray.indexOf(date.getDay()) > -1) {\n\t sclass = 'datepicker-item-disable';\n\t }\n\t this.dateRange.push({\n\t text: dayText,\n\t date: date,\n\t sclass: 'datepicker-item-gray'\n\t });\n\t }\n\t }\n\t\n\t for (var _i2 = 1; _i2 <= dayCount; _i2++) {\n\t var _date = new Date(time.year, time.month, _i2);\n\t var _sclass = '';\n\t if (this.disabledDaysArray.indexOf(_date.getDay()) > -1) {\n\t _sclass = 'datepicker-item-disable';\n\t }\n\t if (_i2 == time.day && _date.getFullYear() == time.year && _date.getMonth() == time.month) {\n\t _sclass = 'datepicker-dateRange-item-active';\n\t }\n\t this.dateRange.push({\n\t text: _i2,\n\t date: _date,\n\t sclass: _sclass\n\t });\n\t }\n\t\n\t if (this.dateRange.length < 42) {\n\t var nextMonthNeed = 42 - this.dateRange.length;\n\t var nextMonth = this.getYearMonth(time.year, time.month + 1);\n\t\n\t for (var _i3 = 1; _i3 <= nextMonthNeed; _i3++) {\n\t var _date2 = new Date(nextMonth.year, nextMonth.month, _i3);\n\t var _sclass2 = 'datepicker-item-gray';\n\t if (this.disabledDaysArray.indexOf(_date2.getDay()) > -1) {\n\t _sclass2 = 'datepicker-item-disable';\n\t }\n\t this.dateRange.push({\n\t text: _i3,\n\t date: _date2,\n\t sclass: _sclass2\n\t });\n\t }\n\t }\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this = this;\n\t\n\t var el = this.$el;\n\t this._blur = function (e) {\n\t if (!el.contains(e.target)) _this.close();\n\t };\n\t this.$emit('child-created', this);\n\t this.currDate = this.parse(this.value) || this.parse(new Date());\n\t window.addEventListener('click', this._blur);\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t window.removeEventListener('click', this._blur);\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 104 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t staticClass: \"datepicker\"\n\t }, [_vm._c('input', {\n\t staticClass: \"form-control datepicker-input\",\n\t class: {\n\t 'with-reset-button': _vm.clearButton\n\t },\n\t style: ({\n\t width: _vm.width\n\t }),\n\t attrs: {\n\t \"type\": \"text\",\n\t \"placeholder\": _vm.placeholder\n\t },\n\t domProps: {\n\t \"value\": _vm.value\n\t },\n\t on: {\n\t \"click\": _vm.inputClick,\n\t \"input\": function($event) {\n\t _vm.$emit('input', $event.target.value)\n\t }\n\t }\n\t }), _vm._v(\" \"), (_vm.clearButton && _vm.value) ? _vm._c('button', {\n\t staticClass: \"close\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.$emit('input', '')\n\t }\n\t }\n\t }, [_vm._c('span', [_vm._v(\"×\")])]) : _vm._e(), _vm._v(\" \"), _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.displayDayView),\n\t expression: \"displayDayView\"\n\t }],\n\t staticClass: \"datepicker-popup\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-inner\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-body\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-ctrl\"\n\t }, [_vm._c('span', {\n\t class: _vm.preBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextMonthClick(0)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t class: _vm.nextBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextMonthClick(1)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('p', {\n\t on: {\n\t \"click\": _vm.switchMonthView\n\t }\n\t }, [_vm._v(_vm._s(_vm.stringifyDayHeader(_vm.currDate)))])]), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"datepicker-weekRange\"\n\t }, _vm._l((_vm.text.daysOfWeek), function(w) {\n\t return _vm._c('span', [_vm._v(_vm._s(w))])\n\t })), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"datepicker-dateRange\"\n\t }, _vm._l((_vm.dateRange), function(d) {\n\t return _vm._c('span', {\n\t class: d.sclass,\n\t on: {\n\t \"click\": function($event) {\n\t _vm.daySelect(d)\n\t }\n\t }\n\t }, [_vm._v(_vm._s(d.text))])\n\t }))])])]), _vm._v(\" \"), _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.displayMonthView),\n\t expression: \"displayMonthView\"\n\t }],\n\t staticClass: \"datepicker-popup\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-inner\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-body\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-ctrl\"\n\t }, [_vm._c('span', {\n\t class: _vm.preBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextYearClick(0)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t class: _vm.nextBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextYearClick(1)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('p', {\n\t on: {\n\t \"click\": _vm.switchDecadeView\n\t }\n\t }, [_vm._v(_vm._s(_vm.stringifyYearHeader(_vm.currDate)))])]), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"datepicker-monthRange\"\n\t }, [_vm._l((_vm.text.months), function(m, index) {\n\t return [_vm._c('span', {\n\t class: {\n\t 'datepicker-dateRange-item-active':\n\t (_vm.text.months[_vm.parse(_vm.value).getMonth()] === m) &&\n\t _vm.currDate.getFullYear() === _vm.parse(_vm.value).getFullYear()\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.monthSelect(index)\n\t }\n\t }\n\t }, [_vm._v(_vm._s(m.substr(0, 3)))])]\n\t })], 2)])])]), _vm._v(\" \"), _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.displayYearView),\n\t expression: \"displayYearView\"\n\t }],\n\t staticClass: \"datepicker-popup\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-inner\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-body\"\n\t }, [_vm._c('div', {\n\t staticClass: \"datepicker-ctrl\"\n\t }, [_vm._c('span', {\n\t class: _vm.preBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextDecadeClick(0)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t class: _vm.nextBtnClasses,\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.preNextDecadeClick(1)\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('p', [_vm._v(_vm._s(_vm.stringifyDecadeHeader(_vm.currDate)))])]), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"datepicker-monthRange decadeRange\"\n\t }, [_vm._l((_vm.decadeRange), function(decade) {\n\t return [_vm._c('span', {\n\t class: {\n\t 'datepicker-dateRange-item-active': _vm.parse(this.value).getFullYear() === decade.text\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t $event.stopPropagation();\n\t _vm.yearSelect(decade.text)\n\t }\n\t }\n\t }, [_vm._v(_vm._s(decade.text))])]\n\t })], 2)])])])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-477b8e5d\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 105 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(106)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(107)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Dropdown.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-39be1072\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-39be1072\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Dropdown.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 106 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tvar _ClickOutside = __webpack_require__(66);\n\t\n\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t directives: {\n\t ClickOutside: _ClickOutside2.default\n\t },\n\t props: {\n\t disabled: { type: Boolean, default: false },\n\t size: { type: String, default: null },\n\t text: { type: String, default: null },\n\t type: { type: String, default: 'default' },\n\t value: { type: Boolean, default: false }\n\t },\n\t data: function data() {\n\t var show = this.value;\n\t return { show: show };\n\t },\n\t\n\t watch: {\n\t show: function show(val) {\n\t this.$emit('input', val);\n\t },\n\t value: function value(val) {\n\t this.show = val;\n\t }\n\t },\n\t computed: {\n\t buttonSize: function buttonSize() {\n\t return ~['lg', 'sm', 'xs'].indexOf(this.size) ? 'btn-' + this.size : '';\n\t },\n\t inInput: function inInput() {\n\t return this.$parent._input;\n\t },\n\t isLi: function isLi() {\n\t return this.$parent._isTabs || this.$parent._navbar || this.$parent.menu;\n\t },\n\t menu: function menu() {\n\t return !this.$parent || this.$parent.navbar;\n\t },\n\t slots: function slots() {\n\t return this._slotContents;\n\t },\n\t submenu: function submenu() {\n\t return this.$parent && (this.$parent.menu || this.$parent.submenu);\n\t }\n\t },\n\t methods: {\n\t blur: function blur() {\n\t this.show = false;\n\t },\n\t toggle: function toggle() {\n\t if (!this.disabled) {\n\t this.show = !this.show;\n\t }\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this = this;\n\t\n\t (0, _NodeList2.default)('ul', this.$el).on('click', 'li>a', function (e) {\n\t _this.show = false;\n\t });\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t (0, _NodeList2.default)('ul', this.$el).off();\n\t }\n\t};\n\n/***/ },\n/* 107 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c(_vm.isLi ? 'li' : 'div', {\n\t directives: [{\n\t name: \"click-outside\",\n\t rawName: \"v-click-outside\",\n\t value: (_vm.blur),\n\t expression: \"blur\"\n\t }],\n\t tag: \"div\",\n\t class: [{\n\t open: _vm.show,\n\t disabled: _vm.disabled,\n\t dropdown: _vm.isLi,\n\t 'input-group-btn': _vm.inInput,\n\t 'btn-group': !_vm.isLi && !_vm.inInput\n\t }]\n\t }, [_vm._t(\"before\"), _vm._v(\" \"), (_vm.isLi) ? _vm._c('a', {\n\t class: ['dropdown-toggle', _vm.buttonSize, {\n\t disabled: _vm.disabled\n\t }],\n\t attrs: {\n\t \"role\": \"button\"\n\t },\n\t on: {\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t _vm.show = false\n\t },\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }\n\t }\n\t }, [_vm._t(\"button\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"caret\"\n\t })], 2) : _vm._c('button', {\n\t class: ['btn btn-' + _vm.type, _vm.buttonSize, 'dropdown-toggle'],\n\t attrs: {\n\t \"type\": \"button\",\n\t \"disabled\": _vm.disabled\n\t },\n\t on: {\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t _vm.show = false\n\t },\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }\n\t }\n\t }, [_vm._t(\"button\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"caret\"\n\t })], 2), _vm._v(\" \"), _vm._t(\"dropdown-menu\", [_vm._c('ul', {\n\t staticClass: \"dropdown-menu\"\n\t }, [_vm._t(\"default\")], 2)])], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-39be1072\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 108 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(109)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(110)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\FormGroup.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-79eb400a\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-79eb400a\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] FormGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 109 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t// let coerce = {\n\t// enterSubmit: 'boolean',\n\t// icon: 'boolean'\n\t// }\n\t\n\texports.default = {\n\t props: {\n\t enterSubmit: {\n\t type: Boolean,\n\t default: false\n\t },\n\t icon: {\n\t type: Boolean,\n\t default: false\n\t },\n\t lang: {\n\t type: String,\n\t default: navigator.language\n\t }\n\t },\n\t data: function data() {\n\t return {\n\t children: [],\n\t valid: null,\n\t timeout: null\n\t };\n\t },\n\t\n\t watch: {\n\t valid: function valid(val, old) {\n\t this.$emit('isvalid', val);\n\t this.$emit(!val ? 'invalid' : 'valid');\n\t if (val !== old && this._parent) this._parent.validate();\n\t }\n\t },\n\t methods: {\n\t validate: function validate() {\n\t var valid = true;\n\t this.children.some(function (el) {\n\t var v = el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\n\t if (!v) valid = false;\n\t return !valid;\n\t });\n\t this.valid = valid;\n\t return valid === true;\n\t }\n\t },\n\t created: function created() {\n\t this._formGroup = true;\n\t var parent = this.$parent;\n\t while (parent && !parent._formGroup) {\n\t parent = parent.$parent;\n\t }\n\t if (parent && parent._formGroup) {\n\t parent.children.push(this);\n\t this._parent = parent;\n\t }\n\t },\n\t mounted: function mounted() {\n\t this.validate();\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._parent) {\n\t var index = this._parent.children.indexOf(this);\n\t this._parent.children.splice(index, 1);\n\t }\n\t }\n\t}; //\n\t//\n\n/***/ },\n/* 110 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-79eb400a\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 111 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(112)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(113)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\FormValidator.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-b9f57c46\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-b9f57c46\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] FormValidator.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 112 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t props: {\n\t enterSubmit: { type: Boolean, default: false },\n\t icon: { type: Boolean, default: false },\n\t lang: { type: String, default: navigator.language },\n\t value: null\n\t },\n\t data: function data() {\n\t return {\n\t children: [],\n\t valid: null,\n\t timeout: null\n\t };\n\t },\n\t\n\t watch: {\n\t valid: function valid(val, old) {\n\t this.$emit('isvalid', val);\n\t this.$emit('input', val);\n\t this.$emit(!val ? 'invalid' : 'valid');\n\t if (val !== old && this._parent) this._parent.validate();\n\t }\n\t },\n\t methods: {\n\t validate: function validate() {\n\t var invalid = !this.children.every(function (el) {\n\t return el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\n\t });\n\t this.valid = !invalid;\n\t return !invalid;\n\t }\n\t },\n\t created: function created() {\n\t this._formValidator = true;\n\t var parent = this.$parent;\n\t while (parent && !parent._formValidator) {\n\t parent = parent.$parent;\n\t }\n\t if (parent && parent._formValidator) {\n\t parent.children.push(this);\n\t this._parent = parent;\n\t }\n\t },\n\t mounted: function mounted() {\n\t this.validate();\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._parent) {\n\t var index = this._parent.children.indexOf(this);\n\t this._parent.children.splice(index, 1);\n\t }\n\t }\n\t}; //\n\t//\n\n/***/ },\n/* 113 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-b9f57c46\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 114 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(115)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(117)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(118)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Input.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t__vue_options__._scopeId = \"data-v-652ad7b9\"\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-652ad7b9\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-652ad7b9\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Input.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 115 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 117 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\tvar DELAY = 300;\n\t\n\texports.default = {\n\t props: {\n\t clearButton: { type: Boolean, default: false },\n\t cols: { type: Number, default: null },\n\t datalist: { type: Array, default: null },\n\t disabled: { type: Boolean, default: false },\n\t enterSubmit: { type: Boolean, default: false },\n\t error: { type: String, default: null },\n\t help: { type: String, default: null },\n\t hideHelp: { type: Boolean, default: true },\n\t icon: { type: Boolean, default: false },\n\t label: { type: String, default: null },\n\t lang: { type: String, default: navigator.language },\n\t mask: null,\n\t maskDelay: { type: Number, default: 100 },\n\t match: { type: String, default: null },\n\t max: { type: String, default: null },\n\t maxlength: { type: Number, default: null },\n\t min: { type: String, default: null },\n\t minlength: { type: Number, default: 0 },\n\t name: { type: String, default: null },\n\t pattern: { default: null },\n\t placeholder: { type: String, default: null },\n\t readonly: { type: Boolean, default: false },\n\t required: { type: Boolean, default: false },\n\t rows: { type: Number, default: 3 },\n\t step: { type: Number, default: null },\n\t type: { type: String, default: 'text' },\n\t url: { type: String, default: null },\n\t urlMap: { type: Function, default: null },\n\t validationDelay: { type: Number, default: 250 },\n\t value: { default: null }\n\t },\n\t data: function data() {\n\t var val = this.value;\n\t return {\n\t options: this.datalist,\n\t val: val,\n\t valid: null,\n\t timeout: null\n\t };\n\t },\n\t\n\t computed: {\n\t canValidate: function canValidate() {\n\t return !this.disabled && !this.readonly && (this.required || this.regex || this.nativeValidate || this.match !== null);\n\t },\n\t errorText: function errorText() {\n\t var value = this.value;\n\t var error = [this.error];\n\t if (!value && this.required) error.push('(' + this.text.required.toLowerCase() + ')');\n\t if (value && value.length < this.minlength) error.push('(' + this.text.minLength.toLowerCase() + ': ' + this.minlength + ')');\n\t return error.join(' ');\n\t },\n\t id_datalist: function id_datalist() {\n\t if (this.type !== 'textarea' && this.datalist instanceof Array) {\n\t if (!this._id_datalist) {\n\t if (!this.$root.id_datalist) {\n\t this.$root.id_datalist = 0;\n\t }\n\t this._id_datalist = 'input-datalist' + this.$root.id_datalist++;\n\t }\n\t return this._id_datalist;\n\t }\n\t return null;\n\t },\n\t input: function input() {\n\t return this.$refs.input;\n\t },\n\t nativeValidate: function nativeValidate() {\n\t return (this.input || {}).checkValidity && (~['url', 'email'].indexOf(this.type.toLowerCase()) || this.min || this.max);\n\t },\n\t regex: function regex() {\n\t return _utils.coerce.pattern(this.pattern);\n\t },\n\t showError: function showError() {\n\t return this.error && this.valid === false;\n\t },\n\t showHelp: function showHelp() {\n\t return this.help && (!this.showError || !this.hideHelp);\n\t },\n\t text: function text() {\n\t return (0, _utils.translations)(this.lang);\n\t },\n\t title: function title() {\n\t return this.errorText || this.help || '';\n\t }\n\t },\n\t watch: {\n\t datalist: function datalist(val, old) {\n\t if (val !== old && val instanceof Array) {\n\t this.options = val;\n\t }\n\t },\n\t match: function match(val) {\n\t this.eval();\n\t },\n\t options: function options(val, old) {\n\t if (val !== old) this.$emit('options', val);\n\t },\n\t url: function url(val) {\n\t this._url();\n\t },\n\t val: function val(_val, old) {\n\t var _this = this;\n\t\n\t this.$emit('input', _val);\n\t if (_val !== old) {\n\t if (this.mask instanceof Function) {\n\t _val = this.mask(_val || '');\n\t if (this.val !== _val) {\n\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\n\t this._timeout.mask = setTimeout(function () {\n\t _this.val = _val;\n\t }, isNaN(this.maskDelay) ? 0 : this.maskDelay);\n\t }\n\t }\n\t this.eval();\n\t }\n\t },\n\t valid: function valid(val, old) {\n\t this.$emit('isvalid', val);\n\t this.$emit(!val ? 'invalid' : 'valid');\n\t if (this._parent) this._parent.validate();\n\t },\n\t value: function value(val) {\n\t if (this.val !== val) {\n\t this.val = val;\n\t }\n\t }\n\t },\n\t methods: {\n\t attr: function attr(value) {\n\t return ~['', null, undefined].indexOf(value) || value instanceof Function ? null : value;\n\t },\n\t emit: function emit(e) {\n\t this.$emit(e.type, e.type == 'input' ? e.target.value : e);\n\t if (e.type === 'blur' && this.canValidate) {\n\t this.valid = this.validate();\n\t }\n\t },\n\t eval: function _eval() {\n\t var _this2 = this;\n\t\n\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\n\t if (!this.canValidate) {\n\t this.valid = true;\n\t } else {\n\t this._timeout.eval = setTimeout(function () {\n\t _this2.valid = _this2.validate();\n\t _this2._timeout.eval = null;\n\t }, this.validationDelay);\n\t }\n\t },\n\t focus: function focus() {\n\t this.input.focus();\n\t },\n\t submit: function submit() {\n\t if (this.$parent._formValidator) {\n\t return this.$parent.validate();\n\t }\n\t if (this.input.form) {\n\t var invalids = (0, _NodeList2.default)('.form-group.validate:not(.has-success)', this.input.form);\n\t if (invalids.length) {\n\t invalids.find('input,textarea,select')[0].focus();\n\t } else {\n\t this.input.form.submit();\n\t }\n\t }\n\t },\n\t validate: function validate() {\n\t if (!this.canValidate) {\n\t return true;\n\t }\n\t var value = (this.val || '').trim();\n\t if (!value) {\n\t return !this.required;\n\t }\n\t if (this.match !== null) {\n\t return this.match === value;\n\t }\n\t if (value.length < this.minlength) {\n\t return false;\n\t }\n\t if (this.nativeValidate && !this.input.checkValidity()) {\n\t return false;\n\t }\n\t if (this.regex) {\n\t if (!(this.regex instanceof Function ? this.regex(this.value) : this.regex.test(this.value))) {\n\t return false;\n\t }\n\t }\n\t return true;\n\t },\n\t reset: function reset() {\n\t this.value = '';\n\t this.valid = null;\n\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\n\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\n\t }\n\t },\n\t created: function created() {\n\t this._input = true;\n\t this._timeout = {};\n\t var parent = this.$parent;\n\t while (parent && !parent._formValidator) {\n\t parent = parent.$parent;\n\t }\n\t if (parent && parent._formValidator) {\n\t parent.children.push(this);\n\t this._parent = parent;\n\t }\n\t this._url = (0, _utils.delayer)(function () {\n\t var _this3 = this;\n\t\n\t if (!this.url || !this.$http || this._loading) {\n\t return;\n\t }\n\t this._loading = true;\n\t this.$http.get(this.url).then(function (response) {\n\t var data = response.data instanceof Array ? response.data : [];\n\t try {\n\t data = JSON.parse(data);\n\t } catch (e) {}\n\t if (_this3.urlMap) {\n\t data = data.map(_this3.urlMap);\n\t }\n\t _this3.options = data;\n\t _this3.loading = false;\n\t }, function (response) {\n\t _this3.loading = false;\n\t });\n\t }, DELAY);\n\t if (this.url) this._url();\n\t },\n\t mounted: function mounted() {\n\t // $(this.input).on('focus', e => { this.$emit('focus', e) }).on('blur', e => {\n\t // if (this.canValidate) { this.valid = this.validate() }\n\t // this.$emit('blur', e)\n\t // })\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t // $(this.input).off()\n\t if (this._parent) {\n\t var index = this._parent.children.indexOf(this);\n\t this._parent.children.splice(index, 1);\n\t }\n\t }\n\t};\n\n/***/ },\n/* 118 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t staticClass: \"form-group\",\n\t class: {\n\t validate: _vm.canValidate, 'has-feedback': _vm.icon, 'has-error': _vm.canValidate && _vm.valid === false, 'has-success': _vm.canValidate && _vm.valid\n\t }\n\t }, [_vm._t(\"label\", [(_vm.label) ? _vm._c('label', {\n\t staticClass: \"control-label\",\n\t on: {\n\t \"click\": _vm.focus\n\t }\n\t }, [_vm._v(_vm._s(_vm.label))]) : _vm._e()]), _vm._v(\" \"), (_vm.$slots.before || _vm.$slots.after) ? _vm._c('div', {\n\t staticClass: \"input-group\"\n\t }, [_vm._t(\"before\"), _vm._v(\" \"), _vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.val),\n\t expression: \"val\"\n\t }],\n\t ref: \"input\",\n\t tag: \"textarea\",\n\t staticClass: \"form-control\",\n\t attrs: {\n\t \"cols\": _vm.cols,\n\t \"disabled\": _vm.disabled,\n\t \"list\": _vm.id_datalist,\n\t \"max\": _vm.attr(_vm.max),\n\t \"maxlength\": _vm.maxlength,\n\t \"min\": _vm.attr(_vm.min),\n\t \"name\": _vm.name,\n\t \"placeholder\": _vm.placeholder,\n\t \"readonly\": _vm.readonly,\n\t \"required\": _vm.required,\n\t \"rows\": _vm.rows,\n\t \"step\": _vm.step,\n\t \"title\": _vm.attr(_vm.title),\n\t \"type\": _vm.type == 'textarea' ? null : _vm.type\n\t },\n\t domProps: {\n\t \"value\": _vm._s(_vm.val)\n\t },\n\t on: {\n\t \"blur\": _vm.emit,\n\t \"focus\": _vm.emit,\n\t \"input\": [function($event) {\n\t if ($event.target.composing) { return; }\n\t _vm.val = $event.target.value\n\t }, _vm.emit],\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"enter\", 13)) { return; }\n\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\n\t }\n\t }\n\t }), _vm._v(\" \"), (_vm.clearButton && _vm.value) ? _vm._c('div', {\n\t class: {\n\t icon: _vm.icon\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"close\",\n\t on: {\n\t \"click\": function($event) {\n\t _vm.value = ''\n\t }\n\t }\n\t }, [_vm._v(\"×\")])]) : _vm._e(), _vm._v(\" \"), (_vm.icon) ? _vm._c('div', {\n\t staticClass: \"icon\"\n\t }, [(_vm.icon && _vm.valid !== null) ? _vm._c('span', {\n\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t }\n\t }) : _vm._e()]) : _vm._e(), _vm._v(\" \"), _vm._t(\"after\")], 2) : [_vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.val),\n\t expression: \"val\"\n\t }],\n\t ref: \"input\",\n\t tag: \"textarea\",\n\t staticClass: \"form-control\",\n\t attrs: {\n\t \"cols\": _vm.cols,\n\t \"disabled\": _vm.disabled,\n\t \"list\": _vm.id_datalist,\n\t \"max\": _vm.attr(_vm.max),\n\t \"maxlength\": _vm.maxlength,\n\t \"min\": _vm.attr(_vm.min),\n\t \"name\": _vm.name,\n\t \"placeholder\": _vm.placeholder,\n\t \"readonly\": _vm.readonly,\n\t \"required\": _vm.required,\n\t \"rows\": _vm.rows,\n\t \"step\": _vm.step,\n\t \"title\": _vm.attr(_vm.title),\n\t \"type\": _vm.type == 'textarea' ? null : _vm.type\n\t },\n\t domProps: {\n\t \"value\": _vm._s(_vm.val)\n\t },\n\t on: {\n\t \"blur\": _vm.emit,\n\t \"focus\": _vm.emit,\n\t \"input\": [function($event) {\n\t if ($event.target.composing) { return; }\n\t _vm.val = $event.target.value\n\t }, _vm.emit],\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"enter\", 13)) { return; }\n\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\n\t }\n\t }\n\t }), _vm._v(\" \"), (_vm.clearButton && _vm.val) ? _vm._c('span', {\n\t staticClass: \"close\",\n\t on: {\n\t \"click\": function($event) {\n\t _vm.val = ''\n\t }\n\t }\n\t }, [_vm._v(\"×\")]) : _vm._e(), _vm._v(\" \"), (_vm.icon && _vm.valid !== null) ? _vm._c('span', {\n\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\n\t attrs: {\n\t \"aria-hidden\": \"true\"\n\t }\n\t }) : _vm._e()], _vm._v(\" \"), (_vm.id_datalist) ? _vm._c('datalist', {\n\t attrs: {\n\t \"id\": _vm.id_datalist\n\t }\n\t }, _vm._l((_vm.options), function(opc) {\n\t return _vm._c('option', {\n\t domProps: {\n\t \"value\": opc\n\t }\n\t })\n\t })) : _vm._e(), _vm._v(\" \"), (_vm.showHelp) ? _vm._c('div', {\n\t staticClass: \"help-block\",\n\t on: {\n\t \"click\": _vm.focus\n\t }\n\t }, [_vm._v(_vm._s(_vm.help))]) : _vm._e(), _vm._v(\" \"), (_vm.showError) ? _vm._c('div', {\n\t staticClass: \"help-block with-errors\",\n\t on: {\n\t \"click\": _vm.focus\n\t }\n\t }, [_vm._v(_vm._s(_vm.errorText))]) : _vm._e()], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-652ad7b9\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 119 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(120)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(122)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(127)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Modal.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-fe7d5dc8\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-fe7d5dc8\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Modal.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 120 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 122 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _isInteger = __webpack_require__(123);\n\t\n\tvar _isInteger2 = _interopRequireDefault(_isInteger);\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t props: {\n\t backdrop: { type: Boolean, default: true },\n\t callback: { type: Function, default: null },\n\t cancelText: { type: String, default: 'Close' },\n\t effect: { type: String, default: null },\n\t large: { type: Boolean, default: false },\n\t okText: { type: String, default: 'Save changes' },\n\t small: { type: Boolean, default: false },\n\t title: { type: String, default: '' },\n\t value: { type: Boolean, required: true },\n\t width: { default: null }\n\t },\n\t computed: {\n\t optionalWidth: function optionalWidth() {\n\t if (this.width === null) {\n\t return null;\n\t } else if ((0, _isInteger2.default)(this.width)) {\n\t return this.width + 'px';\n\t }\n\t return this.width;\n\t }\n\t },\n\t watch: {\n\t value: function value(val) {\n\t this.transitionstart();\n\t }\n\t },\n\t methods: {\n\t backClose: function backClose(e) {\n\t if (this.backdrop && e.target === this.$el) {\n\t this.close();\n\t }\n\t },\n\t close: function close() {\n\t this.$emit('cancel');\n\t this.$emit('input', false);\n\t },\n\t ok: function ok() {\n\t if (this.callback instanceof Function) this.callback();\n\t this.$emit('ok');\n\t this.$emit('input', true);\n\t },\n\t transitionstart: function transitionstart() {\n\t var el = this.$el;\n\t var body = document.body;\n\t var scrollBarWidth = (0, _utils.getScrollBarWidth)();\n\t if (this.value) {\n\t el.querySelector('.modal-content').focus();\n\t el.style.display = 'block';\n\t setTimeout(function () {\n\t return el.classList.add('in');\n\t }, 0);\n\t body.classList.add('modal-open');\n\t if (scrollBarWidth !== 0) {\n\t body.style.paddingRight = scrollBarWidth + 'px';\n\t }\n\t } else {\n\t el.classList.remove('in');\n\t }\n\t },\n\t transitionend: function transitionend() {\n\t if (!this.value) {\n\t this.$el.style.display = 'none';\n\t var body = document.body;\n\t body.style.paddingRight = null;\n\t body.classList.remove('modal-open');\n\t }\n\t }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 123 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(124), __esModule: true };\n\n/***/ },\n/* 124 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(125);\n\tmodule.exports = __webpack_require__(7).Number.isInteger;\n\n/***/ },\n/* 125 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.3 Number.isInteger(number)\n\tvar $export = __webpack_require__(5);\n\t\n\t$export($export.S, 'Number', {isInteger: __webpack_require__(126)});\n\n/***/ },\n/* 126 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 20.1.2.3 Number.isInteger(number)\n\tvar isObject = __webpack_require__(13)\n\t , floor = Math.floor;\n\tmodule.exports = function isInteger(it){\n\t return !isObject(it) && isFinite(it) && floor(it) === it;\n\t};\n\n/***/ },\n/* 127 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: ['modal', _vm.effect],\n\t attrs: {\n\t \"role\": \"dialog\"\n\t },\n\t on: {\n\t \"click\": _vm.backClose,\n\t \"transitionend\": _vm.transitionend\n\t }\n\t }, [_vm._c('div', {\n\t class: {\n\t 'modal-dialog': true, 'modal-lg': _vm.large, 'modal-sm': _vm.small\n\t },\n\t style: ({\n\t width: _vm.optionalWidth\n\t }),\n\t attrs: {\n\t \"role\": \"document\"\n\t }\n\t }, [_vm._c('div', {\n\t staticClass: \"modal-content\"\n\t }, [_vm._t(\"modal-header\", [_vm._c('div', {\n\t staticClass: \"modal-header\"\n\t }, [_vm._c('button', {\n\t staticClass: \"close\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.close\n\t }\n\t }, [_vm._c('span', [_vm._v(\"×\")])]), _vm._v(\" \"), _vm._c('h4', {\n\t staticClass: \"modal-title\"\n\t }, [_vm._t(\"title\", [_vm._v(_vm._s(_vm.title))])], 2)])]), _vm._v(\" \"), _vm._t(\"modal-body\", [_vm._c('div', {\n\t staticClass: \"modal-body\"\n\t }, [_vm._t(\"default\")], 2)]), _vm._v(\" \"), _vm._t(\"modal-footer\", [_vm._c('div', {\n\t staticClass: \"modal-footer\"\n\t }, [_vm._c('button', {\n\t staticClass: \"btn btn-default\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.close\n\t }\n\t }, [_vm._v(_vm._s(_vm.cancelText))]), _vm._v(\" \"), _vm._c('button', {\n\t staticClass: \"btn btn-primary\",\n\t attrs: {\n\t \"type\": \"button\"\n\t },\n\t on: {\n\t \"click\": _vm.ok\n\t }\n\t }, [_vm._v(_vm._s(_vm.okText))])])])], 2)])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-fe7d5dc8\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 128 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(129)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(130)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Navbar.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-38f0619e\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-38f0619e\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Navbar.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 129 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t props: {\n\t type: { type: String, default: 'default' },\n\t placement: { type: String, default: '' }\n\t },\n\t data: function data() {\n\t return {\n\t id: 'bs-example-navbar-collapse-1',\n\t collapsed: true,\n\t styles: {}\n\t };\n\t },\n\t\n\t computed: {\n\t slots: function slots() {\n\t return this._slotContents;\n\t }\n\t },\n\t methods: {\n\t toggleCollapse: function toggleCollapse(e) {\n\t e && e.preventDefault();\n\t this.collapsed = !this.collapsed;\n\t }\n\t },\n\t created: function created() {\n\t this._navbar = true;\n\t },\n\t mounted: function mounted() {\n\t var _this = this;\n\t\n\t try {\n\t (function () {\n\t var $dropdown = (0, _NodeList2.default)('.dropdown>[data-toggle=\"dropdown\"]', _this.$el).parent();\n\t if ($dropdown) {\n\t $dropdown.on('click', '.dropdown-toggle', function (e) {\n\t e.preventDefault();\n\t $dropdown.each(function (content) {\n\t if (content.contains(e.target)) content.classList.toggle('open');\n\t });\n\t }).on('click', '.dropdown-menu>li>a', function (e) {\n\t $dropdown.each(function (content) {\n\t if (content.contains(e.target)) content.classList.remove('open');\n\t });\n\t }).onBlur(function (e) {\n\t $dropdown.each(function (content) {\n\t if (!content.contains(e.target)) content.classList.remove('open');\n\t });\n\t });\n\t }\n\t })();\n\t } catch (ex) {\n\t console.log('error finding dropdown');\n\t }\n\t\n\t (0, _NodeList2.default)(this.$el).on('click touchstart', 'li:not(.dropdown)>a', function (e) {\n\t setTimeout(function () {\n\t _this.collapsed = true;\n\t }, 200);\n\t }).onBlur(function (e) {\n\t if (!_this.$el.contains(e.target)) {\n\t _this.collapsed = true;\n\t }\n\t });\n\t var height = this.$el.offsetHeight;\n\t if (this.placement === 'top') {\n\t document.body.style.paddingTop = height + 'px';\n\t }\n\t if (this.placement === 'bottom') {\n\t document.body.style.paddingBottom = height + 'px';\n\t }\n\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\"collapse\"]', this.$el).on('click', function (e) {\n\t return _this.toggleCollapse(e);\n\t });\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t (0, _NodeList2.default)('.dropdown', this.$el).off('click').offBlur();\n\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\"collapse\"]', this.$el).off('click');\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 130 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('nav', {\n\t class: ['navbar', 'navbar-' + _vm.type, _vm.placement === 'static' ? 'navbar-static-top' : 'navbar-fixed-' + _vm.placement]\n\t }, [_vm._c('div', {\n\t staticClass: \"container-fluid\"\n\t }, [_vm._c('div', {\n\t staticClass: \"navbar-header\"\n\t }, [(!_vm.$slots.collapse) ? _vm._c('button', {\n\t staticClass: \"navbar-toggle collapsed\",\n\t attrs: {\n\t \"type\": \"button\",\n\t \"aria-expanded\": \"false\"\n\t },\n\t on: {\n\t \"click\": _vm.toggleCollapse\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"sr-only\"\n\t }, [_vm._v(\"Toggle navigation\")]), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"icon-bar\"\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"icon-bar\"\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"icon-bar\"\n\t })]) : _vm._e(), _vm._v(\" \"), _vm._t(\"collapse\"), _vm._v(\" \"), _vm._t(\"brand\")], 2), _vm._v(\" \"), _vm._c('div', {\n\t class: ['navbar-collapse', {\n\t collapse: _vm.collapsed\n\t }]\n\t }, [_vm._c('ul', {\n\t staticClass: \"nav navbar-nav\"\n\t }, [_vm._t(\"default\")], 2), _vm._v(\" \"), (_vm.$slots.left) ? _vm._c('ul', {\n\t staticClass: \"nav navbar-nav navbar-left\"\n\t }, [_vm._t(\"left\")], 2) : _vm._e(), _vm._v(\" \"), (_vm.$slots.right) ? _vm._c('ul', {\n\t staticClass: \"nav navbar-nav navbar-right\"\n\t }, [_vm._t(\"right\")], 2) : _vm._e()])])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-38f0619e\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 131 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(132)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(133)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Option.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-42088116\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-42088116\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Option.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 132 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t\n\texports.default = {\n\t props: { value: null },\n\t data: function data() {\n\t return { loading: true };\n\t },\n\t mounted: function mounted() {\n\t if (this.$parent._select) {\n\t if (!this.$parent.options) {\n\t this.$parent.options = [];\n\t }\n\t var el = {};\n\t el[this.$parent.optionsLabel] = this.$el.innerHTML;\n\t el[this.$parent.optionsValue] = this.value;\n\t this.$parent.options.push(el);\n\t this.loading = false;\n\t } else {\n\t console.warn('options only work inside a select component');\n\t }\n\t }\n\t};\n\n/***/ },\n/* 133 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return (_vm.loading) ? _vm._c('li', [_vm._t(\"default\")], 2) : _vm._e()\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-42088116\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 134 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(135)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(137)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(138)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Panel.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-b1e0461a\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-b1e0461a\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Panel.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 135 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 137 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t header: { type: String },\n\t isOpen: { type: Boolean, default: null },\n\t type: { type: String, default: null }\n\t },\n\t data: function data() {\n\t return {\n\t open: this.isOpen\n\t };\n\t },\n\t\n\t watch: {\n\t isOpen: function isOpen(val) {\n\t this.open = val;\n\t }\n\t },\n\t computed: {\n\t inAccordion: function inAccordion() {\n\t return this.$parent && this.$parent._isAccordion;\n\t },\n\t panelType: function panelType() {\n\t return 'panel-' + (this.type || this.$parent && this.$parent.type || 'default');\n\t }\n\t },\n\t methods: {\n\t toggle: function toggle() {\n\t this.open = !this.open;\n\t if (this.inAccordion) {\n\t this.$parent.openChild(this);\n\t }\n\t },\n\t enter: function enter(el) {\n\t el.style.height = 'auto';\n\t var endWidth = getComputedStyle(el).height;\n\t el.style.height = '0px';\n\t el.offsetHeight; // force repaint\n\t el.style.height = endWidth;\n\t },\n\t afterEnter: function afterEnter(el) {\n\t el.style.height = 'auto';\n\t },\n\t beforeLeave: function beforeLeave(el) {\n\t el.style.height = getComputedStyle(el).height;\n\t el.offsetHeight; // force repaint\n\t el.style.height = '0px';\n\t }\n\t },\n\t created: function created() {\n\t if (this.isOpen === null) {\n\t this.open = !this.inAccordion;\n\t }\n\t }\n\t};\n\n/***/ },\n/* 138 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: ['panel', _vm.panelType]\n\t }, [_vm._c('div', {\n\t class: ['panel-heading', {\n\t 'accordion-toggle': _vm.inAccordion\n\t }],\n\t on: {\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.inAccordion && _vm.toggle()\n\t }\n\t }\n\t }, [_vm._t(\"header\", [_vm._c('h4', {\n\t staticClass: \"panel-title\"\n\t }, [_vm._v(_vm._s(_vm.header))])])], 2), _vm._v(\" \"), _vm._c('transition', {\n\t attrs: {\n\t \"name\": \"collapse\"\n\t },\n\t on: {\n\t \"enter\": _vm.enter,\n\t \"after-enter\": _vm.afterEnter,\n\t \"before-leave\": _vm.beforeLeave\n\t }\n\t }, [(_vm.open) ? _vm._c('div', {\n\t staticClass: \"panel-collapse\"\n\t }, [_vm._c('div', {\n\t staticClass: \"panel-body\"\n\t }, [_vm._t(\"default\")], 2)]) : _vm._e()])], 1)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-b1e0461a\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 139 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(140)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(142)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(144)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Popover.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-2465bf54\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-2465bf54\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Popover.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 140 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 142 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _popoverMixins = __webpack_require__(143);\n\t\n\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t mixins: [_popoverMixins2.default],\n\t props: {\n\t trigger: { type: String, default: 'click' }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 143 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _NodeList = __webpack_require__(1);\n\t\n\tvar _NodeList2 = _interopRequireDefault(_NodeList);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t props: {\n\t content: { type: String },\n\t effect: { type: String, default: 'fade' },\n\t header: { type: Boolean, default: true },\n\t placement: { type: String, default: 'top' },\n\t title: { type: String },\n\t trigger: { type: String }\n\t },\n\t data: function data() {\n\t return {\n\t top: 0,\n\t left: 0,\n\t show: false\n\t };\n\t },\n\t\n\t computed: {\n\t events: function events() {\n\t return { contextmenu: ['contextmenu'], hover: ['mouseleave', 'mouseenter'], focus: ['blur', 'focus'] }[this.trigger] || ['click'];\n\t }\n\t },\n\t methods: {\n\t beforeEnter: function beforeEnter() {\n\t var _this = this;\n\t\n\t this.position();\n\t setTimeout(function () {\n\t return _this.position();\n\t }, 30);\n\t },\n\t position: function position() {\n\t var _this2 = this;\n\t\n\t this.$nextTick(function () {\n\t var popover = _this2.$refs.popover;\n\t var trigger = _this2.$refs.trigger.children[0];\n\t switch (_this2.placement) {\n\t case 'top':\n\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\n\t _this2.top = trigger.offsetTop - popover.offsetHeight;\n\t break;\n\t case 'left':\n\t _this2.left = trigger.offsetLeft - popover.offsetWidth;\n\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\n\t break;\n\t case 'right':\n\t _this2.left = trigger.offsetLeft + trigger.offsetWidth;\n\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\n\t break;\n\t case 'bottom':\n\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\n\t _this2.top = trigger.offsetTop + trigger.offsetHeight;\n\t break;\n\t default:\n\t console.warn('Wrong placement prop');\n\t }\n\t popover.style.top = _this2.top + 'px';\n\t popover.style.left = _this2.left + 'px';\n\t });\n\t },\n\t toggle: function toggle(e) {\n\t if (e && this.trigger === 'contextmenu') e.preventDefault();\n\t this.show = !this.show;\n\t if (this.show) this.beforeEnter();\n\t }\n\t },\n\t mounted: function mounted() {\n\t var _this3 = this;\n\t\n\t var trigger = this.$refs.trigger.children[0];\n\t if (!trigger) return console.error('Could not find trigger v-el in your component that uses popoverMixin.');\n\t\n\t if (this.trigger === 'focus' && !~trigger.tabIndex) {\n\t trigger = (0, _NodeList2.default)('a,input,select,textarea,button', trigger);\n\t if (!trigger.length) {\n\t return;\n\t }\n\t }\n\t this.events.forEach(function (event) {\n\t (0, _NodeList2.default)(trigger).on(event, _this3.toggle);\n\t });\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._trigger) (0, _NodeList2.default)(this._trigger).off();\n\t }\n\t};\n\n/***/ },\n/* 144 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', {\n\t ref: \"trigger\"\n\t }, [_vm._t(\"default\"), _vm._v(\" \"), _vm._c('transition', {\n\t attrs: {\n\t \"name\": _vm.effect\n\t }\n\t }, [(_vm.show) ? _vm._c('div', {\n\t ref: \"popover\",\n\t class: ['popover', _vm.placement]\n\t }, [_vm._c('div', {\n\t staticClass: \"arrow\"\n\t }), _vm._v(\" \"), (_vm.title) ? _vm._c('h3', {\n\t staticClass: \"popover-title\"\n\t }, [_vm._t(\"title\", [_vm._v(_vm._s(_vm.title))])], 2) : _vm._e(), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"popover-content\"\n\t }, [_vm._t(\"content\", [_vm._c('span', {\n\t domProps: {\n\t \"innerHTML\": _vm._s(_vm.content)\n\t }\n\t })])], 2)]) : _vm._e()])], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-2465bf54\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 145 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(146)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(147)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Progressbar.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-68aa3375\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-68aa3375\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Progressbar.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 146 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\texports.default = {\n\t props: {\n\t animated: { type: Boolean, default: false },\n\t label: { default: false },\n\t now: { required: true },\n\t striped: { type: Boolean, default: false },\n\t type: { type: String }\n\t },\n\t computed: {\n\t labelBool: function labelBool() {\n\t return _utils.coerce.boolean(this.label);\n\t },\n\t nowNum: function nowNum() {\n\t return _utils.coerce.number(this.now);\n\t }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 147 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: ['progress-bar', 'progress-bar-' + _vm.type, {\n\t active: _vm.animated,\n\t 'progress-bar-striped': _vm.striped\n\t }],\n\t style: ({\n\t width: _vm.nowNum + '%'\n\t }),\n\t domProps: {\n\t \"textContent\": _vm._s(_vm.labelBool ? _vm.nowNum + '%' : null)\n\t }\n\t })\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-68aa3375\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 148 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(149)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(151)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(152)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Radio.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-74cfd92c\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-74cfd92c\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Radio.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 149 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 151 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t button: { type: Boolean, default: false },\n\t checkedValue: { default: true },\n\t disabled: { type: Boolean, default: false },\n\t name: { type: String, default: null },\n\t readonly: { type: Boolean, default: false },\n\t type: { type: String, default: null },\n\t value: { default: false }\n\t },\n\t data: function data() {\n\t return {\n\t check: this.value\n\t };\n\t },\n\t\n\t computed: {\n\t active: function active() {\n\t return this.check === this.checkedValue;\n\t },\n\t parentValue: function parentValue() {\n\t return this._inGroup ? this.$parent.val === this.value : null;\n\t },\n\t buttonStyle: function buttonStyle() {\n\t return this.button || this._inGroup && this.$parent.buttons;\n\t },\n\t typeColor: function typeColor() {\n\t return this.type || this.$parent && this.$parent.type || 'default';\n\t }\n\t },\n\t watch: {\n\t check: function check(val) {\n\t if (this.checkedValue === val) {\n\t this.$emit('input', val);\n\t this.$emit('checked', true);\n\t if (this._inGroup) {\n\t this.$parent.val = val;\n\t }\n\t }\n\t },\n\t parentValue: function parentValue(val) {\n\t if (this.check !== val && this.checkedValue === val) {\n\t this.check = val;\n\t }\n\t },\n\t value: function value(val) {\n\t this.check = this.checkedValue === val ? val : null;\n\t }\n\t },\n\t created: function created() {\n\t var parent = this.$parent;\n\t if (parent && parent._btnGroup && !parent._checkboxGroup) {\n\t this._inGroup = true;\n\t parent._radioGroup = true;\n\t }\n\t if (this.$parent._radioGroup) {\n\t if (this.$parent.val) {\n\t this.check = this.$parent.val === this.checkedValue;\n\t } else if (this.check) {\n\t this.$parent.val = this.checkedValue;\n\t }\n\t }\n\t },\n\t\n\t methods: {\n\t focus: function focus() {\n\t this.$refs.input.focus();\n\t },\n\t toggle: function toggle() {\n\t if (this.disabled) {\n\t return;\n\t }\n\t this.focus();\n\t if (this.readonly) {\n\t return;\n\t }\n\t this.check = this.checkedValue;\n\t if (this._inGroup) {\n\t this.$parent.val = this.checkedValue;\n\t }\n\t }\n\t }\n\t};\n\n/***/ },\n/* 152 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c(_vm.buttonStyle ? 'label' : 'div', {\n\t tag: \"div\",\n\t class: [(_vm.buttonStyle ? 'btn btn-' + _vm.typeColor : 'radio ' + _vm.typeColor), {\n\t active: _vm.active,\n\t disabled: _vm.disabled,\n\t readonly: _vm.readonly\n\t }],\n\t on: {\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }\n\t }\n\t }, [(_vm.buttonStyle) ? [_vm._c('input', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (!_vm.readonly),\n\t expression: \"!readonly\"\n\t }, {\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.check),\n\t expression: \"check\"\n\t }],\n\t ref: \"input\",\n\t attrs: {\n\t \"type\": \"radio\",\n\t \"autocomplete\": \"off\",\n\t \"name\": _vm.name,\n\t \"readonly\": _vm.readonly,\n\t \"disabled\": _vm.disabled\n\t },\n\t domProps: {\n\t \"value\": _vm.checkedValue,\n\t \"checked\": _vm._q(_vm.check, _vm.checkedValue)\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.check = _vm.checkedValue\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._t(\"default\")] : _vm._c('label', {\n\t staticClass: \"open\"\n\t }, [_vm._c('input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.check),\n\t expression: \"check\"\n\t }],\n\t ref: \"input\",\n\t attrs: {\n\t \"type\": \"radio\",\n\t \"autocomplete\": \"off\",\n\t \"name\": _vm.name,\n\t \"readonly\": _vm.readonly,\n\t \"disabled\": _vm.disabled\n\t },\n\t domProps: {\n\t \"value\": _vm.checkedValue,\n\t \"checked\": _vm._q(_vm.check, _vm.checkedValue)\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t _vm.check = _vm.checkedValue\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t staticClass: \"icon dropdown-toggle\",\n\t class: [_vm.active ? 'btn-' + _vm.typeColor : '', {\n\t bg: _vm.typeColor === 'default'\n\t }]\n\t }), _vm._v(\" \"), (_vm.active && _vm.typeColor === 'default') ? _vm._c('span', {\n\t staticClass: \"icon\"\n\t }) : _vm._e(), _vm._v(\" \"), _vm._t(\"default\")], 2)], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-74cfd92c\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 153 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(154)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(156)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(157)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Select.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t__vue_options__._scopeId = \"data-v-e514dbc6\"\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-e514dbc6\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-e514dbc6\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Select.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 154 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 156 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar _ClickOutside = __webpack_require__(66);\n\t\n\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\tvar timeout = {};\n\texports.default = {\n\t directives: {\n\t ClickOutside: _ClickOutside2.default\n\t },\n\t props: {\n\t clearButton: { type: Boolean, default: false },\n\t closeOnSelect: { type: Boolean, default: false },\n\t disabled: { type: Boolean, default: false },\n\t lang: { type: String, default: navigator.language },\n\t limit: { type: Number, default: 1024 },\n\t minSearch: { type: Number, default: 0 },\n\t multiple: { type: Boolean, default: false },\n\t name: { type: String, default: null },\n\t options: { type: Array, default: function _default() {\n\t return [];\n\t }\n\t },\n\t optionsLabel: { type: String, default: 'label' },\n\t optionsValue: { type: String, default: 'value' },\n\t parent: { default: true },\n\t placeholder: { type: String, default: null },\n\t readonly: { type: Boolean, default: null },\n\t required: { type: Boolean, default: null },\n\t search: { type: Boolean, default: false },\n\t searchText: { type: String, default: null },\n\t url: { type: String, default: null },\n\t value: null\n\t },\n\t data: function data() {\n\t return {\n\t list: [],\n\t loading: null,\n\t searchValue: null,\n\t show: false,\n\t notify: false,\n\t val: null,\n\t valid: null\n\t };\n\t },\n\t\n\t computed: {\n\t canSearch: function canSearch() {\n\t return this.minSearch ? this.list.length >= this.minSearch : this.search;\n\t },\n\t classes: function classes() {\n\t return [{ open: this.show, disabled: this.disabled }, this.class, this.isLi ? 'dropdown' : this.inInput ? 'input-group-btn' : 'btn-group'];\n\t },\n\t filteredOptions: function filteredOptions() {\n\t var _this = this;\n\t\n\t var search = (this.searchValue || '').toLowerCase();\n\t return !search ? this.list : this.list.filter(function (el) {\n\t return ~el[_this.optionsLabel].toLowerCase().search(search);\n\t });\n\t },\n\t hasParent: function hasParent() {\n\t return this.parent instanceof Array ? this.parent.length : this.parent;\n\t },\n\t inInput: function inInput() {\n\t return this.$parent._input;\n\t },\n\t isLi: function isLi() {\n\t return this.$parent._navbar || this.$parent.menu || this.$parent._tabset;\n\t },\n\t limitText: function limitText() {\n\t return this.text.limit.replace('{{limit}}', this.limit);\n\t },\n\t selected: function selected() {\n\t var _this2 = this;\n\t\n\t if (this.list.length === 0) {\n\t return '';\n\t }\n\t var sel = this.values.map(function (val) {\n\t return (_this2.list.find(function (o) {\n\t return o[_this2.optionsValue] === val;\n\t }) || {})[_this2.optionsLabel];\n\t }).filter(function (val) {\n\t return val !== undefined;\n\t });\n\t this.$emit('selected', sel);\n\t return sel.join(', ');\n\t },\n\t showPlaceholder: function showPlaceholder() {\n\t return this.values.length === 0 || !this.hasParent ? this.placeholder || this.text.notSelected : null;\n\t },\n\t text: function text() {\n\t return (0, _utils.translations)(this.lang);\n\t },\n\t values: function values() {\n\t return this.val instanceof Array ? this.val : ~[null, undefined].indexOf(this.val) ? [] : [this.val];\n\t },\n\t valOptions: function valOptions() {\n\t var _this3 = this;\n\t\n\t return this.list.map(function (el) {\n\t return el[_this3.optionsValue];\n\t });\n\t }\n\t },\n\t watch: {\n\t options: function options(_options) {\n\t if (_options instanceof Array) this.setOptions(_options);\n\t },\n\t show: function show(val) {\n\t if (val) {\n\t this.$refs.search ? this.$refs.search.focus() : this.$refs.btn.focus();\n\t // onBlur(this.$refs.select, e => { this.show = false })\n\t } else {\n\t // offBlur(this.$refs.select)\n\t }\n\t },\n\t url: function url() {\n\t this.urlChanged();\n\t },\n\t valid: function valid(val, old) {\n\t this.$emit('isvalid', val);\n\t this.$emit(!val ? 'invalid' : 'valid');\n\t if (val !== old && this._parent) this._parent.validate();\n\t },\n\t value: function value(val, old) {\n\t if (val !== old) {\n\t this.val = val;\n\t }\n\t },\n\t val: function val(_val, old) {\n\t var _this4 = this;\n\t\n\t if (_val === undefined) {\n\t this.val = _val = null;\n\t }\n\t if (_val !== old) {\n\t this.$emit('change', _val);\n\t this.$emit('input', _val);\n\t }\n\t if (_val instanceof Array && _val.length > this.limit) {\n\t this.val = _val.slice(0, this.limit);\n\t this.notify = true;\n\t if (timeout.limit) clearTimeout(timeout.limit);\n\t timeout.limit = setTimeout(function () {\n\t timeout.limit = false;\n\t _this4.notify = false;\n\t }, 1500);\n\t }\n\t this.valid = this.validate();\n\t }\n\t },\n\t methods: {\n\t close: function close() {\n\t this.show = false;\n\t },\n\t checkData: function checkData() {\n\t if (this.multiple) {\n\t if (this.limit < 1) {\n\t this.limit = 1;\n\t }\n\t if (!(this.val instanceof Array)) {\n\t this.val = this.val === null || this.val === undefined ? [] : [this.val];\n\t }\n\t var values = this.valOptions;\n\t this.val = this.val.filter(function (el) {\n\t return ~values.indexOf(el);\n\t });\n\t if (this.values.length > this.limit) {\n\t this.val = this.val.slice(0, this.limit);\n\t }\n\t } else {\n\t if (!~this.valOptions.indexOf(this.val)) {\n\t this.val = null;\n\t }\n\t }\n\t },\n\t clear: function clear() {\n\t if (this.disabled || this.readonly) {\n\t return;\n\t }\n\t this.val = this.val instanceof Array ? [] : null;\n\t this.toggle();\n\t },\n\t clearSearch: function clearSearch() {\n\t this.searchValue = '';\n\t this.$refs.search.focus();\n\t },\n\t isSelected: function isSelected(v) {\n\t return this.values.indexOf(v) > -1;\n\t },\n\t select: function select(v) {\n\t if (this.val instanceof Array) {\n\t var newVal = this.val.slice(0);\n\t if (~newVal.indexOf(v)) {\n\t newVal.splice(newVal.indexOf(v), 1);\n\t } else {\n\t newVal.push(v);\n\t }\n\t this.val = newVal;\n\t if (this.closeOnSelect) {\n\t this.toggle();\n\t }\n\t } else {\n\t this.val = v;\n\t this.toggle();\n\t }\n\t },\n\t setOptions: function setOptions(options) {\n\t var _this5 = this;\n\t\n\t this.list = options.map(function (el) {\n\t if (el instanceof Object) {\n\t return el;\n\t }\n\t var obj = {};\n\t obj[_this5.optionsLabel] = el;\n\t obj[_this5.optionsValue] = el;\n\t return obj;\n\t });\n\t this.$emit('options', this.list);\n\t },\n\t toggle: function toggle() {\n\t this.show = !this.show;\n\t if (!this.show) this.$refs.btn.focus();\n\t },\n\t urlChanged: function urlChanged() {\n\t var _this6 = this;\n\t\n\t if (!this.url || !this.$http) {\n\t return;\n\t }\n\t this.loading = true;\n\t this.$http.get(this.url).then(function (response) {\n\t var data = response.data instanceof Array ? response.data : [];\n\t try {\n\t data = JSON.parse(data);\n\t } catch (e) {}\n\t _this6.setOptions(data);\n\t _this6.loading = false;\n\t _this6.checkData();\n\t }, function (response) {\n\t _this6.loading = false;\n\t });\n\t },\n\t validate: function validate() {\n\t return !this.required ? true : this.val instanceof Array ? this.val.length > 0 : this.val !== null;\n\t }\n\t },\n\t created: function created() {\n\t this.setOptions(this.options);\n\t this.val = this.value;\n\t this._select = true;\n\t if (this.val === undefined || !this.parent) {\n\t this.val = null;\n\t }\n\t if (!this.multiple && this.val instanceof Array) {\n\t this.val = this.val[0];\n\t }\n\t this.checkData();\n\t if (this.url) this.urlChanged();\n\t var parent = this.$parent;\n\t while (parent && !parent._formValidator) {\n\t parent = parent.$parent;\n\t }\n\t if (parent && parent._formValidator) {\n\t parent.children.push(this);\n\t this._parent = parent;\n\t }\n\t },\n\t mounted: function mounted() {\n\t if (this._parent) this._parent.children.push(this);\n\t this.setOptions(this.options);\n\t this.val = this.value;\n\t this.checkData();\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._parent) {\n\t var index = this._parent.children.indexOf(this);\n\t this._parent.children.splice(index, 1);\n\t }\n\t }\n\t};\n\n/***/ },\n/* 157 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t directives: [{\n\t name: \"click-outside\",\n\t rawName: \"v-click-outside\",\n\t value: (_vm.close),\n\t expression: \"close\"\n\t }],\n\t ref: \"select\",\n\t class: _vm.classes\n\t }, [_vm._c('div', {\n\t ref: \"btn\",\n\t staticClass: \"form-control dropdown-toggle\",\n\t attrs: {\n\t \"tabindex\": \"1\",\n\t \"disabled\": _vm.disabled || !_vm.hasParent,\n\t \"readonly\": _vm.readonly\n\t },\n\t on: {\n\t \"blur\": function($event) {\n\t _vm.canSearch ? null : _vm.close()\n\t },\n\t \"click\": function($event) {\n\t _vm.toggle()\n\t },\n\t \"keydown\": [function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t $event.stopPropagation();\n\t $event.preventDefault();\n\t _vm.close($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"space\", 32)) { return; }\n\t $event.stopPropagation();\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"enter\", 13)) { return; }\n\t $event.stopPropagation();\n\t $event.preventDefault();\n\t _vm.toggle($event)\n\t }]\n\t }\n\t }, [_vm._c('span', {\n\t staticClass: \"btn-content\",\n\t domProps: {\n\t \"innerHTML\": _vm._s(_vm.loading ? _vm.text.loading : _vm.showPlaceholder || _vm.selected)\n\t }\n\t }), _vm._v(\" \"), (_vm.clearButton && _vm.values.length) ? _vm._c('span', {\n\t staticClass: \"close\",\n\t on: {\n\t \"click\": function($event) {\n\t _vm.clear()\n\t }\n\t }\n\t }, [_vm._v(\"×\")]) : _vm._e()]), _vm._v(\" \"), _vm._c('select', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.val),\n\t expression: \"val\"\n\t }],\n\t ref: \"sel\",\n\t staticClass: \"secret\",\n\t attrs: {\n\t \"name\": _vm.name,\n\t \"multiple\": _vm.multiple,\n\t \"required\": _vm.required,\n\t \"readonly\": _vm.readonly,\n\t \"disabled\": _vm.disabled\n\t },\n\t on: {\n\t \"change\": function($event) {\n\t _vm.val = Array.prototype.filter.call($event.target.options, function(o) {\n\t return o.selected\n\t }).map(function(o) {\n\t var val = \"_value\" in o ? o._value : o.value;\n\t return val\n\t })[0]\n\t }\n\t }\n\t }, [(_vm.required) ? _vm._c('option', {\n\t attrs: {\n\t \"value\": \"\"\n\t }\n\t }) : _vm._e(), _vm._v(\" \"), _vm._l((_vm.list), function(option) {\n\t return _vm._c('option', {\n\t domProps: {\n\t \"value\": option[_vm.optionsValue]\n\t }\n\t }, [_vm._v(_vm._s(option[_vm.optionsLabel]))])\n\t })], 2), _vm._v(\" \"), _vm._c('ul', {\n\t staticClass: \"dropdown-menu\"\n\t }, [(_vm.list.length) ? [(_vm.canSearch) ? _vm._c('li', {\n\t staticClass: \"bs-searchbox\"\n\t }, [_vm._c('input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.searchValue),\n\t expression: \"searchValue\"\n\t }],\n\t ref: \"search\",\n\t staticClass: \"form-control\",\n\t attrs: {\n\t \"type\": \"text\",\n\t \"placeholder\": _vm.searchText || _vm.text.search,\n\t \"autocomplete\": \"off\"\n\t },\n\t domProps: {\n\t \"value\": _vm._s(_vm.searchValue)\n\t },\n\t on: {\n\t \"keyup\": function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t _vm.close($event)\n\t },\n\t \"input\": function($event) {\n\t if ($event.target.composing) { return; }\n\t _vm.searchValue = $event.target.value\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.searchValue),\n\t expression: \"searchValue\"\n\t }],\n\t staticClass: \"close\",\n\t on: {\n\t \"click\": _vm.clearSearch\n\t }\n\t }, [_vm._v(\"×\")])]) : _vm._e(), _vm._v(\" \"), (_vm.required && !_vm.clearButton) ? _vm._c('li', [_vm._c('a', {\n\t on: {\n\t \"mousedown\": function($event) {\n\t $event.preventDefault();\n\t _vm.clear() && _vm.close()\n\t }\n\t }\n\t }, [_vm._v(_vm._s(_vm.placeholder || _vm.text.notSelected))])]) : _vm._e(), _vm._v(\" \"), _vm._l((_vm.filteredOptions), function(option) {\n\t return _vm._c('li', {\n\t attrs: {\n\t \"id\": option[_vm.optionsValue]\n\t }\n\t }, [_vm._c('a', {\n\t on: {\n\t \"mousedown\": function($event) {\n\t $event.preventDefault();\n\t _vm.select(option[_vm.optionsValue])\n\t }\n\t }\n\t }, [_vm._c('span', {\n\t domProps: {\n\t \"innerHTML\": _vm._s(option[_vm.optionsLabel])\n\t }\n\t }), _vm._v(\" \"), _vm._c('span', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.isSelected(option[_vm.optionsValue])),\n\t expression: \"isSelected(option[optionsValue])\"\n\t }],\n\t staticClass: \"glyphicon glyphicon-ok check-mark\"\n\t })])])\n\t })] : _vm._e(), _vm._v(\" \"), _vm._t(\"default\"), _vm._v(\" \"), (_vm.notify && !_vm.closeOnSelect) ? _vm._c('transition', {\n\t attrs: {\n\t \"name\": \"fadein\"\n\t }\n\t }, [_vm._c('div', {\n\t staticClass: \"notify in\"\n\t }, [_vm._v(_vm._s(_vm.limitText))])]) : _vm._e()], 2), _vm._v(\" \"), (_vm.notify && _vm.closeOnSelect) ? _vm._c('transition', {\n\t attrs: {\n\t \"name\": \"fadein\"\n\t }\n\t }, [_vm._c('div', {\n\t staticClass: \"notify out\"\n\t }, [_vm._c('div', [_vm._v(_vm._s(_vm.limitText))])])]) : _vm._e()], 1)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-e514dbc6\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 158 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(159)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(160)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Slider.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-32185b82\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-32185b82\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Slider.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 159 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t\n\texports.default = {\n\t computed: {\n\t index: function index() {\n\t return this.$parent.$children.indexOf(this);\n\t },\n\t show: function show() {\n\t return this.$parent.index === this.index;\n\t }\n\t },\n\t mounted: function mounted() {\n\t if (this.$parent.indicator_list) {\n\t this.$parent.indicator_list.push(this.index);\n\t }\n\t\n\t if (this.index === 0) {\n\t this.$el.classList.add('active');\n\t }\n\t }\n\t};\n\n/***/ },\n/* 160 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t staticClass: \"item\"\n\t }, [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-32185b82\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 161 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(162)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(164)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(165)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Spinner.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-8b298e70\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-8b298e70\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Spinner.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 162 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 164 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar MIN_WAIT = 500; // in ms\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t fixed: { type: Boolean, default: false },\n\t global: { type: Boolean, default: false },\n\t size: { type: String, default: 'md' },\n\t text: { type: String, default: '' },\n\t value: { default: false }\n\t },\n\t data: function data() {\n\t return {\n\t active: this.value,\n\t locked: false\n\t };\n\t },\n\t\n\t computed: {\n\t spinnerSize: function spinnerSize() {\n\t return 'spinner-' + (this.size ? this.size : 'sm');\n\t }\n\t },\n\t watch: {\n\t active: function active(val, old) {\n\t if (val !== old) this.$emit('input', val);\n\t },\n\t value: function value(val, old) {\n\t if (val !== old) {\n\t this[val ? 'show' : 'hide']();\n\t }\n\t }\n\t },\n\t methods: {\n\t hide: function hide() {\n\t var delay = 0;\n\t this.active = false;\n\t },\n\t show: function show(options) {\n\t if (options) {\n\t if (options.text) {\n\t this.text = options.text;\n\t }\n\t if (options.size) {\n\t this.size = options.size;\n\t }\n\t if (options.fixed) {\n\t this.fixed = options.fixed;\n\t }\n\t }\n\t // block scrolling when spinner is on\n\t this._body.style.overflowY = 'hidden';\n\t // activate spinner\n\t this._started = new Date();\n\t this.active = true;\n\t this.locked = true;\n\t this._unlock();\n\t }\n\t },\n\t created: function created() {\n\t this._body = document.body;\n\t this._bodyOverflow = document.body.style.overflowY;\n\t this._unlock = (0, _utils.delayer)(function () {\n\t this.locked = false;\n\t this._body.style.overflowY = this._bodyOverflow;\n\t }, MIN_WAIT);\n\t if (this.global) {\n\t if (!this.$root._globalSpinner) {\n\t this.$root._globalSpinner = true;\n\t var self = this;\n\t this._global = {\n\t hide: function hide() {\n\t self.hide();\n\t },\n\t show: function show() {\n\t self.show();\n\t }\n\t };\n\t this.$root.$on('spinner::show', this._global.show);\n\t this.$root.$on('spinner::hide', this._global.hide);\n\t }\n\t }\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t if (this._global) {\n\t this.$root.$off('spinner::show', this._global.show);\n\t this.$root.$off('spinner::hide', this._global.hide);\n\t delete this.$root._globalSpinner;\n\t }\n\t clearTimeout(this._spinnerAnimation);\n\t this._body.style.overflowY = this._bodyOverflow;\n\t }\n\t};\n\n/***/ },\n/* 165 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t directives: [{\n\t name: \"show\",\n\t rawName: \"v-show\",\n\t value: (_vm.active || _vm.locked),\n\t expression: \"active||locked\"\n\t }],\n\t class: ['spinner spinner-gritcode', _vm.spinnerSize, {\n\t 'spinner-fixed': _vm.fixed\n\t }]\n\t }, [_vm._c('div', {\n\t staticClass: \"spinner-wrapper\"\n\t }, [_vm._c('div', {\n\t staticClass: \"spinner-circle\"\n\t }), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"spinner-text\"\n\t }, [_vm._v(_vm._s(_vm.text))])])])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-8b298e70\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 166 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(167)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(168)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Tab.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-0985e878\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-0985e878\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Tab.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 167 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t disabled: { type: Boolean, default: false },\n\t header: { type: String }\n\t },\n\t data: function data() {\n\t return {\n\t fadein: false\n\t };\n\t },\n\t\n\t computed: {\n\t active: function active() {\n\t var _this = this;\n\t\n\t var active = !this._tabs || this._tabs.show === this;\n\t this.fadein = false;\n\t if (active) {\n\t setTimeout(function () {\n\t _this.fadein = true;\n\t }, 0);\n\t }\n\t return active;\n\t },\n\t index: function index() {\n\t return this._tabs.tabs.indexOf(this);\n\t },\n\t transition: function transition() {\n\t return this._tabs ? this._tabs.effect : null;\n\t }\n\t },\n\t created: function created() {\n\t this._isTab = true;\n\t var tabs = this;\n\t while (!this._tabs && tabs.$parent) {\n\t if (tabs._isTabGroup) {\n\t tabs.tabs.push(this);\n\t this._tabGroup = tabs;\n\t }\n\t if (tabs._isTabs) {\n\t tabs.tabs.push(this);\n\t this._tabs = tabs;\n\t if (!this._tabGroup) tabs.headers.push(this);\n\t }\n\t tabs = tabs.$parent;\n\t }\n\t if (!this._tabs) throw Error('tab depend on tabs.');\n\t },\n\t beforeDestroy: function beforeDestroy() {\n\t var _this2 = this;\n\t\n\t if (this._tabGroup) {\n\t this._tabGroup.tabs = this._tabGroup.tabs.filter(function (el) {\n\t return el !== _this2;\n\t });\n\t }\n\t if (this._tabs) {\n\t this._tabs.tabs = this._tabs.tabs.filter(function (el) {\n\t return el !== _this2;\n\t });\n\t }\n\t if (this._tabs) {\n\t if (this._tabs.active === this.index) {\n\t this._tabs.index = 0;\n\t }\n\t if (this._ingroup) {\n\t var id = this.$parent.tabs.indexOf(this);\n\t if (~id) this.$parent.tabs.splice(id, 1);\n\t }\n\t }\n\t if (this._tabs) {\n\t var _id = this._tabs.tabs.indexOf(this);\n\t if (~_id) this._tabs.tabs.splice(_id, 1);\n\t }\n\t }\n\t};\n\n/***/ },\n/* 168 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t ref: \"panel\",\n\t class: ['tab-pane', {\n\t 'active fade': _vm.active,\n\t 'in': _vm.fadein\n\t }],\n\t attrs: {\n\t \"role\": \"tabpanel\"\n\t }\n\t }, [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-0985e878\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 169 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(170)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(172)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(173)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\TabGroup.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-55faf3cb\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-55faf3cb\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] TabGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 170 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 172 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t disabled: { type: Boolean, default: false },\n\t header: { type: String }\n\t },\n\t data: function data() {\n\t return {\n\t show: false,\n\t tabs: []\n\t };\n\t },\n\t\n\t computed: {\n\t active: function active() {\n\t return ~this.tabs.indexOf(this._tabs.show);\n\t }\n\t },\n\t methods: {\n\t blur: function blur() {\n\t this.show = false;\n\t },\n\t toggle: function toggle() {\n\t this.show = !this.show;\n\t }\n\t },\n\t created: function created() {\n\t this._isTabGroup = true;\n\t if (this.$parent) {\n\t if (this.$parent._isTabGroup) throw Error('Can\\'t nest tab-groups.');\n\t if (!this.$parent._isTabs) throw Error('tab-group depend on tabs.');\n\t }\n\t this._tabs = this.$parent;\n\t this._tabs.headers.push(this);\n\t }\n\t};\n\n/***/ },\n/* 173 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', [_vm._t(\"default\")], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-55faf3cb\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 174 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(175)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(177)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(178)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Tabs.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-70100ddf\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-70100ddf\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Tabs.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 175 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 177 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tvar _Dropdown = __webpack_require__(105);\n\t\n\tvar _Dropdown2 = _interopRequireDefault(_Dropdown);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t components: {\n\t dropdown: _Dropdown2.default\n\t },\n\t props: {\n\t // effect: {type: String, default: 'fadein'},\n\t justified: false,\n\t navStyle: { type: String, default: null },\n\t value: { type: Number, default: 0 }\n\t },\n\t data: function data() {\n\t var index = this.value || 0;\n\t return {\n\t index: index,\n\t headers: [],\n\t tabs: []\n\t };\n\t },\n\t\n\t watch: {\n\t index: function index(val) {\n\t this.$emit('active', val);\n\t this.$emit('input', val);\n\t },\n\t value: function value(val) {\n\t this.index = val;\n\t }\n\t },\n\t computed: {\n\t navStyleClass: function navStyleClass() {\n\t return ['nav', ~['pills', 'stacked'].indexOf(this.navStyle) ? 'nav-' + this.navStyle : 'nav-tabs', {\n\t 'nav-justified': _utils.coerce.boolean(this.justified),\n\t 'nav-pills': this.navStyle === 'stacked'\n\t }];\n\t },\n\t show: function show() {\n\t return this.tabs[this.index] || this.tabs[0];\n\t }\n\t },\n\t methods: {\n\t select: function select(tab) {\n\t if (!tab.disabled) {\n\t this.index = this.tabs.indexOf(tab);\n\t }\n\t }\n\t },\n\t created: function created() {\n\t this._isTabs = true;\n\t }\n\t};\n\n/***/ },\n/* 178 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t attrs: {\n\t \"tabs\": \"\"\n\t }\n\t }, [_vm._c('ul', {\n\t class: _vm.navStyleClass,\n\t attrs: {\n\t \"role\": \"tablist\"\n\t }\n\t }, [_vm._l((_vm.headers), function(header) {\n\t return [(header._isTab) ? _vm._c('li', {\n\t class: {\n\t active: header.active, disabled: header.disabled\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.select(header)\n\t }\n\t }\n\t }, [_vm._t(\"header\", [_vm._c('a', {\n\t attrs: {\n\t \"href\": \"#\"\n\t },\n\t domProps: {\n\t \"innerHTML\": _vm._s(header.header)\n\t }\n\t })])], 2) : _vm._e(), _vm._v(\" \"), (header._isTabGroup) ? _vm._c('dropdown', {\n\t class: {\n\t active: header.active\n\t },\n\t attrs: {\n\t \"text\": header.header,\n\t \"disabled\": header.disabled\n\t }\n\t }, _vm._l((header.tabs), function(tab) {\n\t return _vm._c('li', {\n\t class: {\n\t disabled: tab.disabled\n\t }\n\t }, [_vm._c('a', {\n\t attrs: {\n\t \"href\": \"#\"\n\t },\n\t on: {\n\t \"click\": function($event) {\n\t $event.preventDefault();\n\t _vm.select(tab)\n\t }\n\t }\n\t }, [_vm._v(_vm._s(tab.header))])])\n\t })) : _vm._e()]\n\t })], 2), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"tab-content\"\n\t }, [_vm._t(\"default\")], 2)])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-70100ddf\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 179 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(180)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(181)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\ToggleButton.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-f034a5f2\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-f034a5f2\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] ToggleButton.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 180 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\texports.default = {\n\t props: {\n\t disabled: { default: null },\n\t falseType: { default: null },\n\t name: null,\n\t readonly: { default: null },\n\t trueType: { default: 'primary' },\n\t value: false\n\t },\n\t data: function data() {\n\t return {\n\t active: _utils.coerce.boolean(this.value),\n\t types: {\n\t danger: 'btn-danger',\n\t info: 'btn-info',\n\t primary: 'btn-primary',\n\t success: 'btn-success',\n\t warning: 'btn-warning'\n\t }\n\t };\n\t },\n\t\n\t watch: {\n\t active: function active(val, old) {\n\t if (val !== old) {\n\t this.$emit('changed', val);\n\t this.$emit(val ? 'enabled' : 'disabled');\n\t this.$emit('input', val);\n\t }\n\t },\n\t value: function value(val, old) {\n\t if (val !== old) {\n\t this.active = _utils.coerce.boolean(this.value);\n\t }\n\t }\n\t },\n\t computed: {\n\t boolDisabled: function boolDisabled() {\n\t return _utils.coerce.boolean(this.disabled);\n\t },\n\t boolReadonly: function boolReadonly() {\n\t return _utils.coerce.boolean(this.readonly);\n\t },\n\t type: function type() {\n\t return this.types[this.value ? this.trueType : this.falseType] || 'btn-default';\n\t }\n\t },\n\t methods: {\n\t toggle: function toggle() {\n\t if (this.boolDisabled || this.boolReadonly) {\n\t return;\n\t }\n\t this.active = !this.active;\n\t }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 181 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('a', {\n\t class: ['btn', _vm.type, {\n\t readonly: _vm.boolReadonly\n\t }],\n\t attrs: {\n\t \"href\": \"javascript:void(0)\",\n\t \"disabled\": _vm.boolDisabled\n\t },\n\t on: {\n\t \"click\": _vm.toggle\n\t }\n\t }, [_vm._c('span', {\n\t class: ['glyphicon', 'glyphicon-' + (_vm.value ? 'ok' : 'remove')]\n\t }), _vm._v(\" \"), _vm._t(\"default\"), _vm._v(\" \"), (_vm.name) ? _vm._c('input', {\n\t attrs: {\n\t \"type\": \"hidden\",\n\t \"name\": _vm.name\n\t },\n\t domProps: {\n\t \"value\": _vm.active ? 1 : 0\n\t }\n\t }) : _vm._e()], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-f034a5f2\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 182 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(183)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(185)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(186)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Tooltip.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-48fb51b2\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-48fb51b2\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Tooltip.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 183 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \\r\\n\"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 185 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _popoverMixins = __webpack_require__(143);\n\t\n\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = {\n\t mixins: [_popoverMixins2.default],\n\t props: {\n\t effect: { type: String, default: 'scale' },\n\t trigger: { type: String, default: 'hover' }\n\t }\n\t}; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\n/***/ },\n/* 186 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('span', {\n\t ref: \"trigger\"\n\t }, [_vm._t(\"default\"), _vm._v(\" \"), _vm._c('transition', {\n\t attrs: {\n\t \"name\": _vm.effect\n\t }\n\t }, [(_vm.show) ? _vm._c('div', {\n\t ref: \"popover\",\n\t class: ['tooltip', _vm.placement]\n\t }, [_vm._c('div', {\n\t staticClass: \"tooltip-arrow\"\n\t }), _vm._v(\" \"), _vm._c('div', {\n\t staticClass: \"tooltip-inner\"\n\t }, [_vm._t(\"content\", [_vm._c('div', {\n\t domProps: {\n\t \"innerHTML\": _vm._s(_vm.content)\n\t }\n\t })])], 2)]) : _vm._e()])], 2)\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-48fb51b2\", module.exports)\n\t }\n\t}\n\n/***/ },\n/* 187 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __vue_exports__, __vue_options__\n\tvar __vue_styles__ = {}\n\t\n\t/* styles */\n\t__webpack_require__(188)\n\t\n\t/* script */\n\t__vue_exports__ = __webpack_require__(190)\n\t\n\t/* template */\n\tvar __vue_template__ = __webpack_require__(206)\n\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\n\tif (\n\t typeof __vue_exports__.default === \"object\" ||\n\t typeof __vue_exports__.default === \"function\"\n\t) {\n\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \"default\" && key !== \"__esModule\" })) {console.error(\"named exports are not supported in *.vue files.\")}\n\t__vue_options__ = __vue_exports__ = __vue_exports__.default\n\t}\n\tif (typeof __vue_options__ === \"function\") {\n\t __vue_options__ = __vue_options__.options\n\t}\n\t__vue_options__.__file = \"C:\\\\laragon\\\\www\\\\vue-strap\\\\src\\\\Typeahead.vue\"\n\t__vue_options__.render = __vue_template__.render\n\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\n\t\n\t/* hot reload */\n\tif (false) {(function () {\n\t var hotAPI = require(\"vue-hot-reload-api\")\n\t hotAPI.install(require(\"vue\"), false)\n\t if (!hotAPI.compatible) return\n\t module.hot.accept()\n\t if (!module.hot.data) {\n\t hotAPI.createRecord(\"data-v-5b5f5e94\", __vue_options__)\n\t } else {\n\t hotAPI.reload(\"data-v-5b5f5e94\", __vue_options__)\n\t }\n\t})()}\n\tif (__vue_options__.functional) {console.error(\"[vue-loader] Typeahead.vue: functional components are not supported and should be defined in plain js files using render functions.\")}\n\t\n\tmodule.exports = __vue_exports__\n\n\n/***/ },\n/* 188 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// style-loader: Adds some css to the DOM by adding a \"],\"sourceRoot\":\"webpack://\"}]);\n\t\n\t// exports\n\n\n/***/ },\n/* 190 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _typeof2 = __webpack_require__(191);\n\t\n\tvar _typeof3 = _interopRequireDefault(_typeof2);\n\t\n\tvar _utils = __webpack_require__(65);\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\tvar DELAY = 300; //\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t//\n\t\n\texports.default = {\n\t props: {\n\t async: { type: String },\n\t data: { type: Array },\n\t delay: { type: Number, default: DELAY },\n\t asyncKey: { type: String, default: null },\n\t limit: { type: Number, default: 8 },\n\t matchCase: { type: Boolean, default: false },\n\t matchStart: { type: Boolean, default: false },\n\t onHit: {\n\t type: Function,\n\t default: function _default(item) {\n\t this.reset();\n\t this.value = item;\n\t }\n\t },\n\t placeholder: { type: String },\n\t template: { type: String },\n\t value: { type: String, default: '' }\n\t },\n\t data: function data() {\n\t return {\n\t showDropdown: false,\n\t noResults: true,\n\t current: 0,\n\t items: [],\n\t val: ''\n\t };\n\t },\n\t\n\t computed: {\n\t templateHtml: function templateHtml() {\n\t return typeof this.template === 'string' ? '' + this.template + '' : null;\n\t },\n\t tmpl: function tmpl() {\n\t return this._tmpl;\n\t }\n\t },\n\t watch: {\n\t val: function val(_val, old) {\n\t this.$emit('input', _val);\n\t if (_val !== old) this._update();\n\t },\n\t value: function value(val) {\n\t if (this.val !== val) {\n\t this.val = val;\n\t }\n\t }\n\t },\n\t methods: {\n\t setItems: function setItems(data) {\n\t var _this = this;\n\t\n\t if (this.async) {\n\t this.items = this.asyncKey ? data[this.asyncKey] : data;\n\t this.items = this.items.slice(0, this.limit);\n\t } else {\n\t this.items = (data || []).filter(function (value) {\n\t if ((typeof value === 'undefined' ? 'undefined' : (0, _typeof3.default)(value)) === 'object') {\n\t return true;\n\t }\n\t value = _this.matchCase ? value : value.toLowerCase();\n\t var query = _this.matchCase ? _this.val : _this.val.toLowerCase();\n\t return _this.matchStart ? value.indexOf(query) === 0 : value.indexOf(query) !== -1;\n\t }).slice(0, this.limit);\n\t }\n\t this.showDropdown = this.items.length > 0;\n\t },\n\t reset: function reset() {\n\t this.items = [];\n\t this.val = '';\n\t this.loading = false;\n\t this.showDropdown = false;\n\t },\n\t setActive: function setActive(index) {\n\t this.current = index;\n\t },\n\t isActive: function isActive(index) {\n\t return this.current === index;\n\t },\n\t hit: function hit(e) {\n\t e.preventDefault();\n\t this.onHit(this.items[this.current], this);\n\t },\n\t up: function up() {\n\t if (this.current > 0) this.current--;\n\t },\n\t down: function down() {\n\t if (this.current < this.items.length - 1) this.current++;\n\t }\n\t },\n\t created: function created() {\n\t this.val = this.value;\n\t this._tmpl = {\n\t template: this.templateHtml || '',\n\t props: {\n\t item: { default: null }\n\t }\n\t };\n\t this._update = (0, _utils.delayer)(function () {\n\t var _this2 = this;\n\t\n\t if (!this.val) {\n\t this.reset();\n\t return false;\n\t }\n\t if (this.async) {\n\t (0, _utils.getJSON)(this.async + this.val).then(function (data) {\n\t _this2.setItems(data);\n\t });\n\t } else if (this.data) {\n\t this.setItems(this.data);\n\t }\n\t }, 'delay', DELAY);\n\t this._update();\n\t }\n\t};\n\n/***/ },\n/* 191 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\texports.__esModule = true;\n\t\n\tvar _iterator = __webpack_require__(20);\n\t\n\tvar _iterator2 = _interopRequireDefault(_iterator);\n\t\n\tvar _symbol = __webpack_require__(192);\n\t\n\tvar _symbol2 = _interopRequireDefault(_symbol);\n\t\n\tvar _typeof = typeof _symbol2.default === \"function\" && typeof _iterator2.default === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj; };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\t\n\texports.default = typeof _symbol2.default === \"function\" && _typeof(_iterator2.default) === \"symbol\" ? function (obj) {\n\t return typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n\t} : function (obj) {\n\t return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n\t};\n\n/***/ },\n/* 192 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = { \"default\": __webpack_require__(193), __esModule: true };\n\n/***/ },\n/* 193 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(194);\n\t__webpack_require__(203);\n\t__webpack_require__(204);\n\t__webpack_require__(205);\n\tmodule.exports = __webpack_require__(7).Symbol;\n\n/***/ },\n/* 194 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t// ECMAScript 6 symbols shim\n\tvar global = __webpack_require__(6)\n\t , has = __webpack_require__(29)\n\t , DESCRIPTORS = __webpack_require__(15)\n\t , $export = __webpack_require__(5)\n\t , redefine = __webpack_require__(28)\n\t , META = __webpack_require__(195).KEY\n\t , $fails = __webpack_require__(16)\n\t , shared = __webpack_require__(43)\n\t , setToStringTag = __webpack_require__(47)\n\t , uid = __webpack_require__(44)\n\t , wks = __webpack_require__(48)\n\t , wksExt = __webpack_require__(55)\n\t , wksDefine = __webpack_require__(196)\n\t , keyOf = __webpack_require__(197)\n\t , enumKeys = __webpack_require__(198)\n\t , isArray = __webpack_require__(201)\n\t , anObject = __webpack_require__(12)\n\t , toIObject = __webpack_require__(36)\n\t , toPrimitive = __webpack_require__(18)\n\t , createDesc = __webpack_require__(19)\n\t , _create = __webpack_require__(32)\n\t , gOPNExt = __webpack_require__(60)\n\t , $GOPD = __webpack_require__(202)\n\t , $DP = __webpack_require__(11)\n\t , $keys = __webpack_require__(34)\n\t , gOPD = $GOPD.f\n\t , dP = $DP.f\n\t , gOPN = gOPNExt.f\n\t , $Symbol = global.Symbol\n\t , $JSON = global.JSON\n\t , _stringify = $JSON && $JSON.stringify\n\t , PROTOTYPE = 'prototype'\n\t , HIDDEN = wks('_hidden')\n\t , TO_PRIMITIVE = wks('toPrimitive')\n\t , isEnum = {}.propertyIsEnumerable\n\t , SymbolRegistry = shared('symbol-registry')\n\t , AllSymbols = shared('symbols')\n\t , OPSymbols = shared('op-symbols')\n\t , ObjectProto = Object[PROTOTYPE]\n\t , USE_NATIVE = typeof $Symbol == 'function'\n\t , QObject = global.QObject;\n\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n\tvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\t\n\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n\tvar setSymbolDesc = DESCRIPTORS && $fails(function(){\n\t return _create(dP({}, 'a', {\n\t get: function(){ return dP(this, 'a', {value: 7}).a; }\n\t })).a != 7;\n\t}) ? function(it, key, D){\n\t var protoDesc = gOPD(ObjectProto, key);\n\t if(protoDesc)delete ObjectProto[key];\n\t dP(it, key, D);\n\t if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);\n\t} : dP;\n\t\n\tvar wrap = function(tag){\n\t var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n\t sym._k = tag;\n\t return sym;\n\t};\n\t\n\tvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){\n\t return typeof it == 'symbol';\n\t} : function(it){\n\t return it instanceof $Symbol;\n\t};\n\t\n\tvar $defineProperty = function defineProperty(it, key, D){\n\t if(it === ObjectProto)$defineProperty(OPSymbols, key, D);\n\t anObject(it);\n\t key = toPrimitive(key, true);\n\t anObject(D);\n\t if(has(AllSymbols, key)){\n\t if(!D.enumerable){\n\t if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));\n\t it[HIDDEN][key] = true;\n\t } else {\n\t if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;\n\t D = _create(D, {enumerable: createDesc(0, false)});\n\t } return setSymbolDesc(it, key, D);\n\t } return dP(it, key, D);\n\t};\n\tvar $defineProperties = function defineProperties(it, P){\n\t anObject(it);\n\t var keys = enumKeys(P = toIObject(P))\n\t , i = 0\n\t , l = keys.length\n\t , key;\n\t while(l > i)$defineProperty(it, key = keys[i++], P[key]);\n\t return it;\n\t};\n\tvar $create = function create(it, P){\n\t return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n\t};\n\tvar $propertyIsEnumerable = function propertyIsEnumerable(key){\n\t var E = isEnum.call(this, key = toPrimitive(key, true));\n\t if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;\n\t return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n\t};\n\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){\n\t it = toIObject(it);\n\t key = toPrimitive(key, true);\n\t if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;\n\t var D = gOPD(it, key);\n\t if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;\n\t return D;\n\t};\n\tvar $getOwnPropertyNames = function getOwnPropertyNames(it){\n\t var names = gOPN(toIObject(it))\n\t , result = []\n\t , i = 0\n\t , key;\n\t while(names.length > i){\n\t if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);\n\t } return result;\n\t};\n\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(it){\n\t var IS_OP = it === ObjectProto\n\t , names = gOPN(IS_OP ? OPSymbols : toIObject(it))\n\t , result = []\n\t , i = 0\n\t , key;\n\t while(names.length > i){\n\t if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);\n\t } return result;\n\t};\n\t\n\t// 19.4.1.1 Symbol([description])\n\tif(!USE_NATIVE){\n\t $Symbol = function Symbol(){\n\t if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');\n\t var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n\t var $set = function(value){\n\t if(this === ObjectProto)$set.call(OPSymbols, value);\n\t if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;\n\t setSymbolDesc(this, tag, createDesc(1, value));\n\t };\n\t if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});\n\t return wrap(tag);\n\t };\n\t redefine($Symbol[PROTOTYPE], 'toString', function toString(){\n\t return this._k;\n\t });\n\t\n\t $GOPD.f = $getOwnPropertyDescriptor;\n\t $DP.f = $defineProperty;\n\t __webpack_require__(61).f = gOPNExt.f = $getOwnPropertyNames;\n\t __webpack_require__(200).f = $propertyIsEnumerable;\n\t __webpack_require__(199).f = $getOwnPropertySymbols;\n\t\n\t if(DESCRIPTORS && !__webpack_require__(27)){\n\t redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n\t }\n\t\n\t wksExt.f = function(name){\n\t return wrap(wks(name));\n\t }\n\t}\n\t\n\t$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});\n\t\n\tfor(var symbols = (\n\t // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n\t 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n\t).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);\n\t\n\tfor(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);\n\t\n\t$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n\t // 19.4.2.1 Symbol.for(key)\n\t 'for': function(key){\n\t return has(SymbolRegistry, key += '')\n\t ? SymbolRegistry[key]\n\t : SymbolRegistry[key] = $Symbol(key);\n\t },\n\t // 19.4.2.5 Symbol.keyFor(sym)\n\t keyFor: function keyFor(key){\n\t if(isSymbol(key))return keyOf(SymbolRegistry, key);\n\t throw TypeError(key + ' is not a symbol!');\n\t },\n\t useSetter: function(){ setter = true; },\n\t useSimple: function(){ setter = false; }\n\t});\n\t\n\t$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n\t // 19.1.2.2 Object.create(O [, Properties])\n\t create: $create,\n\t // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n\t defineProperty: $defineProperty,\n\t // 19.1.2.3 Object.defineProperties(O, Properties)\n\t defineProperties: $defineProperties,\n\t // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n\t // 19.1.2.7 Object.getOwnPropertyNames(O)\n\t getOwnPropertyNames: $getOwnPropertyNames,\n\t // 19.1.2.8 Object.getOwnPropertySymbols(O)\n\t getOwnPropertySymbols: $getOwnPropertySymbols\n\t});\n\t\n\t// 24.3.2 JSON.stringify(value [, replacer [, space]])\n\t$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){\n\t var S = $Symbol();\n\t // MS Edge converts symbol values to JSON as {}\n\t // WebKit converts symbol values to JSON as null\n\t // V8 throws on boxed symbols\n\t return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';\n\t})), 'JSON', {\n\t stringify: function stringify(it){\n\t if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined\n\t var args = [it]\n\t , i = 1\n\t , replacer, $replacer;\n\t while(arguments.length > i)args.push(arguments[i++]);\n\t replacer = args[1];\n\t if(typeof replacer == 'function')$replacer = replacer;\n\t if($replacer || !isArray(replacer))replacer = function(key, value){\n\t if($replacer)value = $replacer.call(this, key, value);\n\t if(!isSymbol(value))return value;\n\t };\n\t args[1] = replacer;\n\t return _stringify.apply($JSON, args);\n\t }\n\t});\n\t\n\t// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n\t$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(10)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n\t// 19.4.3.5 Symbol.prototype[@@toStringTag]\n\tsetToStringTag($Symbol, 'Symbol');\n\t// 20.2.1.9 Math[@@toStringTag]\n\tsetToStringTag(Math, 'Math', true);\n\t// 24.3.3 JSON[@@toStringTag]\n\tsetToStringTag(global.JSON, 'JSON', true);\n\n/***/ },\n/* 195 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar META = __webpack_require__(44)('meta')\n\t , isObject = __webpack_require__(13)\n\t , has = __webpack_require__(29)\n\t , setDesc = __webpack_require__(11).f\n\t , id = 0;\n\tvar isExtensible = Object.isExtensible || function(){\n\t return true;\n\t};\n\tvar FREEZE = !__webpack_require__(16)(function(){\n\t return isExtensible(Object.preventExtensions({}));\n\t});\n\tvar setMeta = function(it){\n\t setDesc(it, META, {value: {\n\t i: 'O' + ++id, // object ID\n\t w: {} // weak collections IDs\n\t }});\n\t};\n\tvar fastKey = function(it, create){\n\t // return primitive with prefix\n\t if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n\t if(!has(it, META)){\n\t // can't set metadata to uncaught frozen object\n\t if(!isExtensible(it))return 'F';\n\t // not necessary to add metadata\n\t if(!create)return 'E';\n\t // add missing metadata\n\t setMeta(it);\n\t // return object ID\n\t } return it[META].i;\n\t};\n\tvar getWeak = function(it, create){\n\t if(!has(it, META)){\n\t // can't set metadata to uncaught frozen object\n\t if(!isExtensible(it))return true;\n\t // not necessary to add metadata\n\t if(!create)return false;\n\t // add missing metadata\n\t setMeta(it);\n\t // return hash weak collections IDs\n\t } return it[META].w;\n\t};\n\t// add metadata on freeze-family methods calling\n\tvar onFreeze = function(it){\n\t if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it);\n\t return it;\n\t};\n\tvar meta = module.exports = {\n\t KEY: META,\n\t NEED: false,\n\t fastKey: fastKey,\n\t getWeak: getWeak,\n\t onFreeze: onFreeze\n\t};\n\n/***/ },\n/* 196 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar global = __webpack_require__(6)\n\t , core = __webpack_require__(7)\n\t , LIBRARY = __webpack_require__(27)\n\t , wksExt = __webpack_require__(55)\n\t , defineProperty = __webpack_require__(11).f;\n\tmodule.exports = function(name){\n\t var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n\t if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});\n\t};\n\n/***/ },\n/* 197 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar getKeys = __webpack_require__(34)\n\t , toIObject = __webpack_require__(36);\n\tmodule.exports = function(object, el){\n\t var O = toIObject(object)\n\t , keys = getKeys(O)\n\t , length = keys.length\n\t , index = 0\n\t , key;\n\t while(length > index)if(O[key = keys[index++]] === el)return key;\n\t};\n\n/***/ },\n/* 198 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// all enumerable object keys, includes symbols\n\tvar getKeys = __webpack_require__(34)\n\t , gOPS = __webpack_require__(199)\n\t , pIE = __webpack_require__(200);\n\tmodule.exports = function(it){\n\t var result = getKeys(it)\n\t , getSymbols = gOPS.f;\n\t if(getSymbols){\n\t var symbols = getSymbols(it)\n\t , isEnum = pIE.f\n\t , i = 0\n\t , key;\n\t while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);\n\t } return result;\n\t};\n\n/***/ },\n/* 199 */\n/***/ function(module, exports) {\n\n\texports.f = Object.getOwnPropertySymbols;\n\n/***/ },\n/* 200 */\n/***/ function(module, exports) {\n\n\texports.f = {}.propertyIsEnumerable;\n\n/***/ },\n/* 201 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// 7.2.2 IsArray(argument)\n\tvar cof = __webpack_require__(38);\n\tmodule.exports = Array.isArray || function isArray(arg){\n\t return cof(arg) == 'Array';\n\t};\n\n/***/ },\n/* 202 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar pIE = __webpack_require__(200)\n\t , createDesc = __webpack_require__(19)\n\t , toIObject = __webpack_require__(36)\n\t , toPrimitive = __webpack_require__(18)\n\t , has = __webpack_require__(29)\n\t , IE8_DOM_DEFINE = __webpack_require__(14)\n\t , gOPD = Object.getOwnPropertyDescriptor;\n\t\n\texports.f = __webpack_require__(15) ? gOPD : function getOwnPropertyDescriptor(O, P){\n\t O = toIObject(O);\n\t P = toPrimitive(P, true);\n\t if(IE8_DOM_DEFINE)try {\n\t return gOPD(O, P);\n\t } catch(e){ /* empty */ }\n\t if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);\n\t};\n\n/***/ },\n/* 203 */\n/***/ function(module, exports) {\n\n\n\n/***/ },\n/* 204 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(196)('asyncIterator');\n\n/***/ },\n/* 205 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t__webpack_require__(196)('observable');\n\n/***/ },\n/* 206 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\n\t return _vm._c('div', {\n\t class: {\n\t 'open': _vm.showDropdown\n\t },\n\t staticStyle: {\n\t \"position\": \"relative\"\n\t }\n\t }, [_vm._c('input', {\n\t directives: [{\n\t name: \"model\",\n\t rawName: \"v-model\",\n\t value: (_vm.val),\n\t expression: \"val\"\n\t }],\n\t staticClass: \"form-control\",\n\t attrs: {\n\t \"type\": \"text\",\n\t \"autocomplete\": \"off\",\n\t \"placeholder\": _vm.placeholder\n\t },\n\t domProps: {\n\t \"value\": _vm._s(_vm.val)\n\t },\n\t on: {\n\t \"blur\": function($event) {\n\t _vm.showDropdown = false\n\t },\n\t \"keydown\": [function($event) {\n\t if (_vm._k($event.keyCode, \"down\", 40)) { return; }\n\t _vm.down($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"enter\", 13)) { return; }\n\t _vm.hit($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"esc\", 27)) { return; }\n\t _vm.reset($event)\n\t }, function($event) {\n\t if (_vm._k($event.keyCode, \"up\", 38)) { return; }\n\t _vm.up($event)\n\t }],\n\t \"input\": function($event) {\n\t if ($event.target.composing) { return; }\n\t _vm.val = $event.target.value\n\t }\n\t }\n\t }), _vm._v(\" \"), _vm._c('ul', {\n\t ref: \"dropdown\",\n\t staticClass: \"dropdown-menu\"\n\t }, _vm._l((_vm.items), function(item, i) {\n\t return _vm._c('li', {\n\t class: {\n\t 'active': _vm.isActive(i)\n\t }\n\t }, [_vm._c('a', {\n\t on: {\n\t \"mousedown\": function($event) {\n\t $event.preventDefault();\n\t _vm.hit($event)\n\t },\n\t \"mousemove\": function($event) {\n\t _vm.setActive(i)\n\t }\n\t }\n\t }, [_vm._c(_vm.tmpl, {\n\t tag: \"component\",\n\t attrs: {\n\t \"item\": item\n\t }\n\t })], 1)])\n\t }))])\n\t},staticRenderFns: []}\n\tif (false) {\n\t module.hot.accept()\n\t if (module.hot.data) {\n\t require(\"vue-hot-reload-api\").rerender(\"data-v-5b5f5e94\", module.exports)\n\t }\n\t}\n\n/***/ }\n/******/ ])\n});\n;\n//# sourceMappingURL=vue-strap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3Z1ZS1zdHJhcC9kaXN0L3Z1ZS1zdHJhcC5qcz9lMTQ3Il0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlZ1ZVN0cmFwXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlZ1ZVN0cmFwXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge30sXG4vKioqKioqLyBcdFx0XHRpZDogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KTtcblx0XG5cdHZhciBfQ2xpY2tPdXRzaWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsaWNrT3V0c2lkZSk7XG5cdFxuXHR2YXIgX1Njcm9sbCA9IF9fd2VicGFja19yZXF1aXJlX18oNjgpO1xuXHRcblx0dmFyIF9TY3JvbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2Nyb2xsKTtcblx0XG5cdHZhciBfQWNjb3JkaW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OSk7XG5cdFxuXHR2YXIgX0FjY29yZGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BY2NvcmRpb24pO1xuXHRcblx0dmFyIF9BZmZpeCA9IF9fd2VicGFja19yZXF1aXJlX18oNzIpO1xuXHRcblx0dmFyIF9BZmZpeDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BZmZpeCk7XG5cdFxuXHR2YXIgX0FsZXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NSk7XG5cdFxuXHR2YXIgX0FsZXJ0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FsZXJ0KTtcblx0XG5cdHZhciBfQXNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyKTtcblx0XG5cdHZhciBfQXNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQXNpZGUpO1xuXHRcblx0dmFyIF9CdXR0b25Hcm91cCA9IF9fd2VicGFja19yZXF1aXJlX18oODcpO1xuXHRcblx0dmFyIF9CdXR0b25Hcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CdXR0b25Hcm91cCk7XG5cdFxuXHR2YXIgX0Nhcm91c2VsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MCk7XG5cdFxuXHR2YXIgX0Nhcm91c2VsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Nhcm91c2VsKTtcblx0XG5cdHZhciBfQ2hlY2tib3ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1KTtcblx0XG5cdHZhciBfQ2hlY2tib3gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2hlY2tib3gpO1xuXHRcblx0dmFyIF9EYXRlcGlja2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDApO1xuXHRcblx0dmFyIF9EYXRlcGlja2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0RhdGVwaWNrZXIpO1xuXHRcblx0dmFyIF9Ecm9wZG93biA9IF9fd2VicGFja19yZXF1aXJlX18oMTA1KTtcblx0XG5cdHZhciBfRHJvcGRvd24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRHJvcGRvd24pO1xuXHRcblx0dmFyIF9Gb3JtR3JvdXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwOCk7XG5cdFxuXHR2YXIgX0Zvcm1Hcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Gb3JtR3JvdXApO1xuXHRcblx0dmFyIF9Gb3JtVmFsaWRhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTEpO1xuXHRcblx0dmFyIF9Gb3JtVmFsaWRhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Zvcm1WYWxpZGF0b3IpO1xuXHRcblx0dmFyIF9JbnB1dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE0KTtcblx0XG5cdHZhciBfSW5wdXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfSW5wdXQpO1xuXHRcblx0dmFyIF9Nb2RhbCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE5KTtcblx0XG5cdHZhciBfTW9kYWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTW9kYWwpO1xuXHRcblx0dmFyIF9OYXZiYXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyOCk7XG5cdFxuXHR2YXIgX05hdmJhcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9OYXZiYXIpO1xuXHRcblx0dmFyIF9PcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMSk7XG5cdFxuXHR2YXIgX09wdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9PcHRpb24pO1xuXHRcblx0dmFyIF9QYW5lbCA9IF9fd2VicGFja19yZXF1aXJlX18oMTM0KTtcblx0XG5cdHZhciBfUGFuZWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFuZWwpO1xuXHRcblx0dmFyIF9Qb3BvdmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzkpO1xuXHRcblx0dmFyIF9Qb3BvdmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BvcG92ZXIpO1xuXHRcblx0dmFyIF9Qcm9ncmVzc2JhciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ1KTtcblx0XG5cdHZhciBfUHJvZ3Jlc3NiYXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUHJvZ3Jlc3NiYXIpO1xuXHRcblx0dmFyIF9SYWRpbyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ4KTtcblx0XG5cdHZhciBfUmFkaW8yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUmFkaW8pO1xuXHRcblx0dmFyIF9TZWxlY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1Myk7XG5cdFxuXHR2YXIgX1NlbGVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TZWxlY3QpO1xuXHRcblx0dmFyIF9TbGlkZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1OCk7XG5cdFxuXHR2YXIgX1NsaWRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TbGlkZXIpO1xuXHRcblx0dmFyIF9TcGlubmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjEpO1xuXHRcblx0dmFyIF9TcGlubmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NwaW5uZXIpO1xuXHRcblx0dmFyIF9UYWIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2Nik7XG5cdFxuXHR2YXIgX1RhYjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWIpO1xuXHRcblx0dmFyIF9UYWJHcm91cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTY5KTtcblx0XG5cdHZhciBfVGFiR3JvdXAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFiR3JvdXApO1xuXHRcblx0dmFyIF9UYWJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzQpO1xuXHRcblx0dmFyIF9UYWJzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYnMpO1xuXHRcblx0dmFyIF9Ub2dnbGVCdXR0b24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3OSk7XG5cdFxuXHR2YXIgX1RvZ2dsZUJ1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ub2dnbGVCdXR0b24pO1xuXHRcblx0dmFyIF9Ub29sdGlwID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODIpO1xuXHRcblx0dmFyIF9Ub29sdGlwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Rvb2x0aXApO1xuXHRcblx0dmFyIF9UeXBlYWhlYWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4Nyk7XG5cdFxuXHR2YXIgX1R5cGVhaGVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UeXBlYWhlYWQpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdC8vIENvbXBvbmVudHNcblx0XG5cdC8vIERpcmVjdGl2ZXNcblx0Ly8gVXRpbHNcblx0dmFyIFZ1ZVN0cmFwID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIENsaWNrT3V0c2lkZTogX0NsaWNrT3V0c2lkZTIuZGVmYXVsdCxcblx0ICAgIFNjcm9sbDogX1Njcm9sbDIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgdXRpbHM6IHtcblx0ICAgICQ6IF9Ob2RlTGlzdDIuZGVmYXVsdCxcblx0ICAgIGNvZXJjZTogX3V0aWxzLmNvZXJjZVxuXHQgIH0sXG5cdCAgLy9jb21wb25lbnRzXG5cdCAgYWNjb3JkaW9uOiBfQWNjb3JkaW9uMi5kZWZhdWx0LFxuXHQgIGFmZml4OiBfQWZmaXgyLmRlZmF1bHQsXG5cdCAgYWxlcnQ6IF9BbGVydDIuZGVmYXVsdCxcblx0ICBhc2lkZTogX0FzaWRlMi5kZWZhdWx0LFxuXHQgIGJ1dHRvbkdyb3VwOiBfQnV0dG9uR3JvdXAyLmRlZmF1bHQsXG5cdCAgY2Fyb3VzZWw6IF9DYXJvdXNlbDIuZGVmYXVsdCxcblx0ICBjaGVja2JveDogX0NoZWNrYm94Mi5kZWZhdWx0LFxuXHQgIGRhdGVwaWNrZXI6IF9EYXRlcGlja2VyMi5kZWZhdWx0LFxuXHQgIGRyb3Bkb3duOiBfRHJvcGRvd24yLmRlZmF1bHQsXG5cdCAgZm9ybUdyb3VwOiBfRm9ybUdyb3VwMi5kZWZhdWx0LFxuXHQgIGZvcm1WYWxpZGF0b3I6IF9Gb3JtVmFsaWRhdG9yMi5kZWZhdWx0LFxuXHQgIGlucHV0OiBfSW5wdXQyLmRlZmF1bHQsXG5cdCAgbW9kYWw6IF9Nb2RhbDIuZGVmYXVsdCxcblx0ICBuYXZiYXI6IF9OYXZiYXIyLmRlZmF1bHQsXG5cdCAgb3B0aW9uOiBfT3B0aW9uMi5kZWZhdWx0LFxuXHQgIHBhbmVsOiBfUGFuZWwyLmRlZmF1bHQsXG5cdCAgcG9wb3ZlcjogX1BvcG92ZXIyLmRlZmF1bHQsXG5cdCAgcHJvZ3Jlc3NiYXI6IF9Qcm9ncmVzc2JhcjIuZGVmYXVsdCxcblx0ICByYWRpbzogX1JhZGlvMi5kZWZhdWx0LFxuXHQgIHNlbGVjdDogX1NlbGVjdDIuZGVmYXVsdCxcblx0ICBzbGlkZXI6IF9TbGlkZXIyLmRlZmF1bHQsXG5cdCAgc3Bpbm5lcjogX1NwaW5uZXIyLmRlZmF1bHQsXG5cdCAgdGFiOiBfVGFiMi5kZWZhdWx0LFxuXHQgIHRhYkdyb3VwOiBfVGFiR3JvdXAyLmRlZmF1bHQsXG5cdCAgdGFiczogX1RhYnMyLmRlZmF1bHQsXG5cdCAgdG9nZ2xlQnV0dG9uOiBfVG9nZ2xlQnV0dG9uMi5kZWZhdWx0LFxuXHQgIHRvb2x0aXA6IF9Ub29sdGlwMi5kZWZhdWx0LFxuXHQgIHR5cGVhaGVhZDogX1R5cGVhaGVhZDIuZGVmYXVsdFxuXHR9O1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBWdWVTdHJhcDtcblxuLyoqKi8gfSxcbi8qIDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9kZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdFxuXHR2YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmluZVByb3BlcnR5KTtcblx0XG5cdHZhciBfaXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcblx0XG5cdHZhciBfaXRlcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXRlcmF0b3IpO1xuXHRcblx0dmFyIF9nZXRPd25Qcm9wZXJ0eU5hbWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Nik7XG5cdFxuXHR2YXIgX2dldE93blByb3BlcnR5TmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0T3duUHJvcGVydHlOYW1lcyk7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9fd2VicGFja19yZXF1aXJlX18oNjIpO1xuXHRcblx0dmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYzKTtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2xhc3MyKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDY0KTtcblx0XG5cdHZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXHR2YXIgbm9kZUVycm9yID0gbmV3IEVycm9yKCdQYXNzZWQgYXJndW1lbnRzIG11c3QgYmUgb2YgTm9kZScpO1xuXHR2YXIgYmx1ckV2ZW50O1xuXHR2YXIgYmx1ckxpc3QgPSBbXTtcblx0dmFyIEV2ZW50cyA9IFtdO1xuXHRcblx0ZnVuY3Rpb24gaXNOb2RlKHZhbCkge1xuXHQgIHJldHVybiB2YWwgaW5zdGFuY2VvZiB3aW5kb3cuTm9kZTtcblx0fVxuXHRmdW5jdGlvbiBpc05vZGVMaXN0KHZhbCkge1xuXHQgIHJldHVybiB2YWwgaW5zdGFuY2VvZiB3aW5kb3cuTm9kZUxpc3QgfHwgdmFsIGluc3RhbmNlb2YgTm9kZUxpc3QgfHwgdmFsIGluc3RhbmNlb2Ygd2luZG93LkhUTUxDb2xsZWN0aW9uIHx8IHZhbCBpbnN0YW5jZW9mIEFycmF5O1xuXHR9XG5cdFxuXHR2YXIgTm9kZUxpc3QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgZnVuY3Rpb24gTm9kZUxpc3QoYXJncykge1xuXHQgICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgTm9kZUxpc3QpO1xuXHRcblx0ICAgIHZhciBub2RlcyA9IGFyZ3M7XG5cdCAgICBpZiAoYXJnc1swXSA9PT0gd2luZG93KSB7XG5cdCAgICAgIG5vZGVzID0gW3dpbmRvd107XG5cdCAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuXHQgICAgICBub2RlcyA9IChhcmdzWzFdIHx8IGRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsKGFyZ3NbMF0pO1xuXHQgICAgICBpZiAoYXJnc1sxXSkge1xuXHQgICAgICAgIHRoaXMub3duZXIgPSBhcmdzWzFdO1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2UgaWYgKDAgaW4gYXJncyAmJiAhaXNOb2RlKGFyZ3NbMF0pICYmIGFyZ3NbMF0gJiYgJ2xlbmd0aCcgaW4gYXJnc1swXSkge1xuXHQgICAgICBub2RlcyA9IGFyZ3NbMF07XG5cdCAgICAgIGlmIChhcmdzWzFdKSB7XG5cdCAgICAgICAgdGhpcy5vd25lciA9IGFyZ3NbMV07XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGlmIChub2Rlcykge1xuXHQgICAgICBmb3IgKHZhciBpIGluIG5vZGVzKSB7XG5cdCAgICAgICAgdGhpc1tpXSA9IG5vZGVzW2ldO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMubGVuZ3RoID0gbm9kZXMubGVuZ3RoO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5sZW5ndGggPSAwO1xuXHQgICAgfVxuXHQgICAgd2luZG93LnBydWViYSA9IHRoaXM7XG5cdCAgfVxuXHRcblx0ICAoMCwgX2NyZWF0ZUNsYXNzMy5kZWZhdWx0KShOb2RlTGlzdCwgW3tcblx0ICAgIGtleTogJ2NvbmNhdCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gY29uY2F0KCkge1xuXHQgICAgICB2YXIgbm9kZXMgPSBBcnJheVByb3RvLnNsaWNlLmNhbGwodGhpcyk7XG5cdCAgICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYXJyKSB7XG5cdCAgICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJyLCBmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChpc05vZGUoZWwpKSB7XG5cdCAgICAgICAgICAgIGlmICghfm5vZGVzLmluZGV4T2YoZWwpKSBub2Rlcy5wdXNoKGVsKTtcblx0ICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlTGlzdChlbCkpIHtcblx0ICAgICAgICAgICAgZmxhdHRlbihlbCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJncywgZnVuY3Rpb24gKGFyZykge1xuXHQgICAgICAgIGlmIChpc05vZGUoYXJnKSkge1xuXHQgICAgICAgICAgaWYgKCF+bm9kZXMuaW5kZXhPZihhcmcpKSBub2Rlcy5wdXNoKGFyZyk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KGFyZykpIHtcblx0ICAgICAgICAgIGZsYXR0ZW4oYXJnKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhyb3cgRXJyb3IoJ0NvbmNhdCBhcmd1bWVudHMgbXVzdCBiZSBvZiBhIE5vZGUsIE5vZGVMaXN0LCBIVE1MQ29sbGVjdGlvbiwgb3IgQXJyYXkgb2YgKE5vZGUsIE5vZGVMaXN0LCBIVE1MQ29sbGVjdGlvbiwgQXJyYXkpJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIE5vZGVMaXN0SlMobm9kZXMsIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2RlbGV0ZScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZSgpIHtcblx0ICAgICAgdmFyIG5vdFJlbW92ZWQgPSBmbGF0dGVuKHRoaXMpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBpZiAoZWwucmVtb3ZlKSB7XG5cdCAgICAgICAgICBlbC5yZW1vdmUoKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGVsLnBhcmVudE5vZGUpIHtcblx0ICAgICAgICAgIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5jb250YWlucyhlbCk7XG5cdCAgICAgIH0pO1xuXHQgICAgICBpZiAobm90UmVtb3ZlZC5sZW5ndGgpIGNvbnNvbGUud2FybignTm9kZUxpc3Q6IFNvbWUgbm9kZXMgY291bGQgbm90IGJlIGRlbGV0ZWQuJyk7XG5cdCAgICAgIHJldHVybiBub3RSZW1vdmVkO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2VhY2gnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGVhY2goKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guYXBwbHkodGhpcywgYXJncyk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZpbHRlcicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZmlsdGVyKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIE5vZGVMaXN0SlMoQXJyYXlQcm90by5maWx0ZXIuYXBwbHkodGhpcywgYXJncyksIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZpbmQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmQoZWxlbWVudCkge1xuXHQgICAgICB2YXIgbm9kZXMgPSBbXTtcblx0ICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykgZmxhdHRlbih0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgbm9kZXMucHVzaChub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudCkpO1xuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKGlzTm9kZShlbGVtZW50KSkgZmxhdHRlbih0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgaWYgKG5vZGUgIT09IGVsZW1lbnQgJiYgbm9kZS5jb250YWlucyhlbGVtZW50KSkgbm9kZXMucHVzaChlbGVtZW50KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmIChpc05vZGVMaXN0KGVsZW1lbnQpKSB7XG5cdCAgICAgICAgdmFyIGVscyA9IGZsYXR0ZW4oZWxlbWVudCk7XG5cdCAgICAgICAgZmxhdHRlbih0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgICBlbHMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgICAgaWYgKG5vZGUgIT09IGVsICYmIG5vZGUuY29udGFpbnMoZWwpKSBub2Rlcy5wdXNoKGVsKTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBmbGF0dGVuKG5vZGVzLCB0aGlzLm93bmVyKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdmb3JFYWNoJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JFYWNoKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdpbmNsdWRlcycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gaW5jbHVkZXMoZWxlbWVudCwgaW5kZXgpIHtcblx0ICAgICAgcmV0dXJuIH50aGlzLmluZGV4T2YoZWxlbWVudCwgaW5kZXgpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ21hcCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuNSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNSksIF9rZXk1ID0gMDsgX2tleTUgPCBfbGVuNTsgX2tleTUrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTVdID0gYXJndW1lbnRzW19rZXk1XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIG1hcHBlZCA9IEFycmF5UHJvdG8ubWFwLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHQgICAgICByZXR1cm4gbWFwcGVkLnNvbWUoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgcmV0dXJuIGlzTm9kZShlbCkgfHwgaXNOb2RlTGlzdChlbCk7XG5cdCAgICAgIH0pID8gZmxhdHRlbihtYXBwZWQsIHRoaXMpIDogbWFwcGVkO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3BhcmVudCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcGFyZW50KCkge1xuXHQgICAgICByZXR1cm4gZmxhdHRlbih0aGlzLm1hcChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwucGFyZW50Tm9kZTtcblx0ICAgICAgfSksIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3BvcCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcG9wKGFtb3VudCkge1xuXHQgICAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHtcblx0ICAgICAgICBhbW91bnQgPSAxO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciBub2RlcyA9IFtdO1xuXHQgICAgICB2YXIgcG9wID0gQXJyYXlQcm90by5wb3AuYmluZCh0aGlzKTtcblx0ICAgICAgd2hpbGUgKGFtb3VudC0tKSB7XG5cdCAgICAgICAgbm9kZXMucHVzaChwb3AoKSk7XG5cdCAgICAgIH1yZXR1cm4gTm9kZUxpc3RKUyhub2RlcywgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncHVzaCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcHVzaCgpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIGZvciAodmFyIF9sZW42ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW42KSwgX2tleTYgPSAwOyBfa2V5NiA8IF9sZW42OyBfa2V5NisrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5Nl0gPSBhcmd1bWVudHNbX2tleTZdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guY2FsbChhcmdzLCBmdW5jdGlvbiAoYXJnKSB7XG5cdCAgICAgICAgaWYgKCFpc05vZGUoYXJnKSkgdGhyb3cgbm9kZUVycm9yO1xuXHQgICAgICAgIGlmICghfl90aGlzLmluZGV4T2YoYXJnKSkgQXJyYXlQcm90by5wdXNoLmNhbGwoX3RoaXMsIGFyZyk7XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzaGlmdCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoYW1vdW50KSB7XG5cdCAgICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgIGFtb3VudCA9IDE7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIG5vZGVzID0gW107XG5cdCAgICAgIHdoaWxlIChhbW91bnQtLSkge1xuXHQgICAgICAgIG5vZGVzLnB1c2goQXJyYXlQcm90by5zaGlmdC5jYWxsKHRoaXMpKTtcblx0ICAgICAgfXJldHVybiBub2Rlcy5sZW5ndGggPT0gMSA/IG5vZGVzWzBdIDogTm9kZUxpc3RKUyhub2RlcywgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnc2xpY2UnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWNlKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuNyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNyksIF9rZXk3ID0gMDsgX2tleTcgPCBfbGVuNzsgX2tleTcrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTddID0gYXJndW1lbnRzW19rZXk3XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIE5vZGVMaXN0SlMoQXJyYXlQcm90by5zbGljZS5hcHBseSh0aGlzLCBhcmdzKSwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnc3BsaWNlJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBzcGxpY2UoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW44ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW44KSwgX2tleTggPSAwOyBfa2V5OCA8IF9sZW44OyBfa2V5OCsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5OF0gPSBhcmd1bWVudHNbX2tleThdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBmb3IgKHZhciBpID0gMiwgbCA9IGFyZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdCAgICAgICAgaWYgKCFpc05vZGUoYXJnc1tpXSkpIHRocm93IG5vZGVFcnJvcjtcblx0ICAgICAgfVxuXHQgICAgICBBcnJheVByb3RvLnNwbGljZS5hcHBseSh0aGlzLCBhcmdzKTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAndW5zaGlmdCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdW5zaGlmdCgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICB2YXIgdW5zaGlmdCA9IEFycmF5UHJvdG8udW5zaGlmdC5iaW5kKHRoaXMpO1xuXHRcblx0ICAgICAgZm9yICh2YXIgX2xlbjkgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjkpLCBfa2V5OSA9IDA7IF9rZXk5IDwgX2xlbjk7IF9rZXk5KyspIHtcblx0ICAgICAgICBhcmdzW19rZXk5XSA9IGFyZ3VtZW50c1tfa2V5OV07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIEFycmF5UHJvdG8uZm9yRWFjaC5jYWxsKGFyZ3MsIGZ1bmN0aW9uIChhcmcpIHtcblx0ICAgICAgICBpZiAoIWlzTm9kZShhcmcpKSB0aHJvdyBub2RlRXJyb3I7XG5cdCAgICAgICAgaWYgKCF+X3RoaXMyLmluZGV4T2YoYXJnKSkgdW5zaGlmdChhcmcpO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnYWRkQ2xhc3MnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZENsYXNzKGNsYXNzZXMpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgdHJ1ZSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncmVtb3ZlQ2xhc3MnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGNsYXNzZXMpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgZmFsc2UpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3RvZ2dsZUNsYXNzJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b2dnbGVDbGFzcyhjbGFzc2VzKSB7XG5cdCAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcblx0XG5cdCAgICAgIHZhciBtZXRob2QgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsID8gJ3RvZ2dsZScgOiB2YWx1ZSA/ICdhZGQnIDogJ3JlbW92ZSc7XG5cdCAgICAgIGlmICh0eXBlb2YgY2xhc3NlcyA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy50cmltKCkucmVwbGFjZSgvXFxzKy8sICcgJykuc3BsaXQoJyAnKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBjbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcblx0ICAgICAgICAgIHJldHVybiBlbC5jbGFzc0xpc3RbbWV0aG9kXShjKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZ2V0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQocHJvcCkge1xuXHQgICAgICB2YXIgYXJyID0gW107XG5cdCAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBpZiAoZWwgIT09IG51bGwpIHtcblx0ICAgICAgICAgIGVsID0gZWxbcHJvcF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiBmbGF0dGVuKGFyciwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnc2V0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQocHJvcCwgdmFsdWUpIHtcblx0ICAgICAgaWYgKHByb3AuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuXHQgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChlbCkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcCkge1xuXHQgICAgICAgICAgICAgIGlmIChrZXkgaW4gZWwpIHtcblx0ICAgICAgICAgICAgICAgIGVsW2tleV0gPSBwcm9wW2tleV07XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKHByb3AgaW4gZWwpIHtcblx0ICAgICAgICAgICAgZWxbcHJvcF0gPSB2YWx1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdjYWxsJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxsKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuMTAgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjEwKSwgX2tleTEwID0gMDsgX2tleTEwIDwgX2xlbjEwOyBfa2V5MTArKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTEwXSA9IGFyZ3VtZW50c1tfa2V5MTBdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgbWV0aG9kID0gQXJyYXlQcm90by5zaGlmdC5jYWxsKGFyZ3MpO1xuXHQgICAgICB2YXIgYXJyID0gW107XG5cdCAgICAgIHZhciByZXR1cm5UaGlzID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbCAmJiBlbFttZXRob2RdIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgICAgICAgIGVsID0gZWxbbWV0aG9kXS5hcHBseShlbCwgYXJncyk7XG5cdCAgICAgICAgICBhcnIucHVzaChlbCk7XG5cdCAgICAgICAgICBpZiAocmV0dXJuVGhpcyAmJiBlbCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVyblRoaXMgPSBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgYXJyLnB1c2godW5kZWZpbmVkKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gcmV0dXJuVGhpcyA/IHRoaXMgOiBmbGF0dGVuKGFyciwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnaXRlbScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gaXRlbShpbmRleCkge1xuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhbdGhpc1tpbmRleF1dLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvbicsXG5cdFxuXHRcblx0ICAgIC8vIGV2ZW50IGhhbmRsZXJzXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb24oZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcblx0ICAgICAgaWYgKHR5cGVvZiBldmVudHMgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgZXZlbnRzID0gZXZlbnRzLnRyaW0oKS5yZXBsYWNlKC9cXHMrLywgJyAnKS5zcGxpdCgnICcpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghdGhpcyB8fCAhdGhpcy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXHQgICAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIGNhbGxiYWNrID0gc2VsZWN0b3I7XG5cdCAgICAgICAgc2VsZWN0b3IgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghY2FsbGJhY2spIHJldHVybiB0aGlzO1xuXHQgICAgICB2YXIgZm4gPSBjYWxsYmFjaztcblx0ICAgICAgY2FsbGJhY2sgPSBzZWxlY3RvciA/IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgdmFyIGVscyA9IE5vZGVMaXN0SlMoc2VsZWN0b3IsIHRoaXMpO1xuXHQgICAgICAgIGlmICghZWxzLmxlbmd0aCkge1xuXHQgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHMuc29tZShmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIHZhciB0YXJnZXQgPSBlbC5jb250YWlucyhlLnRhcmdldCk7XG5cdCAgICAgICAgICBpZiAodGFyZ2V0KSBmbi5jYWxsKGVsLCBlLCBlbCk7XG5cdCAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9IDogZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICBmbi5hcHBseSh0aGlzLCBbZSwgdGhpc10pO1xuXHQgICAgICB9O1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgICBpZiAoZWwgPT09IHdpbmRvdyB8fCBpc05vZGUoZWwpKSB7XG5cdCAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGNhbGxiYWNrLCBmYWxzZSk7XG5cdCAgICAgICAgICAgIEV2ZW50cy5wdXNoKHtcblx0ICAgICAgICAgICAgICBlbDogZWwsXG5cdCAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuXHQgICAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29mZicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb2ZmKGV2ZW50cywgY2FsbGJhY2spIHtcblx0ICAgICAgaWYgKGV2ZW50cyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdCAgICAgICAgY2FsbGJhY2sgPSBldmVudHM7XG5cdCAgICAgICAgZXZlbnRzID0gbnVsbDtcblx0ICAgICAgfVxuXHQgICAgICBldmVudHMgPSBldmVudHMgaW5zdGFuY2VvZiBBcnJheSA/IGV2ZW50cyA6IHR5cGVvZiBldmVudHMgPT09ICdzdHJpbmcnID8gZXZlbnRzLnRyaW0oKS5yZXBsYWNlKC9cXHMrLywgJyAnKS5zcGxpdCgnICcpIDogbnVsbDtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIEV2ZW50cyA9IEV2ZW50cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgIGlmIChlICYmIGUuZWwgPT09IGVsICYmICghY2FsbGJhY2sgfHwgY2FsbGJhY2sgPT09IGUuY2FsbGJhY2spICYmICghZXZlbnRzIHx8IH5ldmVudHMuaW5kZXhPZihlLmV2ZW50KSkpIHtcblx0ICAgICAgICAgICAgZS5lbC5yZW1vdmVFdmVudExpc3RlbmVyKGUuZXZlbnQsIGUuY2FsbGJhY2spO1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uQmx1cicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb25CbHVyKGNhbGxiYWNrKSB7XG5cdCAgICAgIGlmICghdGhpcyB8fCAhdGhpcy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXHQgICAgICBpZiAoIWNhbGxiYWNrKSByZXR1cm4gdGhpcztcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGJsdXJMaXN0LnB1c2goeyBlbDogZWwsIGNhbGxiYWNrOiBjYWxsYmFjayB9KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmICghYmx1ckV2ZW50KSB7XG5cdCAgICAgICAgYmx1ckV2ZW50ID0gZnVuY3Rpb24gYmx1ckV2ZW50KGUpIHtcblx0ICAgICAgICAgIGJsdXJMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcblx0ICAgICAgICAgICAgdmFyIHRhcmdldCA9IGl0ZW0uZWwuY29udGFpbnMoZS50YXJnZXQpIHx8IGl0ZW0uZWwgPT09IGUudGFyZ2V0O1xuXHQgICAgICAgICAgICBpZiAoIXRhcmdldCkgaXRlbS5jYWxsYmFjay5jYWxsKGl0ZW0uZWwsIGUsIGl0ZW0uZWwpO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGJsdXJFdmVudCwgZmFsc2UpO1xuXHQgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBibHVyRXZlbnQsIGZhbHNlKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvZmZCbHVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvZmZCbHVyKGNhbGxiYWNrKSB7XG5cdCAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBibHVyTGlzdCA9IGJsdXJMaXN0LmZpbHRlcihmdW5jdGlvbiAoYmx1cikge1xuXHQgICAgICAgICAgaWYgKGJsdXIgJiYgYmx1ci5lbCA9PT0gZWwgJiYgKCFjYWxsYmFjayB8fCBibHVyLmNhbGxiYWNrID09PSBjYWxsYmFjaykpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgcmV0dXJuIGVsO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnYXNBcnJheScsXG5cdCAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgICAgcmV0dXJuIEFycmF5UHJvdG8uc2xpY2UuY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0ICB9XSk7XG5cdCAgcmV0dXJuIE5vZGVMaXN0O1xuXHR9KCk7XG5cdFxuXHR2YXIgTkwgPSBOb2RlTGlzdC5wcm90b3R5cGU7XG5cdFxuXHRmdW5jdGlvbiBmbGF0dGVuKGFyciwgb3duZXIpIHtcblx0ICB2YXIgbGlzdCA9IFtdO1xuXHQgIEFycmF5UHJvdG8uZm9yRWFjaC5jYWxsKGFyciwgZnVuY3Rpb24gKGVsKSB7XG5cdCAgICBpZiAoaXNOb2RlKGVsKSkge1xuXHQgICAgICBpZiAoIX5saXN0LmluZGV4T2YoZWwpKSBsaXN0LnB1c2goZWwpO1xuXHQgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KGVsKSkge1xuXHQgICAgICBmb3IgKHZhciBpZCBpbiBlbCkge1xuXHQgICAgICAgIGlmICghfmxpc3QuaW5kZXhPZihlbFtpZF0pKSBsaXN0LnB1c2goZWxbaWRdKTtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIGlmIChlbCAhPT0gbnVsbCkge1xuXHQgICAgICBhcnIuZ2V0ID0gTkwuZ2V0O1xuXHQgICAgICBhcnIuc2V0ID0gTkwuc2V0O1xuXHQgICAgICBhcnIuY2FsbCA9IE5MLmNhbGw7XG5cdCAgICAgIGFyci5vd25lciA9IG93bmVyO1xuXHQgICAgICByZXR1cm4gYXJyO1xuXHQgICAgfVxuXHQgIH0pO1xuXHQgIHJldHVybiBOb2RlTGlzdEpTKGxpc3QsIG93bmVyKTtcblx0fVxuXHRcblx0dmFyIGV4Y2VwdGlvbnMgPSBbJ2pvaW4nLCAnY29weVdpdGhpbicsICdmaWxsJywgJ2ZpbmQnLCAnZm9yRWFjaCddO1xuXHQoMCwgX2dldE93blByb3BlcnR5TmFtZXMyLmRlZmF1bHQpKEFycmF5UHJvdG8pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuXHQgIGlmICghfmV4Y2VwdGlvbnMuaW5kZXhPZihrZXkpICYmIE5MW2tleV0gPT09IHVuZGVmaW5lZCkge1xuXHQgICAgTkxba2V5XSA9IEFycmF5UHJvdG9ba2V5XTtcblx0ICB9XG5cdH0pO1xuXHRpZiAod2luZG93LlN5bWJvbCAmJiBfaXRlcmF0b3IyLmRlZmF1bHQpIHtcblx0ICBOTFtfaXRlcmF0b3IyLmRlZmF1bHRdID0gTkwudmFsdWVzID0gQXJyYXlQcm90b1tfaXRlcmF0b3IyLmRlZmF1bHRdO1xuXHR9XG5cdHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0ZnVuY3Rpb24gc2V0dGVyR2V0dGVyKHByb3ApIHtcblx0ICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgaWYgKE5MW3Byb3BdKSByZXR1cm47XG5cdCAgaWYgKGRpdltwcm9wXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdCAgICBOTFtwcm9wXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgZm9yICh2YXIgX2xlbjExID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4xMSksIF9rZXkxMSA9IDA7IF9rZXkxMSA8IF9sZW4xMTsgX2tleTExKyspIHtcblx0ICAgICAgICBhcmdzW19rZXkxMV0gPSBhcmd1bWVudHNbX2tleTExXTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIGFyciA9IFtdO1xuXHQgICAgICB2YXIgcmV0dXJuVGhpcyA9IHRydWU7XG5cdCAgICAgIGZvciAodmFyIGkgaW4gTkwpIHtcblx0ICAgICAgICB2YXIgZWwgPSBOTFtpXTtcblx0ICAgICAgICBpZiAoZWwgJiYgZWxbcHJvcF0gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHQgICAgICAgICAgZWwgPSBlbFtwcm9wXS5hcHBseShlbCwgYXJncyk7XG5cdCAgICAgICAgICBhcnIucHVzaChlbCk7XG5cdCAgICAgICAgICBpZiAocmV0dXJuVGhpcyAmJiBlbCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVyblRoaXMgPSBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgYXJyLnB1c2godW5kZWZpbmVkKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHJldHVyblRoaXMgPyBfdGhpczMgOiBmbGF0dGVuKGFyciwgX3RoaXMzKTtcblx0ICAgIH07XG5cdCAgfSBlbHNlIHtcblx0ICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKE5MLCBwcm9wLCB7XG5cdCAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgICAgIHZhciBhcnIgPSBbXTtcblx0ICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgICBpZiAoZWwgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgZWwgPSBlbFtwcm9wXTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm4gZmxhdHRlbihhcnIsIHRoaXMpO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuXHQgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChlbCAmJiBwcm9wIGluIGVsKSB7XG5cdCAgICAgICAgICAgIGVsW3Byb3BdID0gdmFsdWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHQgIH1cblx0fVxuXHRmb3IgKHZhciBwcm9wIGluIGRpdikge1xuXHQgIHNldHRlckdldHRlcihwcm9wKTtcblx0fWZ1bmN0aW9uIE5vZGVMaXN0SlMoKSB7XG5cdCAgZm9yICh2YXIgX2xlbjEyID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4xMiksIF9rZXkxMiA9IDA7IF9rZXkxMiA8IF9sZW4xMjsgX2tleTEyKyspIHtcblx0ICAgIGFyZ3NbX2tleTEyXSA9IGFyZ3VtZW50c1tfa2V5MTJdO1xuXHQgIH1cblx0XG5cdCAgcmV0dXJuIG5ldyBOb2RlTGlzdChhcmdzKTtcblx0fVxuXHR3aW5kb3cuTkwgPSBOb2RlTGlzdEpTO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gTm9kZUxpc3RKUztcblxuLyoqKi8gfSxcbi8qIDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX193ZWJwYWNrX3JlcXVpcmVfXygzKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0dmFyICRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpLk9iamVjdDtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKXtcblx0ICByZXR1cm4gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0Ly8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcblx0JGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhX193ZWJwYWNrX3JlcXVpcmVfXygxNSksICdPYmplY3QnLCB7ZGVmaW5lUHJvcGVydHk6IF9fd2VicGFja19yZXF1aXJlX18oMTEpLmZ9KTtcblxuLyoqKi8gfSxcbi8qIDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnbG9iYWwgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBjb3JlICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpXG5cdCAgLCBjdHggICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpXG5cdCAgLCBoaWRlICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKVxuXHQgICwgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cdFxuXHR2YXIgJGV4cG9ydCA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHNvdXJjZSl7XG5cdCAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkZcblx0ICAgICwgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuR1xuXHQgICAgLCBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TXG5cdCAgICAsIElTX1BST1RPICA9IHR5cGUgJiAkZXhwb3J0LlBcblx0ICAgICwgSVNfQklORCAgID0gdHlwZSAmICRleHBvcnQuQlxuXHQgICAgLCBJU19XUkFQICAgPSB0eXBlICYgJGV4cG9ydC5XXG5cdCAgICAsIGV4cG9ydHMgICA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pXG5cdCAgICAsIGV4cFByb3RvICA9IGV4cG9ydHNbUFJPVE9UWVBFXVxuXHQgICAgLCB0YXJnZXQgICAgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG5cdCAgICAsIGtleSwgb3duLCBvdXQ7XG5cdCAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG5cdCAgZm9yKGtleSBpbiBzb3VyY2Upe1xuXHQgICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG5cdCAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuXHQgICAgaWYob3duICYmIGtleSBpbiBleHBvcnRzKWNvbnRpbnVlO1xuXHQgICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcblx0ICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG5cdCAgICAvLyBwcmV2ZW50IGdsb2JhbCBwb2xsdXRpb24gZm9yIG5hbWVzcGFjZXNcblx0ICAgIGV4cG9ydHNba2V5XSA9IElTX0dMT0JBTCAmJiB0eXBlb2YgdGFyZ2V0W2tleV0gIT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZVtrZXldXG5cdCAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuXHQgICAgOiBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbClcblx0ICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2UgdGhlbSBpbiBsaWJyYXJ5XG5cdCAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uKEMpe1xuXHQgICAgICB2YXIgRiA9IGZ1bmN0aW9uKGEsIGIsIGMpe1xuXHQgICAgICAgIGlmKHRoaXMgaW5zdGFuY2VvZiBDKXtcblx0ICAgICAgICAgIHN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtcblx0ICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEM7XG5cdCAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDKGEpO1xuXHQgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQyhhLCBiKTtcblx0ICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuXHQgICAgICAgIH0gcmV0dXJuIEMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgfTtcblx0ICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuXHQgICAgICByZXR1cm4gRjtcblx0ICAgIC8vIG1ha2Ugc3RhdGljIHZlcnNpb25zIGZvciBwcm90b3R5cGUgbWV0aG9kc1xuXHQgICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuXHQgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLm1ldGhvZHMuJU5BTUUlXG5cdCAgICBpZihJU19QUk9UTyl7XG5cdCAgICAgIChleHBvcnRzLnZpcnR1YWwgfHwgKGV4cG9ydHMudmlydHVhbCA9IHt9KSlba2V5XSA9IG91dDtcblx0ICAgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSVcblx0ICAgICAgaWYodHlwZSAmICRleHBvcnQuUiAmJiBleHBQcm90byAmJiAhZXhwUHJvdG9ba2V5XSloaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXHQvLyB0eXBlIGJpdG1hcFxuXHQkZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuXHQkZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuXHQkZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuXHQkZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG5cdCRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuXHQkZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcblx0JGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG5cdCRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YCBcblx0bW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuXG4vKioqLyB9LFxuLyogNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcblx0dmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG5cdCAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHRpZih0eXBlb2YgX19nID09ICdudW1iZXInKV9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4vKioqLyB9LFxuLyogNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHt2ZXJzaW9uOiAnMi40LjAnfTtcblx0aWYodHlwZW9mIF9fZSA9PSAnbnVtYmVyJylfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbi8qKiovIH0sXG4vKiA4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcblx0dmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCl7XG5cdCAgYUZ1bmN0aW9uKGZuKTtcblx0ICBpZih0aGF0ID09PSB1bmRlZmluZWQpcmV0dXJuIGZuO1xuXHQgIHN3aXRjaChsZW5ndGgpe1xuXHQgICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYSl7XG5cdCAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuXHQgICAgfTtcblx0ICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEsIGIpe1xuXHQgICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcblx0ICAgIH07XG5cdCAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbihhLCBiLCBjKXtcblx0ICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG5cdCAgICB9O1xuXHQgIH1cblx0ICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7XG5cdCAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgaWYodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGRQICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuXHQgICwgY3JlYXRlRGVzYyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpID8gZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcblx0ICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuXHR9IDogZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcblx0ICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuXHQgIHJldHVybiBvYmplY3Q7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGFuT2JqZWN0ICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcblx0ICAsIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNClcblx0ICAsIHRvUHJpbWl0aXZlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0ICAsIGRQICAgICAgICAgICAgID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXHRcblx0ZXhwb3J0cy5mID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKXtcblx0ICBhbk9iamVjdChPKTtcblx0ICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG5cdCAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG5cdCAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcblx0ICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcblx0ICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG5cdCAgaWYoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKXRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG5cdCAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKU9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuXHQgIHJldHVybiBPO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9ICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXygxNikoZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19yZXF1aXJlX18oMTcpKCdkaXYnKSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcblx0fSk7XG5cbi8qKiovIH0sXG4vKiAxNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxuXHRtb2R1bGUuZXhwb3J0cyA9ICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KShmdW5jdGlvbigpe1xuXHQgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG5cdH0pO1xuXG4vKioqLyB9LFxuLyogMTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYyl7XG5cdCAgdHJ5IHtcblx0ICAgIHJldHVybiAhIWV4ZWMoKTtcblx0ICB9IGNhdGNoKGUpe1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpXG5cdCAgLCBkb2N1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNikuZG9jdW1lbnRcblx0ICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcblx0ICAsIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuXHR2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblx0Ly8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcblx0Ly8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XG5cdCAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gaXQ7XG5cdCAgdmFyIGZuLCB2YWw7XG5cdCAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuXHQgIGlmKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcblx0ICBpZighUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuXHQgIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuXHQgIHJldHVybiB7XG5cdCAgICBlbnVtZXJhYmxlICA6ICEoYml0bWFwICYgMSksXG5cdCAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG5cdCAgICB3cml0YWJsZSAgICA6ICEoYml0bWFwICYgNCksXG5cdCAgICB2YWx1ZSAgICAgICA6IHZhbHVlXG5cdCAgfTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDIwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oMjEpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cbi8qKiovIH0sXG4vKiAyMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMik7XG5cdF9fd2VicGFja19yZXF1aXJlX18oNTEpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTUpLmYoJ2l0ZXJhdG9yJyk7XG5cbi8qKiovIH0sXG4vKiAyMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgJGF0ICA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpKHRydWUpO1xuXHRcblx0Ly8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbihpdGVyYXRlZCl7XG5cdCAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuXHQgIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG5cdC8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcblx0fSwgZnVuY3Rpb24oKXtcblx0ICB2YXIgTyAgICAgPSB0aGlzLl90XG5cdCAgICAsIGluZGV4ID0gdGhpcy5faVxuXHQgICAgLCBwb2ludDtcblx0ICBpZihpbmRleCA+PSBPLmxlbmd0aClyZXR1cm4ge3ZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWV9O1xuXHQgIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcblx0ICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcblx0ICByZXR1cm4ge3ZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2V9O1xuXHR9KTtcblxuLyoqKi8gfSxcbi8qIDIzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNClcblx0ICAsIGRlZmluZWQgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpO1xuXHQvLyB0cnVlICAtPiBTdHJpbmcjYXRcblx0Ly8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVE9fU1RSSU5HKXtcblx0ICByZXR1cm4gZnVuY3Rpb24odGhhdCwgcG9zKXtcblx0ICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpXG5cdCAgICAgICwgaSA9IHRvSW50ZWdlcihwb3MpXG5cdCAgICAgICwgbCA9IHMubGVuZ3RoXG5cdCAgICAgICwgYSwgYjtcblx0ICAgIGlmKGkgPCAwIHx8IGkgPj0gbClyZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG5cdCAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuXHQgICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcblx0ICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcblx0ICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG5cdCAgfTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDI0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyA3LjEuNCBUb0ludGVnZXJcblx0dmFyIGNlaWwgID0gTWF0aC5jZWlsXG5cdCAgLCBmbG9vciA9IE1hdGguZmxvb3I7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIGlmKGl0ID09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG5cdCAgcmV0dXJuIGl0O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0dmFyIExJQlJBUlkgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNylcblx0ICAsICRleHBvcnQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KVxuXHQgICwgcmVkZWZpbmUgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KVxuXHQgICwgaGlkZSAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKVxuXHQgICwgaGFzICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgSXRlcmF0b3JzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKVxuXHQgICwgJGl0ZXJDcmVhdGUgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMxKVxuXHQgICwgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KVxuXHQgICwgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5KVxuXHQgICwgSVRFUkFUT1IgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgnaXRlcmF0b3InKVxuXHQgICwgQlVHR1kgICAgICAgICAgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSkgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuXHQgICwgRkZfSVRFUkFUT1IgICAgPSAnQEBpdGVyYXRvcidcblx0ICAsIEtFWVMgICAgICAgICAgID0gJ2tleXMnXG5cdCAgLCBWQUxVRVMgICAgICAgICA9ICd2YWx1ZXMnO1xuXHRcblx0dmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKXtcblx0ICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cdCAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpe1xuXHQgICAgaWYoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pcmV0dXJuIHByb3RvW2tpbmRdO1xuXHQgICAgc3dpdGNoKGtpbmQpe1xuXHQgICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG5cdCAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG5cdCAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG5cdCAgfTtcblx0ICB2YXIgVEFHICAgICAgICA9IE5BTUUgKyAnIEl0ZXJhdG9yJ1xuXHQgICAgLCBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVNcblx0ICAgICwgVkFMVUVTX0JVRyA9IGZhbHNlXG5cdCAgICAsIHByb3RvICAgICAgPSBCYXNlLnByb3RvdHlwZVxuXHQgICAgLCAkbmF0aXZlICAgID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdXG5cdCAgICAsICRkZWZhdWx0ICAgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKVxuXHQgICAgLCAkZW50cmllcyAgID0gREVGQVVMVCA/ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKSA6IHVuZGVmaW5lZFxuXHQgICAgLCAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZVxuXHQgICAgLCBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuXHQgIC8vIEZpeCBuYXRpdmVcblx0ICBpZigkYW55TmF0aXZlKXtcblx0ICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKSk7XG5cdCAgICBpZihJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSl7XG5cdCAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcblx0ICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG5cdCAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuXHQgICAgICBpZighTElCUkFSWSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuXHQgICAgfVxuXHQgIH1cblx0ICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG5cdCAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKXtcblx0ICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuXHQgICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcblx0ICB9XG5cdCAgLy8gRGVmaW5lIGl0ZXJhdG9yXG5cdCAgaWYoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpe1xuXHQgICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcblx0ICB9XG5cdCAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuXHQgIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuXHQgIEl0ZXJhdG9yc1tUQUddICA9IHJldHVyblRoaXM7XG5cdCAgaWYoREVGQVVMVCl7XG5cdCAgICBtZXRob2RzID0ge1xuXHQgICAgICB2YWx1ZXM6ICBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcblx0ICAgICAga2V5czogICAgSVNfU0VUICAgICA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuXHQgICAgICBlbnRyaWVzOiAkZW50cmllc1xuXHQgICAgfTtcblx0ICAgIGlmKEZPUkNFRClmb3Ioa2V5IGluIG1ldGhvZHMpe1xuXHQgICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcblx0ICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG5cdCAgfVxuXHQgIHJldHVybiBtZXRob2RzO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gdHJ1ZTtcblxuLyoqKi8gfSxcbi8qIDI4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXG4vKioqLyB9LFxuLyogMjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdHZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuXHQgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8qKiovIH0sXG4vKiAzMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgY3JlYXRlICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyKVxuXHQgICwgZGVzY3JpcHRvciAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KVxuXHQgICwgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KVxuXHQgICwgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblx0XG5cdC8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTApKEl0ZXJhdG9yUHJvdG90eXBlLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgnaXRlcmF0b3InKSwgZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH0pO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCl7XG5cdCAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7bmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KX0pO1xuXHQgIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuXHR2YXIgYW5PYmplY3QgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKVxuXHQgICwgZFBzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzKVxuXHQgICwgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1KVxuXHQgICwgSUVfUFJPVE8gICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyKSgnSUVfUFJPVE8nKVxuXHQgICwgRW1wdHkgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XG5cdCAgLCBQUk9UT1RZUEUgICA9ICdwcm90b3R5cGUnO1xuXHRcblx0Ly8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxuXHR2YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XG5cdCAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcblx0ICB2YXIgaWZyYW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNykoJ2lmcmFtZScpXG5cdCAgICAsIGkgICAgICA9IGVudW1CdWdLZXlzLmxlbmd0aFxuXHQgICAgLCBsdCAgICAgPSAnPCdcblx0ICAgICwgZ3QgICAgID0gJz4nXG5cdCAgICAsIGlmcmFtZURvY3VtZW50O1xuXHQgIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHQgIF9fd2VicGFja19yZXF1aXJlX18oNDYpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG5cdCAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuXHQgIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG5cdCAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuXHQgIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG5cdCAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuXHQgIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcblx0ICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuXHQgIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuXHQgIHdoaWxlKGktLSlkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcblx0ICByZXR1cm4gY3JlYXRlRGljdCgpO1xuXHR9O1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKXtcblx0ICB2YXIgcmVzdWx0O1xuXHQgIGlmKE8gIT09IG51bGwpe1xuXHQgICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuXHQgICAgcmVzdWx0ID0gbmV3IEVtcHR5O1xuXHQgICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG5cdCAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG5cdCAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcblx0ICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuXHQgIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMzMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBkUCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG5cdCAgLCBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpXG5cdCAgLCBnZXRLZXlzICA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKXtcblx0ICBhbk9iamVjdChPKTtcblx0ICB2YXIga2V5cyAgID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKVxuXHQgICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuXHQgICAgLCBpID0gMFxuXHQgICAgLCBQO1xuXHQgIHdoaWxlKGxlbmd0aCA+IGkpZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcblx0ICByZXR1cm4gTztcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcblx0dmFyICRrZXlzICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNSlcblx0ICAsIGVudW1CdWdLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NSk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTyl7XG5cdCAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgaGFzICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIHRvSU9iamVjdCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCBhcnJheUluZGV4T2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM5KShmYWxzZSlcblx0ICAsIElFX1BST1RPICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpKCdJRV9QUk9UTycpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIG5hbWVzKXtcblx0ICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcblx0ICAgICwgaSAgICAgID0gMFxuXHQgICAgLCByZXN1bHQgPSBbXVxuXHQgICAgLCBrZXk7XG5cdCAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuXHQgIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcblx0ICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XG5cdCAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuXHQgIH1cblx0ICByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xuXHR2YXIgSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzcpXG5cdCAgLCBkZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xuXHR2YXIgY29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOCk7XG5cdG1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdHZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG5cdC8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG5cdHZhciB0b0lPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2KVxuXHQgICwgdG9MZW5ndGggID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MClcblx0ICAsIHRvSW5kZXggICA9IF9fd2VicGFja19yZXF1aXJlX18oNDEpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcblx0ICByZXR1cm4gZnVuY3Rpb24oJHRoaXMsIGVsLCBmcm9tSW5kZXgpe1xuXHQgICAgdmFyIE8gICAgICA9IHRvSU9iamVjdCgkdGhpcylcblx0ICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcblx0ICAgICAgLCBpbmRleCAgPSB0b0luZGV4KGZyb21JbmRleCwgbGVuZ3RoKVxuXHQgICAgICAsIHZhbHVlO1xuXHQgICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuXHQgICAgaWYoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpd2hpbGUobGVuZ3RoID4gaW5kZXgpe1xuXHQgICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG5cdCAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuXHQgICAgLy8gQXJyYXkjdG9JbmRleCBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuXHQgICAgfSBlbHNlIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTyl7XG5cdCAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcblx0ICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMS4xNSBUb0xlbmd0aFxuXHR2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNClcblx0ICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxuXHR9O1xuXG4vKioqLyB9LFxuLyogNDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KVxuXHQgICwgbWF4ICAgICAgID0gTWF0aC5tYXhcblx0ICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGluZGV4LCBsZW5ndGgpe1xuXHQgIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcblx0ICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MykoJ2tleXMnKVxuXHQgICwgdWlkICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcblx0ICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJ1xuXHQgICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG5cdCAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB7fSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA0NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIGlkID0gMFxuXHQgICwgcHggPSBNYXRoLnJhbmRvbSgpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG5cdCAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQ1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5cdG1vZHVsZS5leHBvcnRzID0gKFxuXHQgICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG5cdCkuc3BsaXQoJywnKTtcblxuLyoqKi8gfSxcbi8qIDQ2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNikuZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4vKioqLyB9LFxuLyogNDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBkZWYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKS5mXG5cdCAgLCBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgVEFHID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OCkoJ3RvU3RyaW5nVGFnJyk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuXHQgIGlmKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpZGVmKGl0LCBUQUcsIHtjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWd9KTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQ4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgc3RvcmUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDMpKCd3a3MnKVxuXHQgICwgdWlkICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDQpXG5cdCAgLCBTeW1ib2wgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KS5TeW1ib2xcblx0ICAsIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cdFxuXHR2YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuXHQgIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuXHQgICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcblx0fTtcblx0XG5cdCRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG5cbi8qKiovIH0sXG4vKiA0OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcblx0dmFyIGhhcyAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIHRvT2JqZWN0ICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MClcblx0ICAsIElFX1BST1RPICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MikoJ0lFX1BST1RPJylcblx0ICAsIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uKE8pe1xuXHQgIE8gPSB0b09iamVjdChPKTtcblx0ICBpZihoYXMoTywgSUVfUFJPVE8pKXJldHVybiBPW0lFX1BST1RPXTtcblx0ICBpZih0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKXtcblx0ICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblx0ICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcblx0dmFyIGRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1Mik7XG5cdHZhciBnbG9iYWwgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KVxuXHQgICwgaGlkZSAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG5cdCAgLCBJdGVyYXRvcnMgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMClcblx0ICAsIFRPX1NUUklOR19UQUcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgndG9TdHJpbmdUYWcnKTtcblx0XG5cdGZvcih2YXIgY29sbGVjdGlvbnMgPSBbJ05vZGVMaXN0JywgJ0RPTVRva2VuTGlzdCcsICdNZWRpYUxpc3QnLCAnU3R5bGVTaGVldExpc3QnLCAnQ1NTUnVsZUxpc3QnXSwgaSA9IDA7IGkgPCA1OyBpKyspe1xuXHQgIHZhciBOQU1FICAgICAgID0gY29sbGVjdGlvbnNbaV1cblx0ICAgICwgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXVxuXHQgICAgLCBwcm90byAgICAgID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcblx0ICBpZihwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10paGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG5cdCAgSXRlcmF0b3JzW05BTUVdID0gSXRlcmF0b3JzLkFycmF5O1xuXHR9XG5cbi8qKiovIH0sXG4vKiA1MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oNTMpXG5cdCAgLCBzdGVwICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NClcblx0ICAsIEl0ZXJhdG9ycyAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKVxuXHQgICwgdG9JT2JqZWN0ICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpO1xuXHRcblx0Ly8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuXHQvLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuXHQvLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG5cdC8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG5cdCAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuXHQgIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG5cdCAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcblx0Ly8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG5cdH0sIGZ1bmN0aW9uKCl7XG5cdCAgdmFyIE8gICAgID0gdGhpcy5fdFxuXHQgICAgLCBraW5kICA9IHRoaXMuX2tcblx0ICAgICwgaW5kZXggPSB0aGlzLl9pKys7XG5cdCAgaWYoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpe1xuXHQgICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcblx0ICAgIHJldHVybiBzdGVwKDEpO1xuXHQgIH1cblx0ICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGluZGV4KTtcblx0ICBpZihraW5kID09ICd2YWx1ZXMnKXJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcblx0ICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG5cdH0sICd2YWx1ZXMnKTtcblx0XG5cdC8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcblx0SXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblx0XG5cdGFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcblx0YWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5cdGFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcblxuLyoqKi8gfSxcbi8qIDUzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH07XG5cbi8qKiovIH0sXG4vKiA1NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkb25lLCB2YWx1ZSl7XG5cdCAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cy5mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OCk7XG5cbi8qKiovIH0sXG4vKiA1NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3KSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogNTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oNTgpO1xuXHR2YXIgJE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNykuT2JqZWN0O1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuXHQgIHJldHVybiAkT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG5cdF9fd2VicGFja19yZXF1aXJlX18oNTkpKCdnZXRPd25Qcm9wZXJ0eU5hbWVzJywgZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg2MCkuZjtcblx0fSk7XG5cbi8qKiovIH0sXG4vKiA1OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG5cdHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KVxuXHQgICwgY29yZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcblx0ICAsIGZhaWxzICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVksIGV4ZWMpe1xuXHQgIHZhciBmbiAgPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV1cblx0ICAgICwgZXhwID0ge307XG5cdCAgZXhwW0tFWV0gPSBleGVjKGZuKTtcblx0ICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uKCl7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA2MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xuXHR2YXIgdG9JT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIGdPUE4gICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNjEpLmZcblx0ICAsIHRvU3RyaW5nICA9IHt9LnRvU3RyaW5nO1xuXHRcblx0dmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcblx0ICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblx0XG5cdHZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uKGl0KXtcblx0ICB0cnkge1xuXHQgICAgcmV0dXJuIGdPUE4oaXQpO1xuXHQgIH0gY2F0Y2goZSl7XG5cdCAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcblx0ICB9XG5cdH07XG5cdFxuXHRtb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG5cdCAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogZ09QTih0b0lPYmplY3QoaXQpKTtcblx0fTtcblxuXG4vKioqLyB9LFxuLyogNjEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcblx0dmFyICRrZXlzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1KVxuXHQgICwgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXHRcblx0ZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKXtcblx0ICByZXR1cm4gJGtleXMoTywgaGlkZGVuS2V5cyk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA2MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuXHQgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG5cdCAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDYzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdFxuXHR2YXIgX2RlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0XG5cdHZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcblx0ICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcblx0ICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuXHQgICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG5cdCAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG5cdCAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuXHQgICAgfVxuXHQgIH1cblx0XG5cdCAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcblx0ICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG5cdCAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcblx0ICAgIHJldHVybiBDb25zdHJ1Y3Rvcjtcblx0ICB9O1xuXHR9KCk7XG5cbi8qKiovIH0sXG4vKiA2NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0LyoqXHJcblx0ICogQXJyYXkuZmluZFxyXG5cdCAqL1xuXHRpZiAoIUFycmF5LnByb3RvdHlwZS5maW5kKSB7XG5cdCAgQXJyYXkucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG5cdCAgICAndXNlIHN0cmljdCc7XG5cdFxuXHQgICAgaWYgKHRoaXMgPT0gbnVsbCkge1xuXHQgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUuZmluZCBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQnKTtcblx0ICAgIH1cblx0ICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblx0ICAgIH1cblx0ICAgIHZhciBsaXN0ID0gT2JqZWN0KHRoaXMpO1xuXHQgICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoID4+PiAwO1xuXHQgICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07XG5cdCAgICB2YXIgdmFsdWU7XG5cdFxuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuXHQgICAgICB2YWx1ZSA9IGxpc3RbaV07XG5cdCAgICAgIGlmIChwcmVkaWNhdGUuY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaSwgbGlzdCkpIHtcblx0ICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiB1bmRlZmluZWQ7XG5cdCAgfTtcblx0fVxuXHRcblx0LypcclxuXHQgKiBjbGFzc0xpc3QuanM6IENyb3NzLWJyb3dzZXIgZnVsbCBlbGVtZW50LmNsYXNzTGlzdCBpbXBsZW1lbnRhdGlvbi5cclxuXHQgKiAxLjEuMjAxNTAzMTJcclxuXHQgKlxyXG5cdCAqIEJ5IEVsaSBHcmV5LCBodHRwOi8vZWxpZ3JleS5jb21cclxuXHQgKiBMaWNlbnNlOiBEZWRpY2F0ZWQgdG8gdGhlIHB1YmxpYyBkb21haW4uXHJcblx0ICogICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvY2xhc3NMaXN0LmpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UubWRcclxuXHQgKi9cblx0LypnbG9iYWwgc2VsZiwgZG9jdW1lbnQsIERPTUV4Y2VwdGlvbiAqL1xuXHQvKiEgQHNvdXJjZSBodHRwOi8vcHVybC5lbGlncmV5LmNvbS9naXRodWIvY2xhc3NMaXN0LmpzL2Jsb2IvbWFzdGVyL2NsYXNzTGlzdC5qcyAqL1xuXHRpZiAoXCJkb2N1bWVudFwiIGluIHNlbGYpIHtcblx0ICAvLyBGdWxsIHBvbHlmaWxsIGZvciBicm93c2VycyB3aXRoIG5vIGNsYXNzTGlzdCBzdXBwb3J0XG5cdCAgLy8gSW5jbHVkaW5nIElFIDwgRWRnZSBtaXNzaW5nIFNWR0VsZW1lbnQuY2xhc3NMaXN0XG5cdCAgaWYgKCEoXCJjbGFzc0xpc3RcIiBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiX1wiKSkgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TICYmICEoXCJjbGFzc0xpc3RcIiBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIikpKSB7XG5cdFxuXHQgICAgKGZ1bmN0aW9uICh2aWV3KSB7XG5cdFxuXHQgICAgICBcInVzZSBzdHJpY3RcIjtcblx0XG5cdCAgICAgIGlmICghKCdFbGVtZW50JyBpbiB2aWV3KSkgcmV0dXJuO1xuXHRcblx0ICAgICAgdmFyIGNsYXNzTGlzdFByb3AgPSBcImNsYXNzTGlzdFwiLFxuXHQgICAgICAgICAgcHJvdG9Qcm9wID0gXCJwcm90b3R5cGVcIixcblx0ICAgICAgICAgIGVsZW1DdHJQcm90byA9IHZpZXcuRWxlbWVudFtwcm90b1Byb3BdLFxuXHQgICAgICAgICAgb2JqQ3RyID0gT2JqZWN0LFxuXHQgICAgICAgICAgc3RyVHJpbSA9IFN0cmluZ1twcm90b1Byb3BdLnRyaW0gfHwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoL15cXHMrfFxccyskL2csIFwiXCIpO1xuXHQgICAgICB9LFxuXHQgICAgICAgICAgYXJySW5kZXhPZiA9IEFycmF5W3Byb3RvUHJvcF0uaW5kZXhPZiB8fCBmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgICAgIHZhciBpID0gMCxcblx0ICAgICAgICAgICAgbGVuID0gdGhpcy5sZW5ndGg7XG5cdCAgICAgICAgZm9yICg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgaWYgKGkgaW4gdGhpcyAmJiB0aGlzW2ldID09PSBpdGVtKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gLTE7XG5cdCAgICAgIH1cblx0ICAgICAgLy8gVmVuZG9yczogcGxlYXNlIGFsbG93IGNvbnRlbnQgY29kZSB0byBpbnN0YW50aWF0ZSBET01FeGNlcHRpb25zXG5cdCAgICAgICxcblx0ICAgICAgICAgIERPTUV4ID0gZnVuY3Rpb24gRE9NRXgodHlwZSwgbWVzc2FnZSkge1xuXHQgICAgICAgIHRoaXMubmFtZSA9IHR5cGU7XG5cdCAgICAgICAgdGhpcy5jb2RlID0gRE9NRXhjZXB0aW9uW3R5cGVdO1xuXHQgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBjaGVja1Rva2VuQW5kR2V0SW5kZXggPSBmdW5jdGlvbiBjaGVja1Rva2VuQW5kR2V0SW5kZXgoY2xhc3NMaXN0LCB0b2tlbikge1xuXHQgICAgICAgIGlmICh0b2tlbiA9PT0gXCJcIikge1xuXHQgICAgICAgICAgdGhyb3cgbmV3IERPTUV4KFwiU1lOVEFYX0VSUlwiLCBcIkFuIGludmFsaWQgb3IgaWxsZWdhbCBzdHJpbmcgd2FzIHNwZWNpZmllZFwiKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKC9cXHMvLnRlc3QodG9rZW4pKSB7XG5cdCAgICAgICAgICB0aHJvdyBuZXcgRE9NRXgoXCJJTlZBTElEX0NIQVJBQ1RFUl9FUlJcIiwgXCJTdHJpbmcgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXJcIik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBhcnJJbmRleE9mLmNhbGwoY2xhc3NMaXN0LCB0b2tlbik7XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBDbGFzc0xpc3QgPSBmdW5jdGlvbiBDbGFzc0xpc3QoZWxlbSkge1xuXHQgICAgICAgIHZhciB0cmltbWVkQ2xhc3NlcyA9IHN0clRyaW0uY2FsbChlbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpLFxuXHQgICAgICAgICAgICBjbGFzc2VzID0gdHJpbW1lZENsYXNzZXMgPyB0cmltbWVkQ2xhc3Nlcy5zcGxpdCgvXFxzKy8pIDogW10sXG5cdCAgICAgICAgICAgIGkgPSAwLFxuXHQgICAgICAgICAgICBsZW4gPSBjbGFzc2VzLmxlbmd0aDtcblx0ICAgICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICB0aGlzLnB1c2goY2xhc3Nlc1tpXSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy50b1N0cmluZygpKTtcblx0ICAgICAgICB9O1xuXHQgICAgICB9LFxuXHQgICAgICAgICAgY2xhc3NMaXN0UHJvdG8gPSBDbGFzc0xpc3RbcHJvdG9Qcm9wXSA9IFtdLFxuXHQgICAgICAgICAgY2xhc3NMaXN0R2V0dGVyID0gZnVuY3Rpb24gY2xhc3NMaXN0R2V0dGVyKCkge1xuXHQgICAgICAgIHJldHVybiBuZXcgQ2xhc3NMaXN0KHRoaXMpO1xuXHQgICAgICB9O1xuXHQgICAgICAvLyBNb3N0IERPTUV4Y2VwdGlvbiBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgYWxsb3cgY2FsbGluZyBET01FeGNlcHRpb24ncyB0b1N0cmluZygpXG5cdCAgICAgIC8vIG9uIG5vbi1ET01FeGNlcHRpb25zLiBFcnJvcidzIHRvU3RyaW5nKCkgaXMgc3VmZmljaWVudCBoZXJlLlxuXHQgICAgICBET01FeFtwcm90b1Byb3BdID0gRXJyb3JbcHJvdG9Qcm9wXTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8uaXRlbSA9IGZ1bmN0aW9uIChpKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXNbaV0gfHwgbnVsbDtcblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8uY29udGFpbnMgPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICB0b2tlbiArPSBcIlwiO1xuXHQgICAgICAgIHJldHVybiBjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pICE9PSAtMTtcblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8uYWRkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0b2tlbnMgPSBhcmd1bWVudHMsXG5cdCAgICAgICAgICAgIGkgPSAwLFxuXHQgICAgICAgICAgICBsID0gdG9rZW5zLmxlbmd0aCxcblx0ICAgICAgICAgICAgdG9rZW4sXG5cdCAgICAgICAgICAgIHVwZGF0ZWQgPSBmYWxzZTtcblx0ICAgICAgICBkbyB7XG5cdCAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXSArIFwiXCI7XG5cdCAgICAgICAgICBpZiAoY2hlY2tUb2tlbkFuZEdldEluZGV4KHRoaXMsIHRva2VuKSA9PT0gLTEpIHtcblx0ICAgICAgICAgICAgdGhpcy5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSB3aGlsZSAoKytpIDwgbCk7XG5cdFxuXHQgICAgICAgIGlmICh1cGRhdGVkKSB7XG5cdCAgICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIGNsYXNzTGlzdFByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgdG9rZW5zID0gYXJndW1lbnRzLFxuXHQgICAgICAgICAgICBpID0gMCxcblx0ICAgICAgICAgICAgbCA9IHRva2Vucy5sZW5ndGgsXG5cdCAgICAgICAgICAgIHRva2VuLFxuXHQgICAgICAgICAgICB1cGRhdGVkID0gZmFsc2UsXG5cdCAgICAgICAgICAgIGluZGV4O1xuXHQgICAgICAgIGRvIHtcblx0ICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldICsgXCJcIjtcblx0ICAgICAgICAgIGluZGV4ID0gY2hlY2tUb2tlbkFuZEdldEluZGV4KHRoaXMsIHRva2VuKTtcblx0ICAgICAgICAgIHdoaWxlIChpbmRleCAhPT0gLTEpIHtcblx0ICAgICAgICAgICAgdGhpcy5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gd2hpbGUgKCsraSA8IGwpO1xuXHRcblx0ICAgICAgICBpZiAodXBkYXRlZCkge1xuXHQgICAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by50b2dnbGUgPSBmdW5jdGlvbiAodG9rZW4sIGZvcmNlKSB7XG5cdCAgICAgICAgdG9rZW4gKz0gXCJcIjtcblx0XG5cdCAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuY29udGFpbnModG9rZW4pLFxuXHQgICAgICAgICAgICBtZXRob2QgPSByZXN1bHQgPyBmb3JjZSAhPT0gdHJ1ZSAmJiBcInJlbW92ZVwiIDogZm9yY2UgIT09IGZhbHNlICYmIFwiYWRkXCI7XG5cdFxuXHQgICAgICAgIGlmIChtZXRob2QpIHtcblx0ICAgICAgICAgIHRoaXNbbWV0aG9kXSh0b2tlbik7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICBpZiAoZm9yY2UgPT09IHRydWUgfHwgZm9yY2UgPT09IGZhbHNlKSB7XG5cdCAgICAgICAgICByZXR1cm4gZm9yY2U7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHJldHVybiAhcmVzdWx0O1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuam9pbihcIiBcIik7XG5cdCAgICAgIH07XG5cdFxuXHQgICAgICBpZiAob2JqQ3RyLmRlZmluZVByb3BlcnR5KSB7XG5cdCAgICAgICAgdmFyIGNsYXNzTGlzdFByb3BEZXNjID0ge1xuXHQgICAgICAgICAgZ2V0OiBjbGFzc0xpc3RHZXR0ZXIsXG5cdCAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KGVsZW1DdHJQcm90bywgY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0UHJvcERlc2MpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG5cdCAgICAgICAgICAvLyBJRSA4IGRvZXNuJ3Qgc3VwcG9ydCBlbnVtZXJhYmxlOnRydWVcblx0ICAgICAgICAgIGlmIChleC5udW1iZXIgPT09IC0weDdGRjVFQzU0KSB7XG5cdCAgICAgICAgICAgIGNsYXNzTGlzdFByb3BEZXNjLmVudW1lcmFibGUgPSBmYWxzZTtcblx0ICAgICAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KGVsZW1DdHJQcm90bywgY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0UHJvcERlc2MpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIGlmIChvYmpDdHJbcHJvdG9Qcm9wXS5fX2RlZmluZUdldHRlcl9fKSB7XG5cdCAgICAgICAgZWxlbUN0clByb3RvLl9fZGVmaW5lR2V0dGVyX18oY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0R2V0dGVyKTtcblx0ICAgICAgfVxuXHQgICAgfSkoc2VsZik7XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vIFRoZXJlIGlzIGZ1bGwgb3IgcGFydGlhbCBuYXRpdmUgY2xhc3NMaXN0IHN1cHBvcnQsIHNvIGp1c3QgY2hlY2sgaWYgd2UgbmVlZFxuXHQgICAgLy8gdG8gbm9ybWFsaXplIHRoZSBhZGQvcmVtb3ZlIGFuZCB0b2dnbGUgQVBJcy5cblx0XG5cdCAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICBcInVzZSBzdHJpY3RcIjtcblx0XG5cdCAgICAgIHZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJfXCIpO1xuXHRcblx0ICAgICAgdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImMxXCIsIFwiYzJcIik7XG5cdFxuXHQgICAgICAvLyBQb2x5ZmlsbCBmb3IgSUUgMTAvMTEgYW5kIEZpcmVmb3ggPDI2LCB3aGVyZSBjbGFzc0xpc3QuYWRkIGFuZFxuXHQgICAgICAvLyBjbGFzc0xpc3QucmVtb3ZlIGV4aXN0IGJ1dCBzdXBwb3J0IG9ubHkgb25lIGFyZ3VtZW50IGF0IGEgdGltZS5cblx0ICAgICAgaWYgKCF0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjMlwiKSkge1xuXHQgICAgICAgIHZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiBjcmVhdGVNZXRob2QobWV0aG9kKSB7XG5cdCAgICAgICAgICB2YXIgb3JpZ2luYWwgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlW21ldGhvZF07XG5cdFxuXHQgICAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgIHZhciBpLFxuXHQgICAgICAgICAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblx0XG5cdCAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICAgIHRva2VuID0gYXJndW1lbnRzW2ldO1xuXHQgICAgICAgICAgICAgIG9yaWdpbmFsLmNhbGwodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgY3JlYXRlTWV0aG9kKCdhZGQnKTtcblx0ICAgICAgICBjcmVhdGVNZXRob2QoJ3JlbW92ZScpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKFwiYzNcIiwgZmFsc2UpO1xuXHRcblx0ICAgICAgLy8gUG9seWZpbGwgZm9yIElFIDEwIGFuZCBGaXJlZm94IDwyNCwgd2hlcmUgY2xhc3NMaXN0LnRvZ2dsZSBkb2VzIG5vdFxuXHQgICAgICAvLyBzdXBwb3J0IHRoZSBzZWNvbmQgYXJndW1lbnQuXG5cdCAgICAgIGlmICh0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjM1wiKSkge1xuXHQgICAgICAgIHZhciBfdG9nZ2xlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGU7XG5cdFxuXHQgICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKHRva2VuLCBmb3JjZSkge1xuXHQgICAgICAgICAgaWYgKDEgaW4gYXJndW1lbnRzICYmICF0aGlzLmNvbnRhaW5zKHRva2VuKSA9PT0gIWZvcmNlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmb3JjZTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiBfdG9nZ2xlLmNhbGwodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHRlc3RFbGVtZW50ID0gbnVsbDtcblx0ICAgIH0pKCk7XG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA2NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdGV4cG9ydHMuZ2V0SlNPTiA9IGdldEpTT047XG5cdGV4cG9ydHMuZ2V0U2Nyb2xsQmFyV2lkdGggPSBnZXRTY3JvbGxCYXJXaWR0aDtcblx0ZXhwb3J0cy50cmFuc2xhdGlvbnMgPSB0cmFuc2xhdGlvbnM7XG5cdGV4cG9ydHMuZGVsYXllciA9IGRlbGF5ZXI7XG5cdGV4cG9ydHMuVnVlRml4ZXIgPSBWdWVGaXhlcjtcblx0Ly8gY29lcmNlIGNvbnZlcnQgc29tIHR5cGVzIG9mIGRhdGEgaW50byBhbm90aGVyIHR5cGVcblx0dmFyIGNvZXJjZSA9IGV4cG9ydHMuY29lcmNlID0ge1xuXHQgIC8vIENvbnZlcnQgYSBzdHJpbmcgdG8gYm9vbGVhbS4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHZhbHVlIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBzbyBpZiBpcyBub3QgYm9vbGVhbiwgVnVlIHRocm93IGEgd2FybmluZy5cblx0ICBib29sZWFuOiBmdW5jdGlvbiBib29sZWFuKHZhbCkge1xuXHQgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gdmFsID09PSAnJyB8fCB2YWwgPT09ICd0cnVlJyA/IHRydWUgOiB2YWwgPT09ICdmYWxzZScgfHwgdmFsID09PSAnbnVsbCcgfHwgdmFsID09PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogdmFsIDogdmFsO1xuXHQgIH0sXG5cdCAgLy8gQXR0ZW1wdCB0byBjb252ZXJ0IGEgc3RyaW5nIHZhbHVlIHRvIGEgTnVtYmVyLiBPdGhlcndpc2UsIHJldHVybiAwLlxuXHQgIG51bWJlcjogZnVuY3Rpb24gbnVtYmVyKHZhbCkge1xuXHQgICAgdmFyIGFsdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcblx0ICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyA/IHZhbCA6IHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCB8fCBpc05hTihOdW1iZXIodmFsKSkgPyBhbHQgOiBOdW1iZXIodmFsKTtcblx0ICB9LFxuXHQgIC8vIEF0dGVtcHQgdG8gY29udmVydCB0byBzdHJpbmcgYW55IHZhbHVlLCBleGNlcHQgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuXHQgIHN0cmluZzogZnVuY3Rpb24gc3RyaW5nKHZhbCkge1xuXHQgICAgcmV0dXJuIHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCA/ICcnIDogdmFsICsgJyc7XG5cdCAgfSxcblx0ICAvLyBQYXR0ZXJuIGFjY2VwdCBSZWdFeHAsIGZ1bmN0aW9uLCBvciBzdHJpbmcgKGNvbnZlcnRlZCB0byBSZWdFeHApLiBPdGhlcndpc2UgcmV0dXJuIG51bGwuXG5cdCAgcGF0dGVybjogZnVuY3Rpb24gcGF0dGVybih2YWwpIHtcblx0ICAgIHJldHVybiB2YWwgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB2YWwgaW5zdGFuY2VvZiBSZWdFeHAgPyB2YWwgOiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IG5ldyBSZWdFeHAodmFsKSA6IG51bGw7XG5cdCAgfVxuXHR9O1xuXHRcblx0ZnVuY3Rpb24gZ2V0SlNPTih1cmwpIHtcblx0ICB2YXIgcmVxdWVzdCA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblx0ICB2YXIgZGF0YSA9IHt9O1xuXHQgIC8vIHAgKC1zaW11bGF0ZWQtIHByb21pc2UpXG5cdCAgdmFyIHAgPSB7XG5cdCAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKGZuMSwgZm4yKSB7XG5cdCAgICAgIHJldHVybiBwLmRvbmUoZm4xKS5mYWlsKGZuMik7XG5cdCAgICB9LFxuXHQgICAgY2F0Y2g6IGZ1bmN0aW9uIF9jYXRjaChmbikge1xuXHQgICAgICByZXR1cm4gcC5mYWlsKGZuKTtcblx0ICAgIH0sXG5cdCAgICBhbHdheXM6IGZ1bmN0aW9uIGFsd2F5cyhmbikge1xuXHQgICAgICByZXR1cm4gcC5kb25lKGZuKS5mYWlsKGZuKTtcblx0ICAgIH1cblx0ICB9O1xuXHQgIFsnZG9uZScsICdmYWlsJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuXHQgICAgZGF0YVtuYW1lXSA9IFtdO1xuXHQgICAgcFtuYW1lXSA9IGZ1bmN0aW9uIChmbikge1xuXHQgICAgICBpZiAoZm4gaW5zdGFuY2VvZiBGdW5jdGlvbikgZGF0YVtuYW1lXS5wdXNoKGZuKTtcblx0ICAgICAgcmV0dXJuIHA7XG5cdCAgICB9O1xuXHQgIH0pO1xuXHQgIHAuZG9uZShKU09OLnBhcnNlKTtcblx0ICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgPT09IDQpIHtcblx0ICAgICAgdmFyIHJlc3BvbnNlO1xuXHQgICAgICB2YXIgaTtcblx0ICAgICAgdmFyIHZhbHVlO1xuXHRcblx0ICAgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgZSA9IHsgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyB9O1xuXHQgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG5cdCAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICByZXNwb25zZSA9IHJlcXVlc3QucmVzcG9uc2VUZXh0O1xuXHRcblx0ICAgICAgICAgICAgZm9yIChpIGluIGRhdGEuZG9uZSkge1xuXHQgICAgICAgICAgICAgIHZhbHVlID0gZGF0YS5kb25lW2ldKHJlc3BvbnNlKTtcblx0XG5cdCAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgZGF0YS5mYWlsLmZvckVhY2goZnVuY3Rpb24gKGZhaWwpIHtcblx0ICAgICAgICAgICAgICByZXR1cm4gZmFpbChlcnIpO1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgZGF0YS5mYWlsLmZvckVhY2goZnVuY3Rpb24gKGZhaWwpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhaWwoZSk7XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pKCk7XG5cdCAgICB9XG5cdCAgfTtcblx0ICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHVybCk7XG5cdCAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuXHQgIHJlcXVlc3Quc2VuZCgpO1xuXHQgIHJldHVybiBwO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBnZXRTY3JvbGxCYXJXaWR0aCgpIHtcblx0ICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCA8PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7XG5cdCAgICByZXR1cm4gMDtcblx0ICB9XG5cdCAgdmFyIGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuXHQgIGlubmVyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuXHQgIGlubmVyLnN0eWxlLmhlaWdodCA9ICcyMDBweCc7XG5cdFxuXHQgIHZhciBvdXRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHQgIG91dGVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0ICBvdXRlci5zdHlsZS50b3AgPSAnMHB4Jztcblx0ICBvdXRlci5zdHlsZS5sZWZ0ID0gJzBweCc7XG5cdCAgb3V0ZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuXHQgIG91dGVyLnN0eWxlLndpZHRoID0gJzIwMHB4Jztcblx0ICBvdXRlci5zdHlsZS5oZWlnaHQgPSAnMTUwcHgnO1xuXHQgIG91dGVyLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cdCAgb3V0ZXIuYXBwZW5kQ2hpbGQoaW5uZXIpO1xuXHRcblx0ICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyKTtcblx0ICB2YXIgdzEgPSBpbm5lci5vZmZzZXRXaWR0aDtcblx0ICBvdXRlci5zdHlsZS5vdmVyZmxvdyA9ICdzY3JvbGwnO1xuXHQgIHZhciB3MiA9IGlubmVyLm9mZnNldFdpZHRoO1xuXHQgIGlmICh3MSA9PT0gdzIpIHcyID0gb3V0ZXIuY2xpZW50V2lkdGg7XG5cdFxuXHQgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQob3V0ZXIpO1xuXHRcblx0ICByZXR1cm4gdzEgLSB3Mjtcblx0fVxuXHRcblx0Ly8gcmV0dXJuIGFsbCB0aGUgdHJhbnNsYXRpb25zIG9yIHRoZSBkZWZhdWx0IGxhbmd1YWdlIChlbmdsaXNoKVxuXHRmdW5jdGlvbiB0cmFuc2xhdGlvbnMoKSB7XG5cdCAgdmFyIGxhbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdlbic7XG5cdFxuXHQgIHZhciB0ZXh0ID0ge1xuXHQgICAgZGF5c09mV2VlazogWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddLFxuXHQgICAgbGltaXQ6ICdMaW1pdCByZWFjaGVkICh7e2xpbWl0fX0gaXRlbXMgbWF4KS4nLFxuXHQgICAgbG9hZGluZzogJ0xvYWRpbmcuLi4nLFxuXHQgICAgbWluTGVuZ3RoOiAnTWluLiBMZW5ndGgnLFxuXHQgICAgbW9udGhzOiBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXSxcblx0ICAgIG5vdFNlbGVjdGVkOiAnTm90aGluZyBTZWxlY3RlZCcsXG5cdCAgICByZXF1aXJlZDogJ1JlcXVpcmVkJyxcblx0ICAgIHNlYXJjaDogJ1NlYXJjaCdcblx0ICB9O1xuXHQgIHJldHVybiB3aW5kb3cuVnVlU3RyYXBMYW5nID8gd2luZG93LlZ1ZVN0cmFwTGFuZyhsYW5nKSA6IHRleHQ7XG5cdH1cblx0XG5cdC8vIGRlbGF5ZXI6IHNldCBhIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZSBhZnRlciBhIGRlbGF5XG5cdC8vIEBwYXJhbXMgKGZ1bmN0aW9uLCBkZWxheV9wcm9wIG9yIHZhbHVlLCBkZWZhdWx0X3ZhbHVlKVxuXHRmdW5jdGlvbiBkZWxheWVyKGZuLCB2YXJUaW1lcikge1xuXHQgIHZhciBpZk5hTiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMTAwO1xuXHRcblx0ICBmdW5jdGlvbiB0b0ludChlbCkge1xuXHQgICAgcmV0dXJuICgvXlswLTldKyQvLnRlc3QoZWwpID8gTnVtYmVyKGVsKSB8fCAxIDogbnVsbFxuXHQgICAgKTtcblx0ICB9XG5cdCAgdmFyIHRpbWVySWQ7XG5cdCAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcblx0ICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcblx0ICAgIH1cblx0XG5cdCAgICBpZiAodGltZXJJZCkgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuXHQgICAgdGltZXJJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICBmbi5hcHBseShfdGhpcywgYXJncyk7XG5cdCAgICB9LCB0b0ludCh2YXJUaW1lcikgfHwgdG9JbnQodGhpc1t2YXJUaW1lcl0pIHx8IGlmTmFOKTtcblx0ICB9O1xuXHR9XG5cdFxuXHQvLyBGaXggYSB2dWUgaW5zdGFuY2UgTGlmZWN5Y2xlIHRvIHZ1ZSAxLzIgKGp1c3QgdGhlIGJhc2ljIGVsZW1lbnRzLCBpcyBub3QgYSByZWFsIHBhcnNlciwgc28gdGhpcyB3b3JrIG9ubHkgaWYgeW91ciBjb2RlIGlzIGNvbXBhdGlibGUgd2l0aCBib3RoKVxuXHQvLyAoV2FpdGluZyBmb3IgdGVzdGluZylcblx0ZnVuY3Rpb24gVnVlRml4ZXIodnVlKSB7XG5cdCAgdmFyIHZ1ZTIgPSAhd2luZG93LlZ1ZSB8fCAhd2luZG93LlZ1ZS5wYXJ0aWFsO1xuXHQgIHZhciBtaXhpbiA9IHtcblx0ICAgIGNvbXB1dGVkOiB7XG5cdCAgICAgIHZ1ZTI6IGZ1bmN0aW9uIHZ1ZTIoKSB7XG5cdCAgICAgICAgcmV0dXJuICF0aGlzLiRkaXNwYXRjaDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH07XG5cdCAgaWYgKCF2dWUyKSB7XG5cdCAgICAvL3RyYW5zbGF0ZSB2dWUyIGF0dHJpYnV0ZXMgdG8gdnVlMVxuXHQgICAgaWYgKHZ1ZS5iZWZvcmVDcmVhdGUpIHtcblx0ICAgICAgbWl4aW4uY3JlYXRlID0gdnVlLmJlZm9yZUNyZWF0ZTtcblx0ICAgICAgZGVsZXRlIHZ1ZS5iZWZvcmVDcmVhdGU7XG5cdCAgICB9XG5cdCAgICBpZiAodnVlLmJlZm9yZU1vdW50KSB7XG5cdCAgICAgIHZ1ZS5iZWZvcmVDb21waWxlID0gdnVlLmJlZm9yZU1vdW50O1xuXHQgICAgICBkZWxldGUgdnVlLmJlZm9yZU1vdW50O1xuXHQgICAgfVxuXHQgICAgaWYgKHZ1ZS5tb3VudGVkKSB7XG5cdCAgICAgIHZ1ZS5yZWFkeSA9IHZ1ZS5tb3VudGVkO1xuXHQgICAgICBkZWxldGUgdnVlLm1vdW50ZWQ7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vdHJhbnNsYXRlIHZ1ZTEgYXR0cmlidXRlcyB0byB2dWUyXG5cdCAgICBpZiAodnVlLmJlZm9yZUNvbXBpbGUpIHtcblx0ICAgICAgdnVlLmJlZm9yZU1vdW50ID0gdnVlLmJlZm9yZUNvbXBpbGU7XG5cdCAgICAgIGRlbGV0ZSB2dWUuYmVmb3JlQ29tcGlsZTtcblx0ICAgIH1cblx0ICAgIGlmICh2dWUuY29tcGlsZWQpIHtcblx0ICAgICAgbWl4aW4uY29tcGlsZWQgPSB2dWUuY29tcGlsZWQ7XG5cdCAgICAgIGRlbGV0ZSB2dWUuY29tcGlsZWQ7XG5cdCAgICB9XG5cdCAgICBpZiAodnVlLnJlYWR5KSB7XG5cdCAgICAgIHZ1ZS5tb3VudGVkID0gdnVlLnJlYWR5O1xuXHQgICAgICBkZWxldGUgdnVlLnJlYWR5O1xuXHQgICAgfVxuXHQgIH1cblx0ICBpZiAoIXZ1ZS5taXhpbnMpIHtcblx0ICAgIHZ1ZS5taXhpbnMgPSBbXTtcblx0ICB9XG5cdCAgdnVlLm1peGlucy51bnNoaWZ0KG1peGluKTtcblx0ICByZXR1cm4gdnVlO1xuXHR9XG5cbi8qKiovIH0sXG4vKiA2NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKHByb2Nlc3MpIHsndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0LyoqXHJcblx0ICogQ2xpY2sgb3V0c2lkZSBkaXJlY3RpdmVcclxuXHQgKi9cblx0dmFyIGJpbmRlZCA9IFtdO1xuXHRcblx0ZnVuY3Rpb24gaGFuZGxlcihlKSB7XG5cdCAgYmluZGVkLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICBpZiAoIWVsLm5vZGUuY29udGFpbnMoZS50YXJnZXQpKSBlbC5jYWxsYmFjayhlKTtcblx0ICB9KTtcblx0fVxuXHRcblx0ZnVuY3Rpb24gYWRkTGlzdGVuZXIobm9kZSwgY2FsbGJhY2spIHtcblx0ICBpZiAoIWJpbmRlZC5sZW5ndGgpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlciwgZmFsc2UpO1xuXHQgIGJpbmRlZC5wdXNoKHsgbm9kZTogbm9kZSwgY2FsbGJhY2s6IGNhbGxiYWNrIH0pO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihub2RlLCBjYWxsYmFjaykge1xuXHQgIGJpbmRlZCA9IGJpbmRlZC5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICByZXR1cm4gZWwubm9kZSAhPT0gbm9kZSA/IHRydWUgOiAhY2FsbGJhY2sgPyBmYWxzZSA6IGVsLmNhbGxiYWNrICE9PSBjYWxsYmFjaztcblx0ICB9KTtcblx0ICBpZiAoIWJpbmRlZC5sZW5ndGgpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlciwgZmFsc2UpO1xuXHR9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgYmluZDogZnVuY3Rpb24gYmluZChlbCwgYmluZGluZykge1xuXHQgICAgcmVtb3ZlTGlzdGVuZXIoZWwsIGJpbmRpbmcudmFsdWUpO1xuXHQgICAgaWYgKHR5cGVvZiBiaW5kaW5nLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG5cdCAgICAgICAgVnVlLnV0aWwud2FybignQ2xpY2tPdXRzaWRlIG9ubHkgd29yayB3aXRoIGEgZnVuY3Rpb24sIHJlY2VpdmVkOiB2LScgKyBiaW5kaW5nLm5hbWUgKyAnPVwiJyArIGJpbmRpbmcuZXhwcmVzc2lvbiArICdcIicpO1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBhZGRMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShlbCwgYmluZGluZykge1xuXHQgICAgaWYgKGJpbmRpbmcudmFsdWUgIT09IGJpbmRpbmcub2xkVmFsdWUpIHtcblx0ICAgICAgcmVtb3ZlTGlzdGVuZXIoZWwsIGJpbmRpbmcub2xkVmFsdWUpO1xuXHQgICAgICBhZGRMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB1bmJpbmQ6IGZ1bmN0aW9uIHVuYmluZChlbCwgYmluZGluZykge1xuXHQgICAgcmVtb3ZlTGlzdGVuZXIoZWwsIGJpbmRpbmcudmFsdWUpO1xuXHQgIH1cblx0fTtcblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oNjcpKSlcblxuLyoqKi8gfSxcbi8qIDY3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblx0dmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXHRcblx0Ly8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG5cdC8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuXHQvLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG5cdC8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cdFxuXHR2YXIgY2FjaGVkU2V0VGltZW91dDtcblx0dmFyIGNhY2hlZENsZWFyVGltZW91dDtcblx0XG5cdGZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcblx0fVxuXHRmdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG5cdH1cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIHRyeSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuXHQgICAgICAgIH1cblx0ICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG5cdCAgICB9XG5cdH0gKCkpXG5cdGZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG5cdCAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuXHQgICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuXHQgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgICB9XG5cdCAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXHQgICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG5cdCAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG5cdCAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuXHQgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgICB9IGNhdGNoKGUpe1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG5cdCAgICAgICAgfSBjYXRjaChlKXtcblx0ICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3Jcblx0ICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0XG5cdFxuXHR9XG5cdGZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcblx0ICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuXHQgICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuXHQgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH1cblx0ICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcblx0ICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuXHQgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcblx0ICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgICB9XG5cdCAgICB0cnkge1xuXHQgICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3Ncblx0ICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgICB9IGNhdGNoIChlKXtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGUpe1xuXHQgICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cblx0ICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdFxuXHRcblx0XG5cdH1cblx0dmFyIHF1ZXVlID0gW107XG5cdHZhciBkcmFpbmluZyA9IGZhbHNlO1xuXHR2YXIgY3VycmVudFF1ZXVlO1xuXHR2YXIgcXVldWVJbmRleCA9IC0xO1xuXHRcblx0ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuXHQgICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgZHJhaW5pbmcgPSBmYWxzZTtcblx0ICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuXHQgICAgfVxuXHQgICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuXHQgICAgICAgIGRyYWluUXVldWUoKTtcblx0ICAgIH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcblx0ICAgIGlmIChkcmFpbmluZykge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuXHQgICAgZHJhaW5pbmcgPSB0cnVlO1xuXHRcblx0ICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG5cdCAgICB3aGlsZShsZW4pIHtcblx0ICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcblx0ICAgICAgICBxdWV1ZSA9IFtdO1xuXHQgICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcblx0ICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuXHQgICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcblx0ICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG5cdCAgICB9XG5cdCAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuXHQgICAgZHJhaW5pbmcgPSBmYWxzZTtcblx0ICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0fVxuXHRcblx0cHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcblx0ICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcblx0ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG5cdCAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuXHQgICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG5cdCAgICB9XG5cdH07XG5cdFxuXHQvLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5cdGZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuXHQgICAgdGhpcy5mdW4gPSBmdW47XG5cdCAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG5cdH1cblx0SXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG5cdH07XG5cdHByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5cdHByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5cdHByb2Nlc3MuZW52ID0ge307XG5cdHByb2Nlc3MuYXJndiA9IFtdO1xuXHRwcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcblx0cHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXHRcblx0ZnVuY3Rpb24gbm9vcCgpIHt9XG5cdFxuXHRwcm9jZXNzLm9uID0gbm9vcDtcblx0cHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5cdHByb2Nlc3Mub25jZSA9IG5vb3A7XG5cdHByb2Nlc3Mub2ZmID0gbm9vcDtcblx0cHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5cdHByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcblx0cHJvY2Vzcy5lbWl0ID0gbm9vcDtcblx0XG5cdHByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG5cdH07XG5cdFxuXHRwcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xuXHRwcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcblx0fTtcblx0cHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG4vKioqLyB9LFxuLyogNjggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqLyhmdW5jdGlvbihwcm9jZXNzKSB7J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8qKlxyXG5cdCAqIENsaWNrIG91dHNpZGUgZGlyZWN0aXZlXHJcblx0ICovXG5cdHZhciBIQU5ETEVSID0gJ192dWVfc2Nyb2xsX2hhbmRsZXInO1xuXHR2YXIgZXZlbnRzID0gWydyZXNpemUnLCAnc2Nyb2xsJ107XG5cdFxuXHRmdW5jdGlvbiBiaW5kKGVsLCBiaW5kaW5nKSB7XG5cdCAgdW5iaW5kKGVsKTtcblx0XG5cdCAgdmFyIGNhbGxiYWNrID0gYmluZGluZy52YWx1ZTtcblx0ICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuXHQgICAgICBWdWUudXRpbC53YXJuKCdDbGlja091dHNpZGUgb25seSB3b3JrIHdpdGggYSBmdW5jdGlvbiB2YWx1ZSwgcmVjZWl2ZWQ6IHYtJyArIGJpbmRpbmcubmFtZSArICc9XCInICsgYmluZGluZy5leHByZXNzaW9uICsgJ1wiJyk7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIGVsW0hBTkRMRVJdID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgY2FsbGJhY2soZSk7XG5cdCAgICB9O1xuXHQgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZSwgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICAgIH0pO1xuXHQgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGVsW0hBTkRMRVJdLCBmYWxzZSk7XG5cdCAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgZWxbSEFORExFUl0oKTtcblx0ICAgIH0sIDApO1xuXHQgIH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gdW5iaW5kKGVsKSB7XG5cdCAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcblx0ICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGUsIGVsW0hBTkRMRVJdLCBmYWxzZSk7XG5cdCAgfSk7XG5cdCAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIGVsW0hBTkRMRVJdLCBmYWxzZSk7XG5cdCAgZGVsZXRlIGVsW0hBTkRMRVJdO1xuXHR9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgYmluZDogYmluZCxcblx0ICB1bmJpbmQ6IHVuYmluZCxcblx0ICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShlbCwgYmluZGluZykge1xuXHQgICAgaWYgKGJpbmRpbmcudmFsdWUgIT09IGJpbmRpbmcub2xkVmFsdWUpIGJpbmQoZWwsIGJpbmRpbmcpO1xuXHQgIH1cblx0fTtcblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oNjcpKSlcblxuLyoqKi8gfSxcbi8qIDY5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEFjY29yZGlvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtZDRiNzVhOTJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWQ0Yjc1YTkyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQWNjb3JkaW9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDcwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgdHlwZToge1xuXHQgICAgICB0eXBlOiBTdHJpbmcsXG5cdCAgICAgIGRlZmF1bHQ6IG51bGxcblx0ICAgIH0sXG5cdCAgICBvbmVBdEF0aW1lOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IGZhbHNlXG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBvcGVuQ2hpbGQ6IGZ1bmN0aW9uIG9wZW5DaGlsZChjaGlsZCkge1xuXHQgICAgICBpZiAodGhpcy5vbmVBdEF0aW1lKSB7XG5cdCAgICAgICAgdGhpcy4kY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgICAgICAgaWYgKGNoaWxkICE9PSBpdGVtKSB7XG5cdCAgICAgICAgICAgIGl0ZW0ub3BlbiA9IGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5faXNBY2NvcmRpb24gPSB0cnVlO1xuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDcxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLWdyb3VwXCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LWQ0Yjc1YTkyXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogNzIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzMpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzQpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQWZmaXgudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTVlYmRkZWJmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi01ZWJkZGViZlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEFmZml4LnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDczICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfU2Nyb2xsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OCk7XG5cdFxuXHR2YXIgX1Njcm9sbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TY3JvbGwpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBkaXJlY3RpdmVzOiB7XG5cdCAgICBTY3JvbGw6IF9TY3JvbGwyLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICBvZmZzZXQ6IHtcblx0ICAgICAgdHlwZTogTnVtYmVyLFxuXHQgICAgICBkZWZhdWx0OiAwXG5cdCAgICB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgYWZmaXhlZDogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHRvcDogZnVuY3Rpb24gdG9wKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5vZmZzZXQgPiAwID8gdGhpcy5vZmZzZXQgKyAncHgnIDogbnVsbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIC8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9ibG9iL21hc3Rlci9jb21wb25lbnRzL2FmZml4L2luZGV4LmpzeCNMMjBcblx0ICAgIGNoZWNrU2Nyb2xsOiBmdW5jdGlvbiBjaGVja1Njcm9sbCgpIHtcblx0ICAgICAgLy8gaWYgaXMgaGlkZGVuIGRvbid0IGNhbGN1bGF0ZSBhbnl0aGluZ1xuXHQgICAgICBpZiAoISh0aGlzLiRlbC5vZmZzZXRXaWR0aCB8fCB0aGlzLiRlbC5vZmZzZXRIZWlnaHQgfHwgdGhpcy4kZWwuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIC8vIGdldCB3aW5kb3cgc2Nyb2xsIGFuZCBlbGVtZW50IHBvc2l0aW9uIHRvIGRldGVjdCBpZiBoYXZlIHRvIGJlIG5vcm1hbCBvciBhZmZpeGVkXG5cdCAgICAgIHZhciBzY3JvbGwgPSB7fTtcblx0ICAgICAgdmFyIGVsZW1lbnQgPSB7fTtcblx0ICAgICAgdmFyIHJlY3QgPSB0aGlzLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0ICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXHQgICAgICB2YXIgX2FyciA9IFsnVG9wJywgJ0xlZnQnXTtcblx0ICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IF9hcnIubGVuZ3RoOyBfaSsrKSB7XG5cdCAgICAgICAgdmFyIHR5cGUgPSBfYXJyW19pXTtcblx0ICAgICAgICB2YXIgdCA9IHR5cGUudG9Mb3dlckNhc2UoKTtcblx0ICAgICAgICB2YXIgcmV0ID0gd2luZG93WydwYWdlJyArICh0eXBlID09PSAnVG9wJyA/ICdZJyA6ICdYJykgKyAnT2Zmc2V0J107XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9ICdzY3JvbGwnICsgdHlwZTtcblx0ICAgICAgICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcblx0ICAgICAgICAgIC8vIGllNiw3LDggc3RhbmRhcmQgbW9kZVxuXHQgICAgICAgICAgcmV0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W21ldGhvZF07XG5cdCAgICAgICAgICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcblx0ICAgICAgICAgICAgLy8gcXVpcmtzIG1vZGVcblx0ICAgICAgICAgICAgcmV0ID0gZG9jdW1lbnQuYm9keVttZXRob2RdO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBzY3JvbGxbdF0gPSByZXQ7XG5cdCAgICAgICAgZWxlbWVudFt0XSA9IHNjcm9sbFt0XSArIHJlY3RbdF0gLSAodGhpcy4kZWxbJ2NsaWVudCcgKyB0eXBlXSB8fCBib2R5WydjbGllbnQnICsgdHlwZV0gfHwgMCk7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIGZpeCA9IHNjcm9sbC50b3AgPiBlbGVtZW50LnRvcCAtIHRoaXMub2Zmc2V0O1xuXHQgICAgICBpZiAodGhpcy5hZmZpeGVkICE9PSBmaXgpIHtcblx0ICAgICAgICB0aGlzLmFmZml4ZWQgPSBmaXg7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiA3NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJoaWRkZW4tcHJpbnQgaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG5cdCAgfSwgW192bS5fYygnbmF2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzY3JvbGxcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNjcm9sbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jaGVja1Njcm9sbCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY2hlY2tTY3JvbGxcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJicy1kb2NzLXNpZGViYXJcIixcblx0ICAgIGNsYXNzOiB7XG5cdCAgICAgIGFmZml4OiBfdm0uYWZmaXhlZFxuXHQgICAgfSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICBtYXJnaW5Ub3A6IF92bS50b3Bcblx0ICAgIH0pXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTVlYmRkZWJmXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogNzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oNzYpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MClcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxBbGVydC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtYWY3YzFmNmFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWFmN2MxZjZhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQWxlcnQudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogNzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc3KTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1hZjdjMWY2YSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQWxlcnQudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1hZjdjMWY2YSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQWxlcnQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogNzcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmZhZGUtZW50ZXItYWN0aXZlLFxcclxcbi5mYWRlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4zcyBlYXNlO1xcbn1cXG4uZmFkZS1lbnRlcixcXHJcXG4uZmFkZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgaGVpZ2h0OiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXG59XFxuLmFsZXJ0LnRvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDMwcHg7XFxyXFxuICBtYXJnaW46IDAgYXV0bztcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNTA7XFxufVxcbi5hbGVydC50b3AtcmlnaHQge1xcclxcbiAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgdG9wOiAzMHB4O1xcclxcbiAgcmlnaHQ6IDUwcHg7XFxyXFxuICB6LWluZGV4OiAxMDUwO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0FsZXJ0LnZ1ZT83MWE5MWMxYVwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBb0RBOztFQUVBLDZCQUFBO0NBQ0E7QUFDQTs7RUFFQSxVQUFBO0VBQ0EsV0FBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtFQUNBLFVBQUE7RUFDQSxlQUFBO0VBQ0EsUUFBQTtFQUNBLFNBQUE7RUFDQSxjQUFBO0NBQ0E7QUFDQTtFQUNBLGdCQUFBO0VBQ0EsVUFBQTtFQUNBLFlBQUE7RUFDQSxjQUFBO0NBQ0FcIixcImZpbGVcIjpcIkFsZXJ0LnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8dHJhbnNpdGlvbiBuYW1lPVxcXCJmYWRlXFxcIj5cXHJcXG4gICAgPGRpdiB2LXNob3c9XFxcInZhbFxcXCIgOmNsYXNzPVxcXCJbJ2FsZXJ0JywgJ2FsZXJ0LScrdHlwZSwgcGxhY2VtZW50XVxcXCIgOnN0eWxlPVxcXCJ7d2lkdGg6d2lkdGh9XFxcIiByb2xlPVxcXCJhbGVydFxcXCI+XFxyXFxuICAgICAgPGJ1dHRvbiB2LXNob3c9XFxcImRpc21pc3NhYmxlXFxcIiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJ2YWwgPSBmYWxzZVxcXCI+XFxyXFxuICAgICAgICA8c3Bhbj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgIDwvYnV0dG9uPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L3RyYW5zaXRpb24+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Y29lcmNlLCBkZWxheWVyfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xcclxcblxcclxcbnZhciBEVVJBVElPTiA9IDBcXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBkaXNtaXNzYWJsZToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZHVyYXRpb246IHtkZWZhdWx0OiBEVVJBVElPTn0sXFxyXFxuICAgIHBsYWNlbWVudDoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICB2YWx1ZToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcXHJcXG4gICAgd2lkdGg6IHt0eXBlOiBTdHJpbmd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgdmFsOiB0aGlzLnZhbHVlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBkdXJhdGlvbk51bSAoKSB7IHJldHVybiBjb2VyY2UubnVtYmVyKHRoaXMuZHVyYXRpb24sIERVUkFUSU9OKSB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgdmFsICh2YWwpIHtcXHJcXG4gICAgICBpZiAodmFsICYmIHRoaXMuZHVyYXRpb25OdW0gPiAwKSB7IHRoaXMuX2RlbGF5Q2xvc2UoKSB9XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB2YWxcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5fZGVsYXlDbG9zZSA9IGRlbGF5ZXIoZnVuY3Rpb24gKCkge1xcclxcbiAgICAgIHRoaXMudmFsID0gZmFsc2VcXHJcXG4gICAgfSwgJ2R1cmF0aW9uTnVtJylcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi5mYWRlLWVudGVyLWFjdGl2ZSxcXHJcXG4uZmFkZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTtcXHJcXG59XFxyXFxuLmZhZGUtZW50ZXIsXFxyXFxuLmZhZGUtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIGhlaWdodDogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxufVxcclxcbi5hbGVydC50b3Age1xcclxcbiAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgdG9wOiAzMHB4O1xcclxcbiAgbWFyZ2luOiAwIGF1dG87XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICB6LWluZGV4OiAxMDUwO1xcclxcbn1cXHJcXG4uYWxlcnQudG9wLXJpZ2h0IHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMzBweDtcXHJcXG4gIHJpZ2h0OiA1MHB4O1xcclxcbiAgei1pbmRleDogMTA1MDtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDc4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKlxyXG5cdFx0TUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcclxuXHRcdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcclxuXHQqL1xyXG5cdC8vIGNzcyBiYXNlIGNvZGUsIGluamVjdGVkIGJ5IHRoZSBjc3MtbG9hZGVyXHJcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBsaXN0ID0gW107XHJcblx0XHJcblx0XHQvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXHJcblx0XHRsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XHJcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcclxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaXRlbSA9IHRoaXNbaV07XHJcblx0XHRcdFx0aWYoaXRlbVsyXSkge1xyXG5cdFx0XHRcdFx0cmVzdWx0LnB1c2goXCJAbWVkaWEgXCIgKyBpdGVtWzJdICsgXCJ7XCIgKyBpdGVtWzFdICsgXCJ9XCIpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXN1bHQucHVzaChpdGVtWzFdKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHJlc3VsdC5qb2luKFwiXCIpO1xyXG5cdFx0fTtcclxuXHRcclxuXHRcdC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XHJcblx0XHRsaXN0LmkgPSBmdW5jdGlvbihtb2R1bGVzLCBtZWRpYVF1ZXJ5KSB7XHJcblx0XHRcdGlmKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKVxyXG5cdFx0XHRcdG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIFwiXCJdXTtcclxuXHRcdFx0dmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcclxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaWQgPSB0aGlzW2ldWzBdO1xyXG5cdFx0XHRcdGlmKHR5cGVvZiBpZCA9PT0gXCJudW1iZXJcIilcclxuXHRcdFx0XHRcdGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IoaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0dmFyIGl0ZW0gPSBtb2R1bGVzW2ldO1xyXG5cdFx0XHRcdC8vIHNraXAgYWxyZWFkeSBpbXBvcnRlZCBtb2R1bGVcclxuXHRcdFx0XHQvLyB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCAxMDAlIHBlcmZlY3QgZm9yIHdlaXJkIG1lZGlhIHF1ZXJ5IGNvbWJpbmF0aW9uc1xyXG5cdFx0XHRcdC8vICB3aGVuIGEgbW9kdWxlIGlzIGltcG9ydGVkIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IG1lZGlhIHF1ZXJpZXMuXHJcblx0XHRcdFx0Ly8gIEkgaG9wZSB0aGlzIHdpbGwgbmV2ZXIgb2NjdXIgKEhleSB0aGlzIHdheSB3ZSBoYXZlIHNtYWxsZXIgYnVuZGxlcylcclxuXHRcdFx0XHRpZih0eXBlb2YgaXRlbVswXSAhPT0gXCJudW1iZXJcIiB8fCAhYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xyXG5cdFx0XHRcdFx0aWYobWVkaWFRdWVyeSAmJiAhaXRlbVsyXSkge1xyXG5cdFx0XHRcdFx0XHRpdGVtWzJdID0gbWVkaWFRdWVyeTtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZihtZWRpYVF1ZXJ5KSB7XHJcblx0XHRcdFx0XHRcdGl0ZW1bMl0gPSBcIihcIiArIGl0ZW1bMl0gKyBcIikgYW5kIChcIiArIG1lZGlhUXVlcnkgKyBcIilcIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxpc3QucHVzaChpdGVtKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0XHRyZXR1cm4gbGlzdDtcclxuXHR9O1xyXG5cblxuLyoqKi8gfSxcbi8qIDc5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKlxuXHRcdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG5cdFx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuXHQqL1xuXHR2YXIgc3R5bGVzSW5Eb20gPSB7fSxcblx0XHRtZW1vaXplID0gZnVuY3Rpb24oZm4pIHtcblx0XHRcdHZhciBtZW1vO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBtZW1vID09PSBcInVuZGVmaW5lZFwiKSBtZW1vID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHRcdFx0cmV0dXJuIG1lbW87XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0aXNPbGRJRSA9IG1lbW9pemUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gL21zaWUgWzYtOV1cXGIvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSk7XG5cdFx0fSksXG5cdFx0Z2V0SGVhZEVsZW1lbnQgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXTtcblx0XHR9KSxcblx0XHRzaW5nbGV0b25FbGVtZW50ID0gbnVsbCxcblx0XHRzaW5nbGV0b25Db3VudGVyID0gMCxcblx0XHRzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcCA9IFtdO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihsaXN0LCBvcHRpb25zKSB7XG5cdFx0aWYoZmFsc2UpIHtcblx0XHRcdGlmKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0eWxlLWxvYWRlciBjYW5ub3QgYmUgdXNlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xuXHRcdH1cblx0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0Ly8gRm9yY2Ugc2luZ2xlLXRhZyBzb2x1dGlvbiBvbiBJRTYtOSwgd2hpY2ggaGFzIGEgaGFyZCBsaW1pdCBvbiB0aGUgIyBvZiA8c3R5bGU+XG5cdFx0Ly8gdGFncyBpdCB3aWxsIGFsbG93IG9uIGEgcGFnZVxuXHRcdGlmICh0eXBlb2Ygb3B0aW9ucy5zaW5nbGV0b24gPT09IFwidW5kZWZpbmVkXCIpIG9wdGlvbnMuc2luZ2xldG9uID0gaXNPbGRJRSgpO1xuXHRcblx0XHQvLyBCeSBkZWZhdWx0LCBhZGQgPHN0eWxlPiB0YWdzIHRvIHRoZSBib3R0b20gb2YgPGhlYWQ+LlxuXHRcdGlmICh0eXBlb2Ygb3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJ1bmRlZmluZWRcIikgb3B0aW9ucy5pbnNlcnRBdCA9IFwiYm90dG9tXCI7XG5cdFxuXHRcdHZhciBzdHlsZXMgPSBsaXN0VG9TdHlsZXMobGlzdCk7XG5cdFx0YWRkU3R5bGVzVG9Eb20oc3R5bGVzLCBvcHRpb25zKTtcblx0XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG5cdFx0XHR2YXIgbWF5UmVtb3ZlID0gW107XG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xuXHRcdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblx0XHRcdFx0ZG9tU3R5bGUucmVmcy0tO1xuXHRcdFx0XHRtYXlSZW1vdmUucHVzaChkb21TdHlsZSk7XG5cdFx0XHR9XG5cdFx0XHRpZihuZXdMaXN0KSB7XG5cdFx0XHRcdHZhciBuZXdTdHlsZXMgPSBsaXN0VG9TdHlsZXMobmV3TGlzdCk7XG5cdFx0XHRcdGFkZFN0eWxlc1RvRG9tKG5ld1N0eWxlcywgb3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgbWF5UmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciBkb21TdHlsZSA9IG1heVJlbW92ZVtpXTtcblx0XHRcdFx0aWYoZG9tU3R5bGUucmVmcyA9PT0gMCkge1xuXHRcdFx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKylcblx0XHRcdFx0XHRcdGRvbVN0eWxlLnBhcnRzW2pdKCk7XG5cdFx0XHRcdFx0ZGVsZXRlIHN0eWxlc0luRG9tW2RvbVN0eWxlLmlkXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGFkZFN0eWxlc1RvRG9tKHN0eWxlcywgb3B0aW9ucykge1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xuXHRcdFx0dmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF07XG5cdFx0XHRpZihkb21TdHlsZSkge1xuXHRcdFx0XHRkb21TdHlsZS5yZWZzKys7XG5cdFx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdGRvbVN0eWxlLnBhcnRzW2pdKGl0ZW0ucGFydHNbal0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvcig7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0ZG9tU3R5bGUucGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBwYXJ0cyA9IFtdO1xuXHRcdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdHBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlc0luRG9tW2l0ZW0uaWRdID0ge2lkOiBpdGVtLmlkLCByZWZzOiAxLCBwYXJ0czogcGFydHN9O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gbGlzdFRvU3R5bGVzKGxpc3QpIHtcblx0XHR2YXIgc3R5bGVzID0gW107XG5cdFx0dmFyIG5ld1N0eWxlcyA9IHt9O1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IGxpc3RbaV07XG5cdFx0XHR2YXIgaWQgPSBpdGVtWzBdO1xuXHRcdFx0dmFyIGNzcyA9IGl0ZW1bMV07XG5cdFx0XHR2YXIgbWVkaWEgPSBpdGVtWzJdO1xuXHRcdFx0dmFyIHNvdXJjZU1hcCA9IGl0ZW1bM107XG5cdFx0XHR2YXIgcGFydCA9IHtjc3M6IGNzcywgbWVkaWE6IG1lZGlhLCBzb3VyY2VNYXA6IHNvdXJjZU1hcH07XG5cdFx0XHRpZighbmV3U3R5bGVzW2lkXSlcblx0XHRcdFx0c3R5bGVzLnB1c2gobmV3U3R5bGVzW2lkXSA9IHtpZDogaWQsIHBhcnRzOiBbcGFydF19KTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0bmV3U3R5bGVzW2lkXS5wYXJ0cy5wdXNoKHBhcnQpO1xuXHRcdH1cblx0XHRyZXR1cm4gc3R5bGVzO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgc3R5bGVFbGVtZW50KSB7XG5cdFx0dmFyIGhlYWQgPSBnZXRIZWFkRWxlbWVudCgpO1xuXHRcdHZhciBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcCA9IHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wW3N0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wLmxlbmd0aCAtIDFdO1xuXHRcdGlmIChvcHRpb25zLmluc2VydEF0ID09PSBcInRvcFwiKSB7XG5cdFx0XHRpZighbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3ApIHtcblx0XHRcdFx0aGVhZC5pbnNlcnRCZWZvcmUoc3R5bGVFbGVtZW50LCBoZWFkLmZpcnN0Q2hpbGQpO1xuXHRcdFx0fSBlbHNlIGlmKGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wLm5leHRTaWJsaW5nKSB7XG5cdFx0XHRcdGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlRWxlbWVudCwgbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AubmV4dFNpYmxpbmcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpO1xuXHRcdFx0fVxuXHRcdFx0c3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3AucHVzaChzdHlsZUVsZW1lbnQpO1xuXHRcdH0gZWxzZSBpZiAob3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJib3R0b21cIikge1xuXHRcdFx0aGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgJ2luc2VydEF0Jy4gTXVzdCBiZSAndG9wJyBvciAnYm90dG9tJy5cIik7XG5cdFx0fVxuXHR9XG5cdFxuXHRmdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG5cdFx0c3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcblx0XHR2YXIgaWR4ID0gc3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3AuaW5kZXhPZihzdHlsZUVsZW1lbnQpO1xuXHRcdGlmKGlkeCA+PSAwKSB7XG5cdFx0XHRzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcC5zcGxpY2UoaWR4LCAxKTtcblx0XHR9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKSB7XG5cdFx0dmFyIHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblx0XHRzdHlsZUVsZW1lbnQudHlwZSA9IFwidGV4dC9jc3NcIjtcblx0XHRpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgc3R5bGVFbGVtZW50KTtcblx0XHRyZXR1cm4gc3R5bGVFbGVtZW50O1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBhZGRTdHlsZShvYmosIG9wdGlvbnMpIHtcblx0XHR2YXIgc3R5bGVFbGVtZW50LCB1cGRhdGUsIHJlbW92ZTtcblx0XG5cdFx0aWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XG5cdFx0XHR2YXIgc3R5bGVJbmRleCA9IHNpbmdsZXRvbkNvdW50ZXIrKztcblx0XHRcdHN0eWxlRWxlbWVudCA9IHNpbmdsZXRvbkVsZW1lbnQgfHwgKHNpbmdsZXRvbkVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucykpO1xuXHRcdFx0dXBkYXRlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCwgc3R5bGVJbmRleCwgZmFsc2UpO1xuXHRcdFx0cmVtb3ZlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCwgc3R5bGVJbmRleCwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN0eWxlRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKTtcblx0XHRcdHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQpO1xuXHRcdFx0cmVtb3ZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuXHRcdFx0fTtcblx0XHR9XG5cdFxuXHRcdHVwZGF0ZShvYmopO1xuXHRcblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlU3R5bGUobmV3T2JqKSB7XG5cdFx0XHRpZihuZXdPYmopIHtcblx0XHRcdFx0aWYobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwKVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0dXBkYXRlKG9iaiA9IG5ld09iaik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZW1vdmUoKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cdFxuXHR2YXIgcmVwbGFjZVRleHQgPSAoZnVuY3Rpb24gKCkge1xuXHRcdHZhciB0ZXh0U3RvcmUgPSBbXTtcblx0XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIChpbmRleCwgcmVwbGFjZW1lbnQpIHtcblx0XHRcdHRleHRTdG9yZVtpbmRleF0gPSByZXBsYWNlbWVudDtcblx0XHRcdHJldHVybiB0ZXh0U3RvcmUuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ1xcbicpO1xuXHRcdH07XG5cdH0pKCk7XG5cdFxuXHRmdW5jdGlvbiBhcHBseVRvU2luZ2xldG9uVGFnKHN0eWxlRWxlbWVudCwgaW5kZXgsIHJlbW92ZSwgb2JqKSB7XG5cdFx0dmFyIGNzcyA9IHJlbW92ZSA/IFwiXCIgOiBvYmouY3NzO1xuXHRcblx0XHRpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcblx0XHRcdHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSByZXBsYWNlVGV4dChpbmRleCwgY3NzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpO1xuXHRcdFx0dmFyIGNoaWxkTm9kZXMgPSBzdHlsZUVsZW1lbnQuY2hpbGROb2Rlcztcblx0XHRcdGlmIChjaGlsZE5vZGVzW2luZGV4XSkgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaW5kZXhdKTtcblx0XHRcdGlmIChjaGlsZE5vZGVzLmxlbmd0aCkge1xuXHRcdFx0XHRzdHlsZUVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNzc05vZGUsIGNoaWxkTm9kZXNbaW5kZXhdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChjc3NOb2RlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGFwcGx5VG9UYWcoc3R5bGVFbGVtZW50LCBvYmopIHtcblx0XHR2YXIgY3NzID0gb2JqLmNzcztcblx0XHR2YXIgbWVkaWEgPSBvYmoubWVkaWE7XG5cdFx0dmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG5cdFxuXHRcdGlmIChtZWRpYSkge1xuXHRcdFx0c3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIG1lZGlhKTtcblx0XHR9XG5cdFxuXHRcdGlmIChzb3VyY2VNYXApIHtcblx0XHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZGV2dG9vbHMvZG9jcy9qYXZhc2NyaXB0LWRlYnVnZ2luZ1xuXHRcdFx0Ly8gdGhpcyBtYWtlcyBzb3VyY2UgbWFwcyBpbnNpZGUgc3R5bGUgdGFncyB3b3JrIHByb3Blcmx5IGluIENocm9tZVxuXHRcdFx0Y3NzICs9ICdcXG4vKiMgc291cmNlVVJMPScgKyBzb3VyY2VNYXAuc291cmNlc1swXSArICcgKi8nO1xuXHRcdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjY2MDM4NzVcblx0XHRcdGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpICsgXCIgKi9cIjtcblx0XHR9XG5cdFxuXHRcdGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuXHRcdFx0c3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0d2hpbGUoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcblx0XHRcdFx0c3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcblx0XHRcdH1cblx0XHRcdHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcblx0XHR9XG5cdH1cblxuXG4vKioqLyB9LFxuLyogODAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIERVUkFUSU9OID0gMDsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzbWlzc2FibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGR1cmF0aW9uOiB7IGRlZmF1bHQ6IERVUkFUSU9OIH0sXG5cdCAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuXHQgICAgd2lkdGg6IHsgdHlwZTogU3RyaW5nIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWw6IHRoaXMudmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGR1cmF0aW9uTnVtOiBmdW5jdGlvbiBkdXJhdGlvbk51bSgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UubnVtYmVyKHRoaXMuZHVyYXRpb24sIERVUkFUSU9OKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsKSB7XG5cdCAgICAgIGlmIChfdmFsICYmIHRoaXMuZHVyYXRpb25OdW0gPiAwKSB7XG5cdCAgICAgICAgdGhpcy5fZGVsYXlDbG9zZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5fZGVsYXlDbG9zZSA9ICgwLCBfdXRpbHMuZGVsYXllcikoZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLnZhbCA9IGZhbHNlO1xuXHQgICAgfSwgJ2R1cmF0aW9uTnVtJyk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogODEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImZhZGVcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIGNsYXNzOiBbJ2FsZXJ0JywgJ2FsZXJ0LScgKyBfdm0udHlwZSwgX3ZtLnBsYWNlbWVudF0sXG5cdCAgICBzdHlsZTogKHtcblx0ICAgICAgd2lkdGg6IF92bS53aWR0aFxuXHQgICAgfSksXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJhbGVydFwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmRpc21pc3NhYmxlKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJkaXNtaXNzYWJsZVwiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNsb3NlXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInR5cGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbCA9IGZhbHNlXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywgW192bS5fdihcIsOXXCIpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtYWY3YzFmNmFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA4MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg4Mylcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg2KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEFzaWRlLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0zYTRiZGUyN1wiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtM2E0YmRlMjdcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBBc2lkZS52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiA4MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oODQpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTNhNGJkZTI3IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Bc2lkZS52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTNhNGJkZTI3IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Bc2lkZS52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiA4NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYXNpZGUtb3BlbiB7XFxyXFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcztcXG59XFxuLmFzaWRlLW9wZW4uaGFzLXB1c2gtcmlnaHQge1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zMDBweCk7XFxufVxcbi5hc2lkZSB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICBib3R0b206IDA7XFxyXFxuICB6LWluZGV4OiAxMDQ5O1xcclxcbiAgb3ZlcmZsb3c6IGF1dG87XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcbn1cXG4uYXNpZGUubGVmdCB7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgcmlnaHQ6IGF1dG87XFxufVxcbi5hc2lkZS5yaWdodCB7XFxyXFxuICBsZWZ0OiBhdXRvO1xcclxcbiAgcmlnaHQ6IDA7XFxufVxcbi5zbGlkZWxlZnQtZW50ZXIge1xcclxcbiAgdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO1xcbn1cXG4uc2xpZGVsZWZ0LWVudGVyLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LWluIC4zcztcXG59XFxuLnNsaWRlbGVmdC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlbGVmdC1vdXQgLjNzO1xcbn1cXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1pbiB7XFxuMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG59XFxuQGtleWZyYW1lcyBzbGlkZWxlZnQtb3V0IHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbn1cXG4uc2xpZGVyaWdodC1lbnRlci1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtaW4gLjNzO1xcbn1cXG4uc2xpZGVyaWdodC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtb3V0IC4zcztcXG59XFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LWluIHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXG59XFxufVxcbkBrZXlmcmFtZXMgc2xpZGVyaWdodC1vdXQge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG59XFxuLmFzaWRlOmZvY3VzIHtcXHJcXG4gICAgb3V0bGluZTogMDtcXG59XFxuQG1lZGlhIChtYXgtd2lkdGg6IDk5MXB4KSB7XFxuLmFzaWRlIHtcXHJcXG4gICAgbWluLXdpZHRoOiAyNDBweDtcXG59XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIge1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XFxyXFxuICBtaW4taGVpZ2h0OiAxNi40M3B4O1xcclxcbiAgcGFkZGluZzogNnB4IDE1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjMzM3YWI3O1xcclxcbiAgY29sb3I6ICNmZmY7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIgLmNsb3NlIHtcXHJcXG4gIG1hcmdpbi1yaWdodDogLThweDtcXHJcXG4gIHBhZGRpbmc6IDRweCA4cHg7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG4gIGZvbnQtc2l6ZTogMjVweDtcXHJcXG4gIG9wYWNpdHk6IC44O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtYm9keSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nOiAxNXB4O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIHtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxyXFxuICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTVlNWU1O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWdyb3VwIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogLTFweDtcXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWJsb2NrKy5idG4tYmxvY2sge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDA7XFxufVxcbi5hc2lkZS1iYWNrZHJvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICB6LWluZGV4OiAxMDQwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2U7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwO1xcbn1cXG4uYXNpZGUtYmFja2Ryb3AuaW4ge1xcclxcbiAgb3BhY2l0eTogLjU7XFxyXFxuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0FzaWRlLnZ1ZT81NzM5NjIxZlwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBa0ZBO0VBQ0EsMkJBQUE7Q0FDQTtBQUNBO0VBQ0EsOEJBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7RUFDQSxPQUFBO0VBQ0EsVUFBQTtFQUNBLGNBQUE7RUFDQSxlQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBO0VBQ0EsUUFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7Q0FDQTtBQUNBO0VBQ0EsMkJBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSw2QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EseUJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EsNkJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7Q0FDQTtBQUNBO0VBQ0EsNkJBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSw0QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EseUJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EsNEJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLGlCQUFBO0NBQ0E7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7RUFDQSxvQkFBQTtFQUNBLGtCQUFBO0VBQ0Esb0JBQUE7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsaUJBQUE7RUFDQSxZQUFBO0VBQ0EsZ0JBQUE7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxjQUFBO0VBQ0Esa0JBQUE7RUFDQSw4QkFBQTtDQUNBO0FBQ0E7RUFDQSxpQkFBQTtFQUNBLGlCQUFBO0NBQ0E7QUFDQTtFQUNBLGtCQUFBO0NBQ0E7QUFDQTtFQUNBLGVBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFVBQUE7RUFDQSxRQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUFDQSw2QkFBQTtFQUNBLHVCQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7RUFDQSwwQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJBc2lkZS52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPHRyYW5zaXRpb24gOm5hbWU9XFxcIidzbGlkZScgKyBwbGFjZW1lbnRcXFwiPlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZVxcXCIgdi1pZj1cXFwic2hvd1xcXCIgOnN0eWxlPVxcXCJ7d2lkdGg6d2lkdGgrJ3B4J31cXFwiIDpjbGFzcz1cXFwicGxhY2VtZW50XFxcIj5cXHJcXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZS1kaWFsb2dcXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXNpZGUtY29udGVudFxcXCI+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlLWhlYWRlclxcXCI+XFxyXFxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPSd0cmlnZ2VyX2Nsb3NlJz48c3Bhbj4mdGltZXM7PC9zcGFuPjwvYnV0dG9uPlxcclxcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwiYXNpZGUtdGl0bGVcXFwiPjxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+e3sgaGVhZGVyIH19PC9zbG90PjwvaDQ+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZS1ib2R5XFxcIj48c2xvdD48L3Nsb3Q+PC9kaXY+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L3RyYW5zaXRpb24+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Z2V0U2Nyb2xsQmFyV2lkdGh9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBwbGFjZW1lbnQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdyaWdodCd9LFxcclxcbiAgICBzaG93OiB7dHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWV9LFxcclxcbiAgICB3aWR0aDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMzIwfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIHNob3cgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgICAgdGhpcy4kZW1pdCh0aGlzLnNob3cgPyAnb3BlbicgOiAnY2xvc2UnKVxcclxcbiAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5XFxyXFxuICAgICAgY29uc3Qgc2Nyb2xsQmFyV2lkdGggPSBnZXRTY3JvbGxCYXJXaWR0aCgpXFxyXFxuICAgICAgaWYgKHZhbCkge1xcclxcbiAgICAgICAgaWYgKCF0aGlzLl9iYWNrZHJvcCkge1xcclxcbiAgICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnXFxyXFxuICAgICAgICBib2R5LmFwcGVuZENoaWxkKHRoaXMuX2JhY2tkcm9wKVxcclxcbiAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJylcXHJcXG4gICAgICAgIGlmIChzY3JvbGxCYXJXaWR0aCAhPT0gMCkge1xcclxcbiAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoICsgJ3B4J1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxcclxcbiAgICAgICAgdmFyIHggPSB0aGlzLl9iYWNrZHJvcC5jbGllbnRIZWlnaHRcXHJcXG4gICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTGlzdC5hZGQoJ2luJylcXHJcXG4gICAgICAgICQodGhpcy5fYmFja2Ryb3ApLm9uKCdjbGljaycsICgpID0+IHRoaXMudHJpZ2dlcl9jbG9zZSgpKVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5vbigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcXHJcXG4gICAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkub2ZmKClcXHJcXG4gICAgICAgICAgdHJ5IHtcXHJcXG4gICAgICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKVxcclxcbiAgICAgICAgICAgIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJzAnXFxyXFxuICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZCh0aGlzLl9iYWNrZHJvcClcXHJcXG4gICAgICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IG51bGxcXHJcXG4gICAgICAgICAgfSBjYXRjaCAoZSkge31cXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnXFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICB0cmlnZ2VyICgpIHtcXHJcXG4gICAgICByZXR1cm4ge1xcclxcbiAgICAgICAgY2xvc2U6ICgpID0+IHRoaXMudHJpZ2dlcl9jbG9zZSgpLFxcclxcbiAgICAgICAgb3BlbjogKCkgPT4gdGhpcy50cmlnZ2VyX29wZW4oKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdHJpZ2dlcl9jbG9zZSAoKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCggJ2Nsb3NlJyApXFxyXFxuICAgIH0sXFxyXFxuICAgIHRyaWdnZXJfb3BlbigpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCAnb3BlbicgKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbW91bnRlZCAoKSB7XFxyXFxuICAgIHRoaXMuJGVtaXQoJ3RyaWdnZXInLCAoKSA9PiB0aGlzLnRyaWdnZXIpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uYXNpZGUtb3BlbiB7XFxyXFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcztcXHJcXG59XFxyXFxuLmFzaWRlLW9wZW4uaGFzLXB1c2gtcmlnaHQge1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zMDBweCk7XFxyXFxufVxcclxcbi5hc2lkZSB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICBib3R0b206IDA7XFxyXFxuICB6LWluZGV4OiAxMDQ5O1xcclxcbiAgb3ZlcmZsb3c6IGF1dG87XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbn1cXHJcXG4uYXNpZGUubGVmdCB7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgcmlnaHQ6IGF1dG87XFxyXFxufVxcclxcbi5hc2lkZS5yaWdodCB7XFxyXFxuICBsZWZ0OiBhdXRvO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxufVxcclxcbi5zbGlkZWxlZnQtZW50ZXIge1xcclxcbiAgdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO1xcclxcbn1cXHJcXG4uc2xpZGVsZWZ0LWVudGVyLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LWluIC4zcztcXHJcXG59XFxyXFxuLnNsaWRlbGVmdC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlbGVmdC1vdXQgLjNzO1xcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1pbiB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLnNsaWRlcmlnaHQtZW50ZXItYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZXJpZ2h0LWluIC4zcztcXHJcXG59XFxyXFxuLnNsaWRlcmlnaHQtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZXJpZ2h0LW91dCAuM3M7XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVyaWdodC1pbiB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVyaWdodC1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG4uYXNpZGU6Zm9jdXMge1xcclxcbiAgICBvdXRsaW5lOiAwO1xcclxcbn1cXHJcXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcXHJcXG4gIC5hc2lkZSB7XFxyXFxuICAgIG1pbi13aWR0aDogMjQwcHg7XFxyXFxuICB9XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIge1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XFxyXFxuICBtaW4taGVpZ2h0OiAxNi40M3B4O1xcclxcbiAgcGFkZGluZzogNnB4IDE1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjMzM3YWI3O1xcclxcbiAgY29sb3I6ICNmZmY7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIgLmNsb3NlIHtcXHJcXG4gIG1hcmdpbi1yaWdodDogLThweDtcXHJcXG4gIHBhZGRpbmc6IDRweCA4cHg7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG4gIGZvbnQtc2l6ZTogMjVweDtcXHJcXG4gIG9wYWNpdHk6IC44O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtYm9keSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nOiAxNXB4O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIHtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxyXFxuICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTVlNWU1O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMDtcXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWdyb3VwIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogLTFweDtcXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWJsb2NrKy5idG4tYmxvY2sge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDA7XFxyXFxufVxcclxcbi5hc2lkZS1iYWNrZHJvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICB6LWluZGV4OiAxMDQwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2U7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwO1xcclxcbn1cXHJcXG4uYXNpZGUtYmFja2Ryb3AuaW4ge1xcclxcbiAgb3BhY2l0eTogLjU7XFxyXFxuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogODUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBoZWFkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAncmlnaHQnIH0sXG5cdCAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH0sXG5cdCAgICB3aWR0aDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDMyMCB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyh2YWwsIG9sZCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KHRoaXMuc2hvdyA/ICdvcGVuJyA6ICdjbG9zZScpO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIHZhciBzY3JvbGxCYXJXaWR0aCA9ICgwLCBfdXRpbHMuZ2V0U2Nyb2xsQmFyV2lkdGgpKCk7XG5cdCAgICAgIGlmICh2YWwpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuX2JhY2tkcm9wKSB7XG5cdCAgICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnO1xuXHQgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fYmFja2Ryb3ApO1xuXHQgICAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpO1xuXHQgICAgICAgIGlmIChzY3JvbGxCYXJXaWR0aCAhPT0gMCkge1xuXHQgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBzY3JvbGxCYXJXaWR0aCArICdweCc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIHJlcXVlc3QgcHJvcGVydHkgdGhhdCByZXF1aXJlcyBsYXlvdXQgdG8gZm9yY2UgYSBsYXlvdXRcblx0ICAgICAgICB2YXIgeCA9IHRoaXMuX2JhY2tkcm9wLmNsaWVudEhlaWdodDtcblx0ICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc0xpc3QuYWRkKCdpbicpO1xuXHQgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRoaXMuX2JhY2tkcm9wKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICByZXR1cm4gX3RoaXMudHJpZ2dlcl9jbG9zZSgpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRoaXMuX2JhY2tkcm9wKS5vbigndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKF90aGlzLl9iYWNrZHJvcCkub2ZmKCk7XG5cdCAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTtcblx0ICAgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMCc7XG5cdCAgICAgICAgICAgIGJvZHkucmVtb3ZlQ2hpbGQoX3RoaXMuX2JhY2tkcm9wKTtcblx0ICAgICAgICAgICAgX3RoaXMuX2JhY2tkcm9wID0gbnVsbDtcblx0ICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lID0gJ2FzaWRlLWJhY2tkcm9wJztcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdHJpZ2dlcjogZnVuY3Rpb24gdHJpZ2dlcigpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpczIudHJpZ2dlcl9jbG9zZSgpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgb3BlbjogZnVuY3Rpb24gb3BlbigpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpczIudHJpZ2dlcl9vcGVuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgfSxcblx0ICAgIHRyaWdnZXJfY2xvc2U6IGZ1bmN0aW9uIHRyaWdnZXJfY2xvc2UoKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2Nsb3NlJyk7XG5cdCAgICB9LFxuXHQgICAgdHJpZ2dlcl9vcGVuOiBmdW5jdGlvbiB0cmlnZ2VyX29wZW4oKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ29wZW4nKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgICB0aGlzLiRlbWl0KCd0cmlnZ2VyJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gX3RoaXMzLnRyaWdnZXI7XG5cdCAgICB9KTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiA4NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6ICdzbGlkZScgKyBfdm0ucGxhY2VtZW50XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlXCIsXG5cdCAgICBjbGFzczogX3ZtLnBsYWNlbWVudCxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLndpZHRoICsgJ3B4J1xuXHQgICAgfSlcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJhc2lkZS1kaWFsb2dcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWhlYWRlclwiXG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udHJpZ2dlcl9jbG9zZVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCBbX3ZtLl92KFwiw5dcIildKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2g0Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtdGl0bGVcIlxuXHQgIH0sIFtfdm0uX3QoXCJoZWFkZXJcIiwgW192bS5fdihfdm0uX3MoX3ZtLmhlYWRlcikpXSldLCAyKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWJvZHlcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKV0pXSkgOiBfdm0uX2UoKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTNhNGJkZTI3XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogODcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODgpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODkpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQnV0dG9uR3JvdXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTEyNWViMGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0xMjVlYjBjOFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEJ1dHRvbkdyb3VwLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDg4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYnV0dG9uczogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBqdXN0aWZpZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZlcnRpY2FsOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICB0aGlzLl9idG5Hcm91cCA9IHRydWU7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWw6IHRoaXMudmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiA4OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczoge1xuXHQgICAgICAnYnRuLWdyb3VwJzogX3ZtLmJ1dHRvbnMsICdidG4tZ3JvdXAtanVzdGlmaWVkJzogX3ZtLmp1c3RpZmllZCwgJ2J0bi1ncm91cC12ZXJ0aWNhbCc6IF92bS52ZXJ0aWNhbFxuXHQgICAgfSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiZGF0YS10b2dnbGVcIjogX3ZtLmJ1dHRvbnMgJiYgJ2J1dHRvbnMnXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0xMjVlYjBjOFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDkwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDkxKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTMpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTQpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQ2Fyb3VzZWwudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRfX3Z1ZV9vcHRpb25zX18uX3Njb3BlSWQgPSBcImRhdGEtdi0zMjJkZWU0MVwiXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzIyZGVlNDFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTMyMmRlZTQxXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQ2Fyb3VzZWwudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogOTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0zMjJkZWU0MSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2Fyb3VzZWwudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0zMjJkZWU0MSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2Fyb3VzZWwudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogOTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmNhcm91c2VsLWNvbnRyb2xbZGF0YS12LTMyMmRlZTQxXSB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQ2Fyb3VzZWwudnVlPzJmNDQ2MzQyXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUE0R0E7RUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJDYXJvdXNlbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbjxkaXYgY2xhc3M9XFxcImNhcm91c2VsIHNsaWRlXFxcIiBkYXRhLXJpZGU9XFxcImNhcm91c2VsXFxcIj5cXHJcXG4gIDwhLS0gSW5kaWNhdG9ycyAtLT5cXHJcXG4gIDxvbCBjbGFzcz1cXFwiY2Fyb3VzZWwtaW5kaWNhdG9yc1xcXCIgdi1zaG93PVxcXCJpbmRpY2F0b3JzXFxcIj5cXHJcXG4gICAgPGxpIHYtZm9yPVxcXCIoaW5kaWNhdG9yLGkpIGluIGluZGljYXRvcl9saXN0XFxcIiBAY2xpY2s9XFxcImluZGljYXRvckNsaWNrKGkpXFxcIiA6Y2xhc3M9XFxcInthY3RpdmU6aSA9PT0gaW5kZXh9XFxcIj48c3Bhbj48L3NwYW4+PC9saT5cXHJcXG4gIDwvb2w+XFxyXFxuICA8IS0tIFdyYXBwZXIgZm9yIHNsaWRlcyAtLT5cXHJcXG4gIDxkaXYgY2xhc3M9XFxcImNhcm91c2VsLWlubmVyXFxcIiByb2xlPVxcXCJsaXN0Ym94XFxcIj5cXHJcXG4gICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgPC9kaXY+XFxyXFxuICA8IS0tIENvbnRyb2xzIC0tPlxcclxcbiAgPGRpdiB2LXNob3c9XFxcImNvbnRyb2xzXFxcIiBjbGFzcz1cXFwiY2Fyb3VzZWwtY29udHJvbHMgaGlkZGVuLXhzXFxcIj5cXHJcXG4gICAgPGEgY2xhc3M9XFxcImxlZnQgY2Fyb3VzZWwtY29udHJvbFxcXCIgcm9sZT1cXFwiYnV0dG9uXFxcIiBAY2xpY2s9XFxcInByZXZcXFwiPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tbGVmdFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvc3Bhbj5cXHJcXG4gICAgPC9hPlxcclxcbiAgICA8YSBjbGFzcz1cXFwicmlnaHQgY2Fyb3VzZWwtY29udHJvbFxcXCIgcm9sZT1cXFwiYnV0dG9uXFxcIiBAY2xpY2s9XFxcIm5leHRcXFwiPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tcmlnaHRcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgIDwvYT5cXHJcXG4gIDwvZGl2PlxcclxcbjwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xcclxcbi8vIGxldCBjb2VyY2UgPSB7XFxyXFxuLy8gICBpbnRlcnZhbDogJ251bWJlcidcXHJcXG4vLyB9XFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgaW5kaWNhdG9yczoge1xcclxcbiAgICAgIHR5cGU6IEJvb2xlYW4sXFxyXFxuICAgICAgZGVmYXVsdDogdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICBjb250cm9sczoge1xcclxcbiAgICAgIHR5cGU6IEJvb2xlYW4sXFxyXFxuICAgICAgZGVmYXVsdDogdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICBpbnRlcnZhbDoge1xcclxcbiAgICAgIHR5cGU6IE51bWJlcixcXHJcXG4gICAgICBkZWZhdWx0OiA1MDAwXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBpbmRpY2F0b3JfbGlzdDogW10sXFxyXFxuICAgICAgaW5kZXg6IDAsXFxyXFxuICAgICAgaXNBbmltYXRpbmc6IGZhbHNlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBpbmRleCAobmV3VmFsLCBvbGRWYWwpIHtcXHJcXG4gICAgICB0aGlzLnNsaWRlKG5ld1ZhbCA+IG9sZFZhbCA/ICdsZWZ0JyA6ICdyaWdodCcsIG5ld1ZhbCwgb2xkVmFsKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBpbmRpY2F0b3JDbGljayAoaW5kZXgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5pc0FuaW1hdGluZyB8fCB0aGlzLmluZGV4ID09PSBpbmRleCkgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmluZGV4ID0gaW5kZXhcXHJcXG4gICAgfSxcXHJcXG4gICAgc2xpZGUgKGRpcmVjdGlvbiwgbmV4dCwgcHJldikge1xcclxcbiAgICAgIGlmICghdGhpcy4kZWwpIHsgcmV0dXJuIH1cXHJcXG4gICAgICBjb25zdCAkc2xpZGVyID0gJCgnLml0ZW0nLCB0aGlzLiRlbClcXHJcXG4gICAgICBpZiAoISRzbGlkZXIubGVuZ3RoKSB7IHJldHVybiB9XFxyXFxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSAkc2xpZGVyW25leHRdIHx8ICRzbGlkZXJbMF1cXHJcXG4gICAgICAkKHNlbGVjdGVkKS5hZGRDbGFzcyhkaXJlY3Rpb24gPT09ICdsZWZ0JyA/ICduZXh0JyA6ICdwcmV2JylcXHJcXG4gICAgICAvLyByZXF1ZXN0IHByb3BlcnR5IHRoYXQgcmVxdWlyZXMgbGF5b3V0IHRvIGZvcmNlIGEgbGF5b3V0XFxyXFxuICAgICAgdmFyIHggPSBzZWxlY3RlZC5jbGllbnRIZWlnaHRcXHJcXG4gICAgICAkKFskc2xpZGVyW3ByZXZdLCBzZWxlY3RlZF0pLmFkZENsYXNzKGRpcmVjdGlvbikub24oJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB7XFxyXFxuICAgICAgICAkc2xpZGVyLm9mZigndHJhbnNpdGlvbmVuZCcpLmNsYXNzTmFtZSA9ICdpdGVtJ1xcclxcbiAgICAgICAgJChzZWxlY3RlZCkuYWRkQ2xhc3MoJ2FjdGl2ZScpXFxyXFxuICAgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2VcXHJcXG4gICAgICB9KVxcclxcbiAgICB9LFxcclxcbiAgICBuZXh0ICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuJGVsIHx8IHRoaXMuaXNBbmltYXRpbmcpIHsgcmV0dXJuIGZhbHNlIH1cXHJcXG4gICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZVxcclxcbiAgICAgIHRoaXMuaW5kZXggKyAxIDwgJCgnLml0ZW0nLCB0aGlzLiRlbCkubGVuZ3RoID8gdGhpcy5pbmRleCArPSAxIDogdGhpcy5pbmRleCA9IDBcXHJcXG4gICAgfSxcXHJcXG4gICAgcHJldiAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmluZGV4ID09PSAwID8gdGhpcy5pbmRleCA9ICQoJy5pdGVtJywgdGhpcy4kZWwpLmxlbmd0aCAtIDEgOiB0aGlzLmluZGV4IC09IDFcXHJcXG4gICAgfSxcXHJcXG4gICAgdG9nZ2xlSW50ZXJ2YWwgKHZhbCkge1xcclxcbiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgeyB2YWwgPSB0aGlzLl9pbnRlcnZhbElEIH1cXHJcXG4gICAgICBpZih0aGlzLl9pbnRlcnZhbElEKSB7XFxyXFxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsSUQpXFxyXFxuICAgICAgICBkZWxldGUgdGhpcy5faW50ZXJ2YWxJRFxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZih2YWwgJiYgdGhpcy5pbnRlcnZhbCA+IDApIHtcXHJcXG4gICAgICAgIHRoaXMuX2ludGVydmFsSUQgPSBzZXRJbnRlcnZhbCh0aGlzLm5leHQsIHRoaXMuaW50ZXJ2YWwpXFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbW91bnRlZCAoKSB7XFxyXFxuICAgIHRoaXMudG9nZ2xlSW50ZXJ2YWwodHJ1ZSlcXHJcXG4gICAgJCh0aGlzLiRlbCkub24oJ21vdXNlZW50ZXInLCAoKSA9PiB0aGlzLnRvZ2dsZUludGVydmFsKGZhbHNlKSkub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB0aGlzLnRvZ2dsZUludGVydmFsKHRydWUpKVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICB0aGlzLnRvZ2dsZUludGVydmFsKGZhbHNlKVxcclxcbiAgICAkKHRoaXMuJGVsKS5vZmYoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZSBzY29wZWQ+XFxyXFxuLmNhcm91c2VsLWNvbnRyb2wge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogOTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvLyBsZXQgY29lcmNlID0ge1xuXHQvLyAgIGludGVydmFsOiAnbnVtYmVyJ1xuXHQvLyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGluZGljYXRvcnM6IHtcblx0ICAgICAgdHlwZTogQm9vbGVhbixcblx0ICAgICAgZGVmYXVsdDogdHJ1ZVxuXHQgICAgfSxcblx0ICAgIGNvbnRyb2xzOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IHRydWVcblx0ICAgIH0sXG5cdCAgICBpbnRlcnZhbDoge1xuXHQgICAgICB0eXBlOiBOdW1iZXIsXG5cdCAgICAgIGRlZmF1bHQ6IDUwMDBcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBpbmRpY2F0b3JfbGlzdDogW10sXG5cdCAgICAgIGluZGV4OiAwLFxuXHQgICAgICBpc0FuaW1hdGluZzogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleChuZXdWYWwsIG9sZFZhbCkge1xuXHQgICAgICB0aGlzLnNsaWRlKG5ld1ZhbCA+IG9sZFZhbCA/ICdsZWZ0JyA6ICdyaWdodCcsIG5ld1ZhbCwgb2xkVmFsKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGluZGljYXRvckNsaWNrOiBmdW5jdGlvbiBpbmRpY2F0b3JDbGljayhpbmRleCkge1xuXHQgICAgICBpZiAodGhpcy5pc0FuaW1hdGluZyB8fCB0aGlzLmluZGV4ID09PSBpbmRleCkgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuXHQgICAgfSxcblx0ICAgIHNsaWRlOiBmdW5jdGlvbiBzbGlkZShkaXJlY3Rpb24sIG5leHQsIHByZXYpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIGlmICghdGhpcy4kZWwpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdmFyICRzbGlkZXIgPSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnLml0ZW0nLCB0aGlzLiRlbCk7XG5cdCAgICAgIGlmICghJHNsaWRlci5sZW5ndGgpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIHNlbGVjdGVkID0gJHNsaWRlcltuZXh0XSB8fCAkc2xpZGVyWzBdO1xuXHQgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KShzZWxlY3RlZCkuYWRkQ2xhc3MoZGlyZWN0aW9uID09PSAnbGVmdCcgPyAnbmV4dCcgOiAncHJldicpO1xuXHQgICAgICAvLyByZXF1ZXN0IHByb3BlcnR5IHRoYXQgcmVxdWlyZXMgbGF5b3V0IHRvIGZvcmNlIGEgbGF5b3V0XG5cdCAgICAgIHZhciB4ID0gc2VsZWN0ZWQuY2xpZW50SGVpZ2h0O1xuXHQgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KShbJHNsaWRlcltwcmV2XSwgc2VsZWN0ZWRdKS5hZGRDbGFzcyhkaXJlY3Rpb24pLm9uKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICRzbGlkZXIub2ZmKCd0cmFuc2l0aW9uZW5kJykuY2xhc3NOYW1lID0gJ2l0ZW0nO1xuXHQgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHNlbGVjdGVkKS5hZGRDbGFzcygnYWN0aXZlJyk7XG5cdCAgICAgICAgX3RoaXMuaXNBbmltYXRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSk7XG5cdCAgICB9LFxuXHQgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcblx0ICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLmluZGV4ICsgMSA8ICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCcuaXRlbScsIHRoaXMuJGVsKS5sZW5ndGggPyB0aGlzLmluZGV4ICs9IDEgOiB0aGlzLmluZGV4ID0gMDtcblx0ICAgIH0sXG5cdCAgICBwcmV2OiBmdW5jdGlvbiBwcmV2KCkge1xuXHQgICAgICBpZiAoIXRoaXMuJGVsIHx8IHRoaXMuaXNBbmltYXRpbmcpIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7XG5cdCAgICAgIHRoaXMuaW5kZXggPT09IDAgPyB0aGlzLmluZGV4ID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5pdGVtJywgdGhpcy4kZWwpLmxlbmd0aCAtIDEgOiB0aGlzLmluZGV4IC09IDE7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlSW50ZXJ2YWw6IGZ1bmN0aW9uIHRvZ2dsZUludGVydmFsKHZhbCkge1xuXHQgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICB2YWwgPSB0aGlzLl9pbnRlcnZhbElEO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9pbnRlcnZhbElEKSB7XG5cdCAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbElEKTtcblx0ICAgICAgICBkZWxldGUgdGhpcy5faW50ZXJ2YWxJRDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodmFsICYmIHRoaXMuaW50ZXJ2YWwgPiAwKSB7XG5cdCAgICAgICAgdGhpcy5faW50ZXJ2YWxJRCA9IHNldEludGVydmFsKHRoaXMubmV4dCwgdGhpcy5pbnRlcnZhbCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICB0aGlzLnRvZ2dsZUludGVydmFsKHRydWUpO1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy4kZWwpLm9uKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gX3RoaXMyLnRvZ2dsZUludGVydmFsKGZhbHNlKTtcblx0ICAgIH0pLm9uKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gX3RoaXMyLnRvZ2dsZUludGVydmFsKHRydWUpO1xuXHQgICAgfSk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgdGhpcy50b2dnbGVJbnRlcnZhbChmYWxzZSk7XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLiRlbCkub2ZmKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnKTtcblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiA5NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbCBzbGlkZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJkYXRhLXJpZGVcIjogXCJjYXJvdXNlbFwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnb2wnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uaW5kaWNhdG9ycyksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiaW5kaWNhdG9yc1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNhcm91c2VsLWluZGljYXRvcnNcIlxuXHQgIH0sIF92bS5fbCgoX3ZtLmluZGljYXRvcl9saXN0KSwgZnVuY3Rpb24oaW5kaWNhdG9yLCBpKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICBhY3RpdmU6IGkgPT09IF92bS5pbmRleFxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICBfdm0uaW5kaWNhdG9yQ2xpY2soaSlcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX2MoJ3NwYW4nKV0pXG5cdCAgfSkpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNhcm91c2VsLWlubmVyXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJsaXN0Ym94XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jb250cm9scyksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY29udHJvbHNcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbC1jb250cm9scyBoaWRkZW4teHNcIlxuXHQgIH0sIFtfdm0uX2MoJ2EnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJsZWZ0IGNhcm91c2VsLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0ucHJldlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tbGVmdFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfVxuXHQgIH0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnYScsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInJpZ2h0IGNhcm91c2VsLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0ubmV4dFxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tcmlnaHRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KV0pXSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0zMjJkZWU0MVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDk1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDk2KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTgpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTkpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQ2hlY2tib3gudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRfX3Z1ZV9vcHRpb25zX18uX3Njb3BlSWQgPSBcImRhdGEtdi02OTIyYmYyNFwiXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNjkyMmJmMjRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTY5MjJiZjI0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQ2hlY2tib3gudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogOTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3KTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02OTIyYmYyNCZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2hlY2tib3gudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02OTIyYmYyNCZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2hlY2tib3gudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogOTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxubGFiZWwuY2hlY2tib3hbZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDE4cHg7XFxufVxcbmxhYmVsLmNoZWNrYm94ID4gaW5wdXRbZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgei1pbmRleDogLTE7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIG1hcmdpbjogMDtcXG59XFxubGFiZWwuY2hlY2tib3ggPiAuaWNvbltkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogLjJyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICBsaW5lLWhlaWdodDoxcmVtO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBib3JkZXItcmFkaXVzOiAuMzVyZW07XFxyXFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTtcXG59XFxubGFiZWwuY2hlY2tib3g6bm90KC5hY3RpdmUpID4gLmljb25bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2JiYjtcXG59XFxubGFiZWwuY2hlY2tib3ggPiBpbnB1dDpmb2N1cyB+IC5pY29uW2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcbn1cXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgPiAuaWNvbltkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogMXJlbSAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqeHpkbWNnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUIzYVdSMGFEMGlOeUlnYUdWcFoyaDBQU0kzSWo0OGNHRjBhQ0JtYVd4c1BTSWpabVptSWlCa1BTSnROUzQzTXl3d0xqVXliQzB6TGpFeU5ESXlMRE11TXpReE5qRnNMVEV1TXpNNE9UVXNMVEV1TkRNeU1USnNMVEV1TWpRNU5qa3NNUzR6TXpZMk5Xd3lMalU0T0RZekxESXVOelk0Tnpac05DNHpOek01TEMwMExqWTNPREkyYkMweExqSTBPVFk1TEMweExqTXpOalkxYkRBc01Hd3dMakF3TURBeUxEQXVNREF3TURGNklpOCtQQzl6ZG1jKyk7XFxufVxcbmxhYmVsLmNoZWNrYm94LmFjdGl2ZSAuYnRuLWRlZmF1bHRbZGF0YS12LTY5MjJiZjI0XSB7IGZpbHRlcjogYnJpZ2h0bmVzcyg3NSUpO1xcbn1cXG5sYWJlbC5jaGVja2JveC5kaXNhYmxlZFtkYXRhLXYtNjkyMmJmMjRdLFxcclxcbmxhYmVsLmNoZWNrYm94LnJlYWRvbmx5W2RhdGEtdi02OTIyYmYyNF0sXFxyXFxuLmJ0bi5yZWFkb25seVtkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcbn1cXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPWNoZWNrYm94XVtkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9DaGVja2JveC52dWU/MWMwNDQxMGJcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQXlGQTtFQUNBLG1CQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtFQUNBLFlBQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTtFQUNBLFVBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsUUFBQTtFQUNBLGVBQUE7RUFDQSxjQUFBO0VBQ0EsZUFBQTtFQUNBLGlCQUFBO0VBQ0EsbUJBQUE7RUFDQSxrQkFBQTtFQUNBLHNCQUFBO0VBQ0EsNkJBQUE7RUFDQSxtQ0FBQTtFQUNBLHlCQUFBO0NBQ0E7QUFDQTtFQUNBLHVCQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtFQUNBLDBCQUFBO0VBQ0EsMEVBQUE7Q0FDQTtBQUNBO0VBQ0EsMkJBQUE7RUFDQSxrWkFBQTtDQUNBO0FBQ0Esc0RBQUEsd0JBQUE7Q0FBQTtBQUVBOzs7RUFHQSwwQkFBQTtFQUNBLGlCQUFBO0VBQ0EsYUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2hlY2tib3gudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxhIDppcz1cXFwiaXNCdXR0b24/J2EnOidsYWJlbCdcXFwiIEBjbGljaz1cXFwidG9nZ2xlXFxcIiA6Y2xhc3M9XFxcIltpc0J1dHRvbj8nYnRuIGJ0bi0nK3R5cGVDb2xvcjonb3BlbiBjaGVja2JveCAnK3R5cGVDb2xvcix7YWN0aXZlOmNoZWNrZWQsZGlzYWJsZWQ6ZGlzYWJsZWQscmVhZG9ubHk6cmVhZG9ubHl9XVxcXCI+XFxyXFxuICAgIDxpbnB1dCB2LWlmPVxcXCJuYW1lXFxcIiB0eXBlPVxcXCJoaWRkZW5cXFwiIDpuYW1lPVxcXCJuYW1lXFxcIiA6dmFsdWU9XFxcImNoZWNrZWQ/dHJ1ZVZhbHVlOmZhbHNlVmFsdWVcXFwiIC8+XFxyXFxuICAgIDxzcGFuIHYtaWY9XFxcIiFpc0J1dHRvblxcXCIgY2xhc3M9XFxcImljb24gZHJvcGRvd24tdG9nZ2xlXFxcIiA6Y2xhc3M9XFxcIltjaGVja2VkPydidG4tJyt0eXBlQ29sb3I6Jycse2JnOnR5cGVDb2xvcj09PSdkZWZhdWx0J31dXFxcIj48L3NwYW4+XFxyXFxuICAgIDxzcGFuIHYtaWY9XFxcIiFpc0J1dHRvbiYmY2hlY2tlZCYmdHlwZUNvbG9yPT09J2RlZmF1bHQnXFxcIiBjbGFzcz1cXFwiaWNvblxcXCI+PC9zcGFuPlxcclxcbiAgICA8c2xvdD48L3Nsb3Q+XFxyXFxuICA8L2E+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZGlzYWJsZWQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGZhbHNlVmFsdWU6IHtkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIG5hbWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgdHJ1ZVZhbHVlOiB7ZGVmYXVsdDogdHJ1ZX0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGNoZWNrZWQ6ICh0aGlzLnZhbHVlID09PSB0aGlzLnRydWVWYWx1ZSlcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGlzQnV0dG9uICgpIHsgcmV0dXJuIHRoaXMuYnV0dG9uIHx8ICh0aGlzLl9pbkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zKSB9LFxcclxcbiAgICBpc0ZhbHNlICgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPT09IHRoaXMuZmFsc2VWYWx1ZSB9LFxcclxcbiAgICBpc1RydWUgKCkgeyByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWUgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKCkgeyByZXR1cm4gdGhpcy5faW5ncm91cCAmJiB0aGlzLiRwYXJlbnQudmFsIH0sXFxyXFxuICAgIHR5cGVDb2xvciAoKSB7IHJldHVybiAodGhpcy50eXBlIHx8ICh0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUpKSB8fCAnZGVmYXVsdCcgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIGNoZWNrZWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdmFyIHZhbHVlID0gdmFsID8gdGhpcy50cnVlVmFsdWUgOiB0aGlzLmZhbHNlVmFsdWVcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdjaGVja2VkJywgdmFsKVxcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpXFxyXFxuICAgICAgdGhpcy5ldmFsKClcXHJcXG4gICAgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWRcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWRcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9idG5Hcm91cCAmJiAhcGFyZW50Ll9yYWRpb0dyb3VwKSB7XFxyXFxuICAgICAgdGhpcy5faW5Hcm91cCA9IHRydWVcXHJcXG4gICAgICBwYXJlbnQuX2NoZWNrYm94R3JvdXAgPSB0cnVlXFxyXFxuICAgICAgaWYgKCEocGFyZW50LnZhbCBpbnN0YW5jZW9mIEFycmF5KSkgeyBwYXJlbnQudmFsID0gW10gfVxcclxcbiAgICAgIHRoaXMuZXZhbCgpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgaWYgKCF0aGlzLiRwYXJlbnQuX2NoZWNrYm94R3JvdXAgfHwgdHlwZW9mIHRoaXMudmFsdWUgPT09ICdib29sZWFuJykgeyByZXR1cm4gfVxcclxcbiAgICBpZiAodGhpcy4kcGFyZW50LnZhbC5sZW5ndGgpIHtcXHJcXG4gICAgICAvLyB0aGlzLmNoZWNrZWQgPSB+dGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudmFsdWUpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnY2hlY2tlZCcsIH50aGlzLiRwYXJlbnQudmFsLmluZGV4T2YodGhpcy52YWx1ZSkpXFxyXFxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2VkKSB7XFxyXFxuICAgICAgdGhpcy4kcGFyZW50LnZhbC5wdXNoKHRoaXMudmFsdWUpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIGV2YWwgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLl9pbkdyb3VwKSB7XFxyXFxuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmNoZWNrZWQgPyB0aGlzLmlzVHJ1ZSA6IHRoaXMuaXNGYWxzZVxcclxcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHZhbHVlKVxcclxcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tlZCAmJiAhfmluZGV4KSB0aGlzLiRwYXJlbnQudmFsLnB1c2godmFsdWUpXFxyXFxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tlZCAmJiB+aW5kZXgpIHRoaXMuJHBhcmVudC52YWwuc3BsaWNlKGluZGV4LCAxKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdG9nZ2xlICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7IHJldHVybiB9XFxyXFxuICAgICAgdGhpcy5jaGVja2VkID0gIXRoaXMuY2hlY2tlZFxcclxcbiAgICB9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZSBzY29wZWQ+XFxyXFxubGFiZWwuY2hlY2tib3gge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAxOHB4O1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveCA+IGlucHV0IHtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB6LWluZGV4OiAtMTtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveCA+IC5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogLjJyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICBsaW5lLWhlaWdodDoxcmVtO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBib3JkZXItcmFkaXVzOiAuMzVyZW07XFxyXFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTtcXHJcXG59XFxyXFxubGFiZWwuY2hlY2tib3g6bm90KC5hY3RpdmUpID4gLmljb24ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94ID4gaW5wdXQ6Zm9jdXMgfiAuaWNvbiB7XFxyXFxuICBvdXRsaW5lOiAwO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgIzY2YWZlOTtcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94LmFjdGl2ZSA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogMXJlbSAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqeHpkbWNnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUIzYVdSMGFEMGlOeUlnYUdWcFoyaDBQU0kzSWo0OGNHRjBhQ0JtYVd4c1BTSWpabVptSWlCa1BTSnROUzQzTXl3d0xqVXliQzB6TGpFeU5ESXlMRE11TXpReE5qRnNMVEV1TXpNNE9UVXNMVEV1TkRNeU1USnNMVEV1TWpRNU5qa3NNUzR6TXpZMk5Xd3lMalU0T0RZekxESXVOelk0Tnpac05DNHpOek01TEMwMExqWTNPREkyYkMweExqSTBPVFk1TEMweExqTXpOalkxYkRBc01Hd3dMakF3TURBeUxEQXVNREF3TURGNklpOCtQQzl6ZG1jKyk7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94LmFjdGl2ZSAuYnRuLWRlZmF1bHQgeyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTsgfVxcclxcblxcclxcbmxhYmVsLmNoZWNrYm94LmRpc2FibGVkLFxcclxcbmxhYmVsLmNoZWNrYm94LnJlYWRvbmx5LFxcclxcbi5idG4ucmVhZG9ubHkge1xcclxcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1KTtcXHJcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICBvcGFjaXR5OiAuNjU7XFxyXFxufVxcclxcbmxhYmVsLmJ0biA+IGlucHV0W3R5cGU9Y2hlY2tib3hdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDk4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZmFsc2VWYWx1ZTogeyBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICB0cnVlVmFsdWU6IHsgZGVmYXVsdDogdHJ1ZSB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjaGVja2VkOiB0aGlzLnZhbHVlID09PSB0aGlzLnRydWVWYWx1ZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgaXNCdXR0b246IGZ1bmN0aW9uIGlzQnV0dG9uKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idXR0b24gfHwgdGhpcy5faW5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucztcblx0ICAgIH0sXG5cdCAgICBpc0ZhbHNlOiBmdW5jdGlvbiBpc0ZhbHNlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy5mYWxzZVZhbHVlO1xuXHQgICAgfSxcblx0ICAgIGlzVHJ1ZTogZnVuY3Rpb24gaXNUcnVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWU7XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5faW5ncm91cCAmJiB0aGlzLiRwYXJlbnQudmFsO1xuXHQgICAgfSxcblx0ICAgIHR5cGVDb2xvcjogZnVuY3Rpb24gdHlwZUNvbG9yKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50eXBlIHx8IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSB8fCAnZGVmYXVsdCc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgY2hlY2tlZDogZnVuY3Rpb24gY2hlY2tlZCh2YWwsIG9sZCkge1xuXHQgICAgICB2YXIgdmFsdWUgPSB2YWwgPyB0aGlzLnRydWVWYWx1ZSA6IHRoaXMuZmFsc2VWYWx1ZTtcblx0ICAgICAgdGhpcy4kZW1pdCgnY2hlY2tlZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpO1xuXHQgICAgICB0aGlzLmV2YWwoKTtcblx0ICAgIH0sXG5cdCAgICBwYXJlbnRWYWx1ZTogZnVuY3Rpb24gcGFyZW50VmFsdWUodmFsKSB7XG5cdCAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZTtcblx0ICAgICAgaWYgKHRoaXMuY2hlY2tlZCAhPT0gY2hlY2tlZCkge1xuXHQgICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWQ7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIGNoZWNrZWQgPSB2YWwgPT09IHRoaXMudHJ1ZVZhbHVlO1xuXHQgICAgICBpZiAodGhpcy5jaGVja2VkICE9PSBjaGVja2VkKSB7XG5cdCAgICAgICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fYnRuR3JvdXAgJiYgIXBhcmVudC5fcmFkaW9Hcm91cCkge1xuXHQgICAgICB0aGlzLl9pbkdyb3VwID0gdHJ1ZTtcblx0ICAgICAgcGFyZW50Ll9jaGVja2JveEdyb3VwID0gdHJ1ZTtcblx0ICAgICAgaWYgKCEocGFyZW50LnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xuXHQgICAgICAgIHBhcmVudC52YWwgPSBbXTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmV2YWwoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICBpZiAoIXRoaXMuJHBhcmVudC5fY2hlY2tib3hHcm91cCB8fCB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLiRwYXJlbnQudmFsLmxlbmd0aCkge1xuXHQgICAgICAvLyB0aGlzLmNoZWNrZWQgPSB+dGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudmFsdWUpXG5cdCAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB+dGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudmFsdWUpKTtcblx0ICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2VkKSB7XG5cdCAgICAgIHRoaXMuJHBhcmVudC52YWwucHVzaCh0aGlzLnZhbHVlKTtcblx0ICAgIH1cblx0ICB9LFxuXHRcblx0ICBtZXRob2RzOiB7XG5cdCAgICBldmFsOiBmdW5jdGlvbiBfZXZhbCgpIHtcblx0ICAgICAgaWYgKHRoaXMuX2luR3JvdXApIHtcblx0ICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmNoZWNrZWQgPyB0aGlzLmlzVHJ1ZSA6IHRoaXMuaXNGYWxzZTtcblx0ICAgICAgICB2YXIgaW5kZXggPSB0aGlzLiRwYXJlbnQudmFsLmluZGV4T2YodmFsdWUpO1xuXHQgICAgICAgIGlmICh0aGlzLmNoZWNrZWQgJiYgIX5pbmRleCkgdGhpcy4kcGFyZW50LnZhbC5wdXNoKHZhbHVlKTtcblx0ICAgICAgICBpZiAoIXRoaXMuY2hlY2tlZCAmJiB+aW5kZXgpIHRoaXMuJHBhcmVudC52YWwuc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogOTkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYyhfdm0uaXNCdXR0b24gPyAnYScgOiAnbGFiZWwnLCB7XG5cdCAgICB0YWc6IFwiYVwiLFxuXHQgICAgY2xhc3M6IFtfdm0uaXNCdXR0b24gPyAnYnRuIGJ0bi0nICsgX3ZtLnR5cGVDb2xvciA6ICdvcGVuIGNoZWNrYm94ICcgKyBfdm0udHlwZUNvbG9yLCB7XG5cdCAgICAgIGFjdGl2ZTogX3ZtLmNoZWNrZWQsXG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHlcblx0ICAgIH1dLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlXG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ubmFtZSkgPyBfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiaGlkZGVuXCIsXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZVxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLmNoZWNrZWQgPyBfdm0udHJ1ZVZhbHVlIDogX3ZtLmZhbHNlVmFsdWVcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoIV92bS5pc0J1dHRvbikgPyBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVwiLFxuXHQgICAgY2xhc3M6IFtfdm0uY2hlY2tlZCA/ICdidG4tJyArIF92bS50eXBlQ29sb3IgOiAnJywge1xuXHQgICAgICBiZzogX3ZtLnR5cGVDb2xvciA9PT0gJ2RlZmF1bHQnXG5cdCAgICB9XVxuXHQgIH0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksICghX3ZtLmlzQnV0dG9uICYmIF92bS5jaGVja2VkICYmIF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0JykgPyBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uXCJcblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNjkyMmJmMjRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTAxKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTAzKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxEYXRlcGlja2VyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi00NzdiOGU1ZFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNDc3YjhlNWRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBEYXRlcGlja2VyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEwMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTAyKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi00NzdiOGU1ZCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vRGF0ZXBpY2tlci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQ3N2I4ZTVkIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9EYXRlcGlja2VyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEwMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZGF0ZXBpY2tlciB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbmlucHV0LmRhdGVwaWNrZXItaW5wdXQud2l0aC1yZXNldC1idXR0b24ge1xcclxcbiAgcGFkZGluZy1yaWdodDogMjVweDtcXG59XFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2U6Zm9jdXMge1xcclxcbiAgb3BhY2l0eTogLjI7XFxufVxcbi5kYXRlcGlja2VyLXBvcHVwIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgbWFyZ2luLXRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwMDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLDAsMCwwLjE3NSk7XFxufVxcbi5kYXRlcGlja2VyLWlubmVyIHtcXHJcXG4gIHdpZHRoOiAyMThweDtcXG59XFxuLmRhdGVwaWNrZXItYm9keSB7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHg7XFxufVxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHdpZHRoOiAyOHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI4cHg7XFxyXFxuICBoZWlnaHQ6IDI4cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcbi5kYXRlcGlja2VyLWN0cmwgcCB7XFxyXFxuICB3aWR0aDogNjUlO1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbn1cXG4uZGF0ZXBpY2tlci1ib2R5IHNwYW4ge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4ge1xcclxcbiAgd2lkdGg6IDQ4cHg7XFxyXFxuICBoZWlnaHQ6IDUwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogNDVweDtcXG59XFxuLmRhdGVwaWNrZXItaXRlbS1kaXNhYmxlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG4gIGN1cnNvcjogbm90LWFsbG93ZWQhaW1wb3J0YW50O1xcbn1cXG4uZGVjYWRlUmFuZ2Ugc3BhbjpmaXJzdC1jaGlsZCxcXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpsYXN0LWNoaWxkLFxcclxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWdyYXkge1xcclxcbiAgY29sb3I6ICM5OTk7XFxufVxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZTpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUge1xcclxcbiAgYmFja2dyb3VuZDogcmdiKDUwLCAxMTgsIDE3NykhaW1wb3J0YW50O1xcclxcbiAgY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXG59XFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAxMHB4XFxufVxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3BhbixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBwLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcDpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIGk6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlIHNwYW46aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0taG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvciA6ICNlZWVlZWU7XFxufVxcbi5kYXRlcGlja2VyLXdlZWtSYW5nZSBzcGFuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG4uZGF0ZXBpY2tlci1sYWJlbCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXHJcXG4gIHBhZGRpbmc6IDdweCAwO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGhlaWdodDogMzBweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5tb250aC1idG4ge1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbW96LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbXMtdXNlci1zZWxlY3Q6bm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0Om5vbmU7XFxufVxcbi5kYXRlcGlja2VyLXByZUJ0biB7XFxyXFxuICBsZWZ0OiAycHg7XFxufVxcbi5kYXRlcGlja2VyLW5leHRCdG4ge1xcclxcbiAgcmlnaHQ6IDJweDtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9EYXRlcGlja2VyLnZ1ZT8yMjAwZTRjYVwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBc1ZBO0VBQ0EsbUJBQUE7RUFDQSxzQkFBQTtDQUNBO0FBQ0E7RUFDQSxvQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLG1CQUFBO0VBQ0EsaUJBQUE7RUFDQSxnQkFBQTtFQUNBLGNBQUE7RUFDQSx5Q0FBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTs7O0VBR0Esc0JBQUE7RUFDQSxZQUFBO0VBQ0Esa0JBQUE7RUFDQSxhQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGtCQUFBO0NBQ0E7QUFDQTtFQUNBLGtDQUFBO0VBQ0EsOEJBQUE7Q0FDQTtBQUNBOzs7O0VBSUEsWUFBQTtDQUNBO0FBRUE7O0VBRUEsd0NBQUE7RUFDQSx1QkFBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtDQUNBO0FBQ0E7Ozs7RUFJQSxnQkFBQTtDQUNBO0FBQ0E7Ozs7O0VBS0EsMkJBQUE7Q0FDQTtBQUNBO0VBQ0Esa0JBQUE7Q0FDQTtBQUNBO0VBQ0EsMEJBQUE7RUFDQSxpQkFBQTtFQUNBLGVBQUE7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0Esa0JBQUE7RUFDQSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0EscUJBQUE7RUFDQSxpQkFBQTtDQUNBO0FBQ0E7RUFDQSxVQUFBO0NBQ0E7QUFDQTtFQUNBLFdBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiRGF0ZXBpY2tlci52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlclxcXCI+XFxyXFxuICAgIDxpbnB1dCBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGRhdGVwaWNrZXItaW5wdXRcXFwiIDpjbGFzcz1cXFwieyd3aXRoLXJlc2V0LWJ1dHRvbic6IGNsZWFyQnV0dG9ufVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgOnBsYWNlaG9sZGVyPVxcXCJwbGFjZWhvbGRlclxcXCJcXHJcXG4gICAgICAgIDpzdHlsZT1cXFwie3dpZHRoOndpZHRofVxcXCJcXHJcXG4gICAgICAgIDp2YWx1ZT1cXFwidmFsdWVcXFwiXFxyXFxuICAgICAgICBAY2xpY2s9XFxcImlucHV0Q2xpY2tcXFwiXFxyXFxuICAgICAgICBAaW5wdXQ9XFxcIiRlbWl0KCdpbnB1dCcsJGV2ZW50LnRhcmdldC52YWx1ZSlcXFwiIC8+XFxyXFxuICAgIDxidXR0b24gdi1pZj1cXFwiY2xlYXJCdXR0b24gJiYgdmFsdWVcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcIiRlbWl0KCdpbnB1dCcsICcnKVxcXCI+XFxyXFxuICAgICAgPHNwYW4+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgPC9idXR0b24+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItcG9wdXBcXFwiIHYtc2hvdz1cXFwiZGlzcGxheURheVZpZXdcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItaW5uZXJcXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1ib2R5XFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1jdHJsXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcInByZUJ0bkNsYXNzZXNcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIiBAY2xpY2s9XFxcInByZU5leHRNb250aENsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dE1vbnRoQ2xpY2soMSlcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICA8cCBAY2xpY2s9XFxcInN3aXRjaE1vbnRoVmlld1xcXCI+e3tzdHJpbmdpZnlEYXlIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXdlZWtSYW5nZVxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gdi1mb3I9XFxcIncgaW4gdGV4dC5kYXlzT2ZXZWVrXFxcIj57e3d9fTwvc3Bhbj5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItZGF0ZVJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiB2LWZvcj1cXFwiZCBpbiBkYXRlUmFuZ2VcXFwiIDpjbGFzcz1cXFwiZC5zY2xhc3NcXFwiIEBjbGljaz1cXFwiZGF5U2VsZWN0KGQpXFxcIj57e2QudGV4dH19PC9zcGFuPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgIDwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L2Rpdj5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1wb3B1cFxcXCIgdi1zaG93PVxcXCJkaXNwbGF5TW9udGhWaWV3XFxcIj5cXHJcXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWlubmVyXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItYm9keVxcXCI+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItY3RybFxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJwcmVCdG5DbGFzc2VzXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgQGNsaWNrPVxcXCJwcmVOZXh0WWVhckNsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dFllYXJDbGljaygxKVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxwIEBjbGljaz1cXFwic3dpdGNoRGVjYWRlVmlld1xcXCI+e3tzdHJpbmdpZnlZZWFySGVhZGVyKGN1cnJEYXRlKX19PC9wPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1tb250aFJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XFxcIihtLCBpbmRleCkgaW4gdGV4dC5tb250aHNcXFwiPlxcclxcbiAgICAgICAgICAgICAgPHNwYW4gICA6Y2xhc3M9XFxcInsnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOlxcclxcbiAgICAgICAgICAgICAgICAgICh0ZXh0Lm1vbnRoc1twYXJzZSh2YWx1ZSkuZ2V0TW9udGgoKV0gID09PSBtKSAmJlxcclxcbiAgICAgICAgICAgICAgICAgIGN1cnJEYXRlLmdldEZ1bGxZZWFyKCkgPT09IHBhcnNlKHZhbHVlKS5nZXRGdWxsWWVhcigpfVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICBAY2xpY2s9XFxcIm1vbnRoU2VsZWN0KGluZGV4KVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgPnt7bS5zdWJzdHIoMCwzKX19PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXBvcHVwXFxcIiB2LXNob3c9XFxcImRpc3BsYXlZZWFyVmlld1xcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1pbm5lclxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWJvZHlcXFwiPlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWN0cmxcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwicHJlQnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDEpXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHA+e3tzdHJpbmdpZnlEZWNhZGVIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2UgZGVjYWRlUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiZGVjYWRlIGluIGRlY2FkZVJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwieydkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSc6cGFyc2UodGhpcy52YWx1ZSkuZ2V0RnVsbFllYXIoKSA9PT0gZGVjYWRlLnRleHR9XFxcIlxcclxcbiAgICAgICAgICAgICAgICBAY2xpY2suc3RvcD1cXFwieWVhclNlbGVjdChkZWNhZGUudGV4dClcXFwiXFxyXFxuICAgICAgICAgICAgICA+e3tkZWNhZGUudGV4dH19PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7dHJhbnNsYXRpb25zfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xcclxcbi8vIGltcG9ydCAkIGZyb20gJy4vdXRpbHMvTm9kZUxpc3QuanMnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgdmFsdWU6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBmb3JtYXQ6IHtkZWZhdWx0OiAnTU0vZGQveXl5eSd9LFxcclxcbiAgICBkaXNhYmxlZERheXNPZldlZWs6IHt0eXBlOiBBcnJheSwgZGVmYXVsdCAoKSB7IHJldHVybiBbXSB9fSxcXHJcXG4gICAgd2lkdGg6IHt0eXBlOiBTdHJpbmcvKiwgZGVmYXVsdDogJzIwMHB4JyovfSxcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGxhbmc6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZX0sXFxyXFxuICAgIHBsYWNlaG9sZGVyOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgaWNvbnNGb250OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZ2x5cGhpY29uJ31cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBjdXJyRGF0ZTogbmV3IERhdGUoKSxcXHJcXG4gICAgICBkYXRlUmFuZ2U6IFtdLFxcclxcbiAgICAgIGRlY2FkZVJhbmdlOiBbXSxcXHJcXG4gICAgICBkaXNwbGF5RGF5VmlldzogZmFsc2UsXFxyXFxuICAgICAgZGlzcGxheU1vbnRoVmlldzogZmFsc2UsXFxyXFxuICAgICAgZGlzcGxheVllYXJWaWV3OiBmYWxzZSxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIGN1cnJEYXRlICgpIHtcXHJcXG4gICAgICB0aGlzLmdldERhdGVSYW5nZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIGZvcm1hdCAoKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKSlcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIHRleHQgKCkge1xcclxcbiAgICAgIHJldHVybiB0cmFuc2xhdGlvbnModGhpcy5sYW5nKVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVCdG5DbGFzc2VzICgpIHtcXHJcXG4gICAgICByZXR1cm4gYGRhdGVwaWNrZXItcHJlQnRuICR7dGhpcy5pY29uc0ZvbnR9ICR7dGhpcy5pY29uc0ZvbnR9LWNoZXZyb24tbGVmdGBcXHJcXG4gICAgfSxcXHJcXG4gICAgbmV4dEJ0bkNsYXNzZXMgKCkge1xcclxcbiAgICAgIHJldHVybiBgZGF0ZXBpY2tlci1uZXh0QnRuICR7dGhpcy5pY29uc0ZvbnR9ICR7dGhpcy5pY29uc0ZvbnR9LWNoZXZyb24tcmlnaHRgXFxyXFxuICAgIH0sXFxyXFxuICAgIGRpc2FibGVkRGF5c0FycmF5ICgpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERheXNPZldlZWsubWFwKGQgPT4gcGFyc2VJbnQoZCwgMTApKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBjbG9zZSAoKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRoaXMuZGlzcGxheVllYXJWaWV3ID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgaW5wdXRDbGljayAoKSB7XFxyXFxuICAgICAgdGhpcy5jdXJyRGF0ZSA9IHRoaXMucGFyc2UodGhpcy52YWx1ZSkgfHwgdGhpcy5wYXJzZShuZXcgRGF0ZSgpKVxcclxcbiAgICAgIGlmICh0aGlzLmRpc3BsYXlNb250aFZpZXcgfHwgdGhpcy5kaXNwbGF5WWVhclZpZXcpIHtcXHJcXG4gICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gIXRoaXMuZGlzcGxheURheVZpZXdcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHByZU5leHREZWNhZGVDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKClcXHJcXG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKClcXHJcXG5cXHJcXG4gICAgICBpZiAoZmxhZyA9PT0gMCkge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgLSAxMCwgbW9udGhzLCBkYXRlKVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEwLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0TW9udGhDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICBjb25zdCBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSlcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZShwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aCwgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKVxcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0WWVhckNsaWNrIChmbGFnKSB7XFxyXFxuICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VyckRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICAgIGNvbnN0IG1vbnRocyA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciAtIDEsIG1vbnRocywgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB5ZWFyU2VsZWN0ICh5ZWFyKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgZGF5U2VsZWN0IChkYXkpIHtcXHJcXG4gICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBkYXkuZGF0ZVxcclxcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKSlcXHJcXG4gICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgc3dpdGNoTW9udGhWaWV3ICgpIHtcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIHN3aXRjaERlY2FkZVZpZXcgKCkge1xcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIG1vbnRoU2VsZWN0IChpbmRleCkge1xcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUodGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpLCBpbmRleCwgdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCkpXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldFllYXJNb250aCAoeWVhciwgbW9udGgpIHtcXHJcXG4gICAgICBpZiAobW9udGggPiAxMSkge1xcclxcbiAgICAgICAgeWVhcisrXFxyXFxuICAgICAgICBtb250aCA9IDBcXHJcXG4gICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkge1xcclxcbiAgICAgICAgeWVhci0tXFxyXFxuICAgICAgICBtb250aCA9IDExXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiB7eWVhcjogeWVhciwgbW9udGg6IG1vbnRofVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnlEZWNhZGVIZWFkZXIgKGRhdGUpIHtcXHJcXG4gICAgICBjb25zdCB5ZWFyU3RyID0gZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKClcXHJcXG4gICAgICBjb25zdCBmaXJzdFllYXJPZkRlY2FkZSA9IHllYXJTdHIuc3Vic3RyaW5nKDAsIHllYXJTdHIubGVuZ3RoIC0gMSkgKyAwXFxyXFxuICAgICAgY29uc3QgbGFzdFllYXJPZkRlY2FkZSA9IHBhcnNlSW50KGZpcnN0WWVhck9mRGVjYWRlLCAxMCkgKyAxMFxcclxcbiAgICAgIHJldHVybiBmaXJzdFllYXJPZkRlY2FkZSArICctJyArIGxhc3RZZWFyT2ZEZWNhZGVcXHJcXG4gICAgfSxcXHJcXG4gICAgc3RyaW5naWZ5RGF5SGVhZGVyIChkYXRlKSB7XFxyXFxuICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXSArICcgJyArIGRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJzZU1vbnRoIChkYXRlKSB7XFxyXFxuICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnlZZWFySGVhZGVyIChkYXRlKSB7XFxyXFxuICAgICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnkgKGRhdGUsIGZvcm1hdCA9IHRoaXMuZm9ybWF0KSB7XFxyXFxuICAgICAgaWYgKCFkYXRlKSBkYXRlID0gdGhpcy5wYXJzZSgpXFxyXFxuICAgICAgaWYgKCFkYXRlKSByZXR1cm4gJydcXHJcXG4gICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpXFxyXFxuICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxXFxyXFxuICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKClcXHJcXG4gICAgICBjb25zdCBtb250aE5hbWUgPSB0aGlzLnBhcnNlTW9udGgoZGF0ZSlcXHJcXG5cXHJcXG4gICAgICByZXR1cm4gZm9ybWF0XFxyXFxuICAgICAgLnJlcGxhY2UoL3l5eXkvZywgeWVhcilcXHJcXG4gICAgICAucmVwbGFjZSgvTU1NTS9nLCBtb250aE5hbWUpXFxyXFxuICAgICAgLnJlcGxhY2UoL01NTS9nLCBtb250aE5hbWUuc3Vic3RyaW5nKDAsIDMpKVxcclxcbiAgICAgIC5yZXBsYWNlKC9NTS9nLCAoJzAnICsgbW9udGgpLnNsaWNlKC0yKSlcXHJcXG4gICAgICAucmVwbGFjZSgvZGQvZywgKCcwJyArIGRheSkuc2xpY2UoLTIpKVxcclxcbiAgICAgIC5yZXBsYWNlKC95eS9nLCB5ZWFyKVxcclxcbiAgICAgIC5yZXBsYWNlKC9NKD8hYSkvZywgbW9udGgpXFxyXFxuICAgICAgLnJlcGxhY2UoL2QvZywgZGF5KVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJzZSAoc3RyID0gdGhpcy52YWx1ZSkge1xcclxcbiAgICAgIGxldCBkYXRlXFxyXFxuICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDEwICYmICh0aGlzLmZvcm1hdCA9PT0gJ2RkLU1NLXl5eXknIHx8IHRoaXMuZm9ybWF0ID09PSAnZGQvTU0veXl5eScpKSB7XFxyXFxuICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RyLnN1YnN0cmluZyg2LCAxMCksIHN0ci5zdWJzdHJpbmcoMywgNSktMSwgc3RyLnN1YnN0cmluZygwLCAyKSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHN0cilcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIGlzTmFOKGRhdGUuZ2V0RnVsbFllYXIoKSkgPyBuZXcgRGF0ZSgpIDogZGF0ZVxcclxcbiAgICB9LFxcclxcbiAgICBnZXREYXlDb3VudCAoeWVhciwgbW9udGgpIHtcXHJcXG4gICAgICBjb25zdCBkaWN0ID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdXFxyXFxuICAgICAgaWYgKG1vbnRoID09PSAxKSB7XFxyXFxuICAgICAgICBpZiAoKHllYXIgJSA0MDAgPT09IDApIHx8ICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSkge1xcclxcbiAgICAgICAgICByZXR1cm4gMjlcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIGRpY3RbbW9udGhdXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldERhdGVSYW5nZSAoKSB7XFxyXFxuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIHRoaXMuZGVjYWRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIGNvbnN0IHRpbWUgPSB7XFxyXFxuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksXFxyXFxuICAgICAgICBtb250aDogdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLFxcclxcbiAgICAgICAgZGF5OiB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBjb25zdCB5ZWFyU3RyID0gdGltZS55ZWFyLnRvU3RyaW5nKClcXHJcXG4gICAgICBjb25zdCBmaXJzdFllYXJPZkRlY2FkZSA9ICh5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMCkgLSAxXFxyXFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XFxyXFxuICAgICAgICB0aGlzLmRlY2FkZVJhbmdlLnB1c2goe1xcclxcbiAgICAgICAgICB0ZXh0OiBmaXJzdFllYXJPZkRlY2FkZSArIGlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGNvbnN0IGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCAxKVxcclxcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcXHJcXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XFxyXFxuICAgICAgICBmaXJzdERheVdlZWsgPSA3XFxyXFxuICAgICAgfVxcclxcbiAgICAgIGNvbnN0IGRheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudCh0aW1lLnllYXIsIHRpbWUubW9udGgpXFxyXFxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA+IDEpIHtcXHJcXG4gICAgICAgIGNvbnN0IHByZU1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgodGltZS55ZWFyLCB0aW1lLm1vbnRoIC0gMSlcXHJcXG4gICAgICAgIGNvbnN0IHByZXZNb250aERheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudChwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aClcXHJcXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF5VGV4dCA9IHByZXZNb250aERheUNvdW50IC0gZmlyc3REYXlXZWVrICsgaSArIDFcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXlUZXh0KVxcclxcbiAgICAgICAgICBsZXQgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1ncmF5J1xcclxcbiAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcXHJcXG4gICAgICAgICAgICBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUnXFxyXFxuICAgICAgICAgIH1cXHJcXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XFxyXFxuICAgICAgICAgICAgdGV4dDogZGF5VGV4dCxcXHJcXG4gICAgICAgICAgICBkYXRlOiBkYXRlLFxcclxcbiAgICAgICAgICAgIHNjbGFzczogJ2RhdGVwaWNrZXItaXRlbS1ncmF5J1xcclxcbiAgICAgICAgICB9KVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkYXlDb3VudDsgaSsrKSB7XFxyXFxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCBpKVxcclxcbiAgICAgICAgbGV0IHNjbGFzcyA9ICcnXFxyXFxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcXHJcXG4gICAgICAgICAgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJ1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgaWYgKGkgPT0gdGltZS5kYXkgJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09IHRpbWUueWVhciAmJiBkYXRlLmdldE1vbnRoKCkgPT0gdGltZS5tb250aCl7XFxyXFxuICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSdcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xcclxcbiAgICAgICAgICB0ZXh0OiBpLFxcclxcbiAgICAgICAgICBkYXRlOiBkYXRlLFxcclxcbiAgICAgICAgICBzY2xhc3M6IHNjbGFzc1xcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICB9XFxyXFxuXFxyXFxuICAgICAgaWYgKHRoaXMuZGF0ZVJhbmdlLmxlbmd0aCA8IDQyKSB7XFxyXFxuICAgICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcXHJcXG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCArIDEpXFxyXFxuXFxyXFxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuZXh0TW9udGhOZWVkOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXFxyXFxuICAgICAgICAgIGxldCBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWdyYXknXFxyXFxuICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMSkge1xcclxcbiAgICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSdcXHJcXG4gICAgICAgICAgfVxcclxcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcXHJcXG4gICAgICAgICAgICB0ZXh0OiBpLFxcclxcbiAgICAgICAgICAgIGRhdGU6IGRhdGUsXFxyXFxuICAgICAgICAgICAgc2NsYXNzOiBzY2xhc3NcXHJcXG4gICAgICAgICAgfSlcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgbGV0IGVsID0gdGhpcy4kZWxcXHJcXG4gICAgdGhpcy5fYmx1ciA9IGUgPT4ge1xcclxcbiAgICAgIGlmICghZWwuY29udGFpbnMoZS50YXJnZXQpKVxcclxcbiAgICAgICAgdGhpcy5jbG9zZSgpXFxyXFxuICAgIH1cXHJcXG4gICAgdGhpcy4kZW1pdCgnY2hpbGQtY3JlYXRlZCcsIHRoaXMpXFxyXFxuICAgIHRoaXMuY3VyckRhdGUgPSB0aGlzLnBhcnNlKHRoaXMudmFsdWUpIHx8IHRoaXMucGFyc2UobmV3IERhdGUoKSlcXHJcXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XFxyXFxuICB9LFxcclxcbiAgYmVmb3JlRGVzdHJveSAoKSB7XFxyXFxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JsdXIpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uZGF0ZXBpY2tlciB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxufVxcclxcbmlucHV0LmRhdGVwaWNrZXItaW5wdXQud2l0aC1yZXNldC1idXR0b24ge1xcclxcbiAgcGFkZGluZy1yaWdodDogMjVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2U6Zm9jdXMge1xcclxcbiAgb3BhY2l0eTogLjI7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXBvcHVwIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgbWFyZ2luLXRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwMDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLDAsMCwwLjE3NSk7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWlubmVyIHtcXHJcXG4gIHdpZHRoOiAyMThweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItYm9keSB7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHdpZHRoOiAyOHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI4cHg7XFxyXFxuICBoZWlnaHQ6IDI4cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCB7XFxyXFxuICB3aWR0aDogNjUlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1ib2R5IHNwYW4ge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4ge1xcclxcbiAgd2lkdGg6IDQ4cHg7XFxyXFxuICBoZWlnaHQ6IDUwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogNDVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItaXRlbS1kaXNhYmxlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG4gIGN1cnNvcjogbm90LWFsbG93ZWQhaW1wb3J0YW50O1xcclxcbn1cXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpmaXJzdC1jaGlsZCxcXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpsYXN0LWNoaWxkLFxcclxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWdyYXkge1xcclxcbiAgY29sb3I6ICM5OTk7XFxyXFxufVxcclxcblxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZTpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUge1xcclxcbiAgYmFja2dyb3VuZDogcmdiKDUwLCAxMTgsIDE3NykhaW1wb3J0YW50O1xcclxcbiAgY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAxMHB4XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3BhbixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBwLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcDpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIGk6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlIHNwYW46aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0taG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvciA6ICNlZWVlZWU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXdlZWtSYW5nZSBzcGFuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1sYWJlbCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXHJcXG4gIHBhZGRpbmc6IDdweCAwO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGhlaWdodDogMzBweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5tb250aC1idG4ge1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbW96LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbXMtdXNlci1zZWxlY3Q6bm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0Om5vbmU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXByZUJ0biB7XFxyXFxuICBsZWZ0OiAycHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW5leHRCdG4ge1xcclxcbiAgcmlnaHQ6IDJweDtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDEwMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHQvLyBpbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICB2YWx1ZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGZvcm1hdDogeyBkZWZhdWx0OiAnTU0vZGQveXl5eScgfSxcblx0ICAgIGRpc2FibGVkRGF5c09mV2VlazogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG5cdCAgICAgICAgcmV0dXJuIFtdO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgd2lkdGg6IHsgdHlwZTogU3RyaW5nIC8qLCBkZWZhdWx0OiAnMjAwcHgnKi8gfSxcblx0ICAgIGNsZWFyQnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBsYW5nOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbmF2aWdhdG9yLmxhbmd1YWdlIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGljb25zRm9udDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdnbHlwaGljb24nIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjdXJyRGF0ZTogbmV3IERhdGUoKSxcblx0ICAgICAgZGF0ZVJhbmdlOiBbXSxcblx0ICAgICAgZGVjYWRlUmFuZ2U6IFtdLFxuXHQgICAgICBkaXNwbGF5RGF5VmlldzogZmFsc2UsXG5cdCAgICAgIGRpc3BsYXlNb250aFZpZXc6IGZhbHNlLFxuXHQgICAgICBkaXNwbGF5WWVhclZpZXc6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBjdXJyRGF0ZTogZnVuY3Rpb24gY3VyckRhdGUoKSB7XG5cdCAgICAgIHRoaXMuZ2V0RGF0ZVJhbmdlKCk7XG5cdCAgICB9LFxuXHQgICAgZm9ybWF0OiBmdW5jdGlvbiBmb3JtYXQoKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdGhpcy5zdHJpbmdpZnkodGhpcy5jdXJyRGF0ZSkpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHRleHQ6IGZ1bmN0aW9uIHRleHQoKSB7XG5cdCAgICAgIHJldHVybiAoMCwgX3V0aWxzLnRyYW5zbGF0aW9ucykodGhpcy5sYW5nKTtcblx0ICAgIH0sXG5cdCAgICBwcmVCdG5DbGFzc2VzOiBmdW5jdGlvbiBwcmVCdG5DbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gJ2RhdGVwaWNrZXItcHJlQnRuICcgKyB0aGlzLmljb25zRm9udCArICcgJyArIHRoaXMuaWNvbnNGb250ICsgJy1jaGV2cm9uLWxlZnQnO1xuXHQgICAgfSxcblx0ICAgIG5leHRCdG5DbGFzc2VzOiBmdW5jdGlvbiBuZXh0QnRuQ2xhc3NlcygpIHtcblx0ICAgICAgcmV0dXJuICdkYXRlcGlja2VyLW5leHRCdG4gJyArIHRoaXMuaWNvbnNGb250ICsgJyAnICsgdGhpcy5pY29uc0ZvbnQgKyAnLWNoZXZyb24tcmlnaHQnO1xuXHQgICAgfSxcblx0ICAgIGRpc2FibGVkRGF5c0FycmF5OiBmdW5jdGlvbiBkaXNhYmxlZERheXNBcnJheSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWREYXlzT2ZXZWVrLm1hcChmdW5jdGlvbiAoZCkge1xuXHQgICAgICAgIHJldHVybiBwYXJzZUludChkLCAxMCk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZTtcblx0ICAgIH0sXG5cdCAgICBpbnB1dENsaWNrOiBmdW5jdGlvbiBpbnB1dENsaWNrKCkge1xuXHQgICAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbHVlKSB8fCB0aGlzLnBhcnNlKG5ldyBEYXRlKCkpO1xuXHQgICAgICBpZiAodGhpcy5kaXNwbGF5TW9udGhWaWV3IHx8IHRoaXMuZGlzcGxheVllYXJWaWV3KSB7XG5cdCAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSAhdGhpcy5kaXNwbGF5RGF5Vmlldztcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHREZWNhZGVDbGljazogZnVuY3Rpb24gcHJlTmV4dERlY2FkZUNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMTAsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxMCwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHRNb250aENsaWNrOiBmdW5jdGlvbiBwcmVOZXh0TW9udGhDbGljayhmbGFnKSB7XG5cdCAgICAgIHZhciB5ZWFyID0gdGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgICB2YXIgbW9udGggPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHZhciBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSk7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB2YXIgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKTtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwcmVOZXh0WWVhckNsaWNrOiBmdW5jdGlvbiBwcmVOZXh0WWVhckNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMSwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB5ZWFyU2VsZWN0OiBmdW5jdGlvbiB5ZWFyU2VsZWN0KHllYXIpIHtcblx0ICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIsIHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKSwgdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCkpO1xuXHQgICAgfSxcblx0ICAgIGRheVNlbGVjdDogZnVuY3Rpb24gZGF5U2VsZWN0KGRheSkge1xuXHQgICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gZGF5LmRhdGU7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKSk7XG5cdCAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc3dpdGNoTW9udGhWaWV3OiBmdW5jdGlvbiBzd2l0Y2hNb250aFZpZXcoKSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdHJ1ZTtcblx0ICAgIH0sXG5cdCAgICBzd2l0Y2hEZWNhZGVWaWV3OiBmdW5jdGlvbiBzd2l0Y2hEZWNhZGVWaWV3KCkge1xuXHQgICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSB0cnVlO1xuXHQgICAgfSxcblx0ICAgIG1vbnRoU2VsZWN0OiBmdW5jdGlvbiBtb250aFNlbGVjdChpbmRleCkge1xuXHQgICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IHRydWU7XG5cdCAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksIGluZGV4LCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSk7XG5cdCAgICB9LFxuXHQgICAgZ2V0WWVhck1vbnRoOiBmdW5jdGlvbiBnZXRZZWFyTW9udGgoeWVhciwgbW9udGgpIHtcblx0ICAgICAgaWYgKG1vbnRoID4gMTEpIHtcblx0ICAgICAgICB5ZWFyKys7XG5cdCAgICAgICAgbW9udGggPSAwO1xuXHQgICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkge1xuXHQgICAgICAgIHllYXItLTtcblx0ICAgICAgICBtb250aCA9IDExO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB7IHllYXI6IHllYXIsIG1vbnRoOiBtb250aCB9O1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeURlY2FkZUhlYWRlcjogZnVuY3Rpb24gc3RyaW5naWZ5RGVjYWRlSGVhZGVyKGRhdGUpIHtcblx0ICAgICAgdmFyIHllYXJTdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcblx0ICAgICAgdmFyIGZpcnN0WWVhck9mRGVjYWRlID0geWVhclN0ci5zdWJzdHJpbmcoMCwgeWVhclN0ci5sZW5ndGggLSAxKSArIDA7XG5cdCAgICAgIHZhciBsYXN0WWVhck9mRGVjYWRlID0gcGFyc2VJbnQoZmlyc3RZZWFyT2ZEZWNhZGUsIDEwKSArIDEwO1xuXHQgICAgICByZXR1cm4gZmlyc3RZZWFyT2ZEZWNhZGUgKyAnLScgKyBsYXN0WWVhck9mRGVjYWRlO1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeURheUhlYWRlcjogZnVuY3Rpb24gc3RyaW5naWZ5RGF5SGVhZGVyKGRhdGUpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXSArICcgJyArIGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0ICAgIH0sXG5cdCAgICBwYXJzZU1vbnRoOiBmdW5jdGlvbiBwYXJzZU1vbnRoKGRhdGUpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXTtcblx0ICAgIH0sXG5cdCAgICBzdHJpbmdpZnlZZWFySGVhZGVyOiBmdW5jdGlvbiBzdHJpbmdpZnlZZWFySGVhZGVyKGRhdGUpIHtcblx0ICAgICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0ICAgIH0sXG5cdCAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShkYXRlKSB7XG5cdCAgICAgIHZhciBmb3JtYXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRoaXMuZm9ybWF0O1xuXHRcblx0ICAgICAgaWYgKCFkYXRlKSBkYXRlID0gdGhpcy5wYXJzZSgpO1xuXHQgICAgICBpZiAoIWRhdGUpIHJldHVybiAnJztcblx0ICAgICAgdmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XG5cdCAgICAgIHZhciBkYXkgPSBkYXRlLmdldERhdGUoKTtcblx0ICAgICAgdmFyIG1vbnRoTmFtZSA9IHRoaXMucGFyc2VNb250aChkYXRlKTtcblx0XG5cdCAgICAgIHJldHVybiBmb3JtYXQucmVwbGFjZSgveXl5eS9nLCB5ZWFyKS5yZXBsYWNlKC9NTU1NL2csIG1vbnRoTmFtZSkucmVwbGFjZSgvTU1NL2csIG1vbnRoTmFtZS5zdWJzdHJpbmcoMCwgMykpLnJlcGxhY2UoL01NL2csICgnMCcgKyBtb250aCkuc2xpY2UoLTIpKS5yZXBsYWNlKC9kZC9nLCAoJzAnICsgZGF5KS5zbGljZSgtMikpLnJlcGxhY2UoL3l5L2csIHllYXIpLnJlcGxhY2UoL00oPyFhKS9nLCBtb250aCkucmVwbGFjZSgvZC9nLCBkYXkpO1xuXHQgICAgfSxcblx0ICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZSgpIHtcblx0ICAgICAgdmFyIHN0ciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy52YWx1ZTtcblx0XG5cdCAgICAgIHZhciBkYXRlID0gdm9pZCAwO1xuXHQgICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMTAgJiYgKHRoaXMuZm9ybWF0ID09PSAnZGQtTU0teXl5eScgfHwgdGhpcy5mb3JtYXQgPT09ICdkZC9NTS95eXl5JykpIHtcblx0ICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RyLnN1YnN0cmluZyg2LCAxMCksIHN0ci5zdWJzdHJpbmcoMywgNSkgLSAxLCBzdHIuc3Vic3RyaW5nKDAsIDIpKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RyKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gaXNOYU4oZGF0ZS5nZXRGdWxsWWVhcigpKSA/IG5ldyBEYXRlKCkgOiBkYXRlO1xuXHQgICAgfSxcblx0ICAgIGdldERheUNvdW50OiBmdW5jdGlvbiBnZXREYXlDb3VudCh5ZWFyLCBtb250aCkge1xuXHQgICAgICB2YXIgZGljdCA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcblx0ICAgICAgaWYgKG1vbnRoID09PSAxKSB7XG5cdCAgICAgICAgaWYgKHllYXIgJSA0MDAgPT09IDAgfHwgeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCkge1xuXHQgICAgICAgICAgcmV0dXJuIDI5O1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gZGljdFttb250aF07XG5cdCAgICB9LFxuXHQgICAgZ2V0RGF0ZVJhbmdlOiBmdW5jdGlvbiBnZXREYXRlUmFuZ2UoKSB7XG5cdCAgICAgIHRoaXMuZGF0ZVJhbmdlID0gW107XG5cdCAgICAgIHRoaXMuZGVjYWRlUmFuZ2UgPSBbXTtcblx0ICAgICAgdmFyIHRpbWUgPSB7XG5cdCAgICAgICAgeWVhcjogdGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpLFxuXHQgICAgICAgIG1vbnRoOiB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCksXG5cdCAgICAgICAgZGF5OiB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxuXHQgICAgICB9O1xuXHQgICAgICB2YXIgeWVhclN0ciA9IHRpbWUueWVhci50b1N0cmluZygpO1xuXHQgICAgICB2YXIgZmlyc3RZZWFyT2ZEZWNhZGUgPSB5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMCAtIDE7XG5cdCAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTI7IGkrKykge1xuXHQgICAgICAgIHRoaXMuZGVjYWRlUmFuZ2UucHVzaCh7XG5cdCAgICAgICAgICB0ZXh0OiBmaXJzdFllYXJPZkRlY2FkZSArIGlcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCAxKTtcblx0ICAgICAgdmFyIGZpcnN0RGF5V2VlayA9IGN1cnJNb250aEZpcnN0RGF5LmdldERheSgpICsgMTtcblx0ICAgICAgaWYgKGZpcnN0RGF5V2VlayA9PT0gMCkge1xuXHQgICAgICAgIGZpcnN0RGF5V2VlayA9IDc7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIGRheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudCh0aW1lLnllYXIsIHRpbWUubW9udGgpO1xuXHQgICAgICBpZiAoZmlyc3REYXlXZWVrID4gMSkge1xuXHQgICAgICAgIHZhciBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCAtIDEpO1xuXHQgICAgICAgIHZhciBwcmV2TW9udGhEYXlDb3VudCA9IHRoaXMuZ2V0RGF5Q291bnQocHJlTW9udGgueWVhciwgcHJlTW9udGgubW9udGgpO1xuXHQgICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBmaXJzdERheVdlZWs7IF9pKyspIHtcblx0ICAgICAgICAgIHZhciBkYXlUZXh0ID0gcHJldk1vbnRoRGF5Q291bnQgLSBmaXJzdERheVdlZWsgKyBfaSArIDE7XG5cdCAgICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXlUZXh0KTtcblx0ICAgICAgICAgIHZhciBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWdyYXknO1xuXHQgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWREYXlzQXJyYXkuaW5kZXhPZihkYXRlLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSc7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcblx0ICAgICAgICAgICAgdGV4dDogZGF5VGV4dCxcblx0ICAgICAgICAgICAgZGF0ZTogZGF0ZSxcblx0ICAgICAgICAgICAgc2NsYXNzOiAnZGF0ZXBpY2tlci1pdGVtLWdyYXknXG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIF9pMiA9IDE7IF9pMiA8PSBkYXlDb3VudDsgX2kyKyspIHtcblx0ICAgICAgICB2YXIgX2RhdGUgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIF9pMik7XG5cdCAgICAgICAgdmFyIF9zY2xhc3MgPSAnJztcblx0ICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKF9kYXRlLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICBfc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKF9pMiA9PSB0aW1lLmRheSAmJiBfZGF0ZS5nZXRGdWxsWWVhcigpID09IHRpbWUueWVhciAmJiBfZGF0ZS5nZXRNb250aCgpID09IHRpbWUubW9udGgpIHtcblx0ICAgICAgICAgIF9zY2xhc3MgPSAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcblx0ICAgICAgICAgIHRleHQ6IF9pMixcblx0ICAgICAgICAgIGRhdGU6IF9kYXRlLFxuXHQgICAgICAgICAgc2NsYXNzOiBfc2NsYXNzXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGlmICh0aGlzLmRhdGVSYW5nZS5sZW5ndGggPCA0Mikge1xuXHQgICAgICAgIHZhciBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGg7XG5cdCAgICAgICAgdmFyIG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCArIDEpO1xuXHRcblx0ICAgICAgICBmb3IgKHZhciBfaTMgPSAxOyBfaTMgPD0gbmV4dE1vbnRoTmVlZDsgX2kzKyspIHtcblx0ICAgICAgICAgIHZhciBfZGF0ZTIgPSBuZXcgRGF0ZShuZXh0TW9udGgueWVhciwgbmV4dE1vbnRoLm1vbnRoLCBfaTMpO1xuXHQgICAgICAgICAgdmFyIF9zY2xhc3MyID0gJ2RhdGVwaWNrZXItaXRlbS1ncmF5Jztcblx0ICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoX2RhdGUyLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICAgIF9zY2xhc3MyID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuXHQgICAgICAgICAgICB0ZXh0OiBfaTMsXG5cdCAgICAgICAgICAgIGRhdGU6IF9kYXRlMixcblx0ICAgICAgICAgICAgc2NsYXNzOiBfc2NsYXNzMlxuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICB2YXIgZWwgPSB0aGlzLiRlbDtcblx0ICAgIHRoaXMuX2JsdXIgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBpZiAoIWVsLmNvbnRhaW5zKGUudGFyZ2V0KSkgX3RoaXMuY2xvc2UoKTtcblx0ICAgIH07XG5cdCAgICB0aGlzLiRlbWl0KCdjaGlsZC1jcmVhdGVkJywgdGhpcyk7XG5cdCAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbHVlKSB8fCB0aGlzLnBhcnNlKG5ldyBEYXRlKCkpO1xuXHQgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTA0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sIGRhdGVwaWNrZXItaW5wdXRcIixcblx0ICAgIGNsYXNzOiB7XG5cdCAgICAgICd3aXRoLXJlc2V0LWJ1dHRvbic6IF92bS5jbGVhckJ1dHRvblxuXHQgICAgfSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLndpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInRleHRcIixcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0ucGxhY2Vob2xkZXJcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS52YWx1ZVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmlucHV0Q2xpY2ssXG5cdCAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLiRlbWl0KCdpbnB1dCcsICRldmVudC50YXJnZXQudmFsdWUpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgKF92bS5jbGVhckJ1dHRvbiAmJiBfdm0udmFsdWUpID8gX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS4kZW1pdCgnaW5wdXQnLCAnJylcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCBbX3ZtLl92KFwiw5dcIildKV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmRpc3BsYXlEYXlWaWV3KSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJkaXNwbGF5RGF5Vmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRNb250aENsaWNrKDApXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5uZXh0QnRuQ2xhc3Nlcyxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5wcmVOZXh0TW9udGhDbGljaygxKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygncCcsIHtcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLnN3aXRjaE1vbnRoVmlld1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5zdHJpbmdpZnlEYXlIZWFkZXIoX3ZtLmN1cnJEYXRlKSkpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLXdlZWtSYW5nZVwiXG5cdCAgfSwgX3ZtLl9sKChfdm0udGV4dC5kYXlzT2ZXZWVrKSwgZnVuY3Rpb24odykge1xuXHQgICAgcmV0dXJuIF92bS5fYygnc3BhbicsIFtfdm0uX3YoX3ZtLl9zKHcpKV0pXG5cdCAgfSkpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItZGF0ZVJhbmdlXCJcblx0ICB9LCBfdm0uX2woKF92bS5kYXRlUmFuZ2UpLCBmdW5jdGlvbihkKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgICBjbGFzczogZC5zY2xhc3MsXG5cdCAgICAgIG9uOiB7XG5cdCAgICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAgIF92bS5kYXlTZWxlY3QoZClcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX3YoX3ZtLl9zKGQudGV4dCkpXSlcblx0ICB9KSldKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmRpc3BsYXlNb250aFZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlNb250aFZpZXdcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLXBvcHVwXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLWlubmVyXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLWJvZHlcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItY3RybFwiXG5cdCAgfSwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBfdm0ucHJlQnRuQ2xhc3Nlcyxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5wcmVOZXh0WWVhckNsaWNrKDApXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5uZXh0QnRuQ2xhc3Nlcyxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5wcmVOZXh0WWVhckNsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywge1xuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uc3dpdGNoRGVjYWRlVmlld1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5zdHJpbmdpZnlZZWFySGVhZGVyKF92bS5jdXJyRGF0ZSkpKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1tb250aFJhbmdlXCJcblx0ICB9LCBbX3ZtLl9sKChfdm0udGV4dC5tb250aHMpLCBmdW5jdGlvbihtLCBpbmRleCkge1xuXHQgICAgcmV0dXJuIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGNsYXNzOiB7XG5cdCAgICAgICAgJ2RhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0tYWN0aXZlJzpcblx0ICAgICAgICAoX3ZtLnRleHQubW9udGhzW192bS5wYXJzZShfdm0udmFsdWUpLmdldE1vbnRoKCldID09PSBtKSAmJlxuXHQgICAgICAgIF92bS5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpID09PSBfdm0ucGFyc2UoX3ZtLnZhbHVlKS5nZXRGdWxsWWVhcigpXG5cdCAgICAgIH0sXG5cdCAgICAgIG9uOiB7XG5cdCAgICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAgIF92bS5tb250aFNlbGVjdChpbmRleClcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX3YoX3ZtLl9zKG0uc3Vic3RyKDAsIDMpKSldKV1cblx0ICB9KV0sIDIpXSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5kaXNwbGF5WWVhclZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlZZWFyVmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHREZWNhZGVDbGljaygwKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBfdm0ubmV4dEJ0bkNsYXNzZXMsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0ucHJlTmV4dERlY2FkZUNsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeURlY2FkZUhlYWRlcihfdm0uY3VyckRhdGUpKSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItbW9udGhSYW5nZSBkZWNhZGVSYW5nZVwiXG5cdCAgfSwgW192bS5fbCgoX3ZtLmRlY2FkZVJhbmdlKSwgZnVuY3Rpb24oZGVjYWRlKSB7XG5cdCAgICByZXR1cm4gW192bS5fYygnc3BhbicsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOiBfdm0ucGFyc2UodGhpcy52YWx1ZSkuZ2V0RnVsbFllYXIoKSA9PT0gZGVjYWRlLnRleHRcblx0ICAgICAgfSxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICAgX3ZtLnllYXJTZWxlY3QoZGVjYWRlLnRleHQpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl92KF92bS5fcyhkZWNhZGUudGV4dCkpXSldXG5cdCAgfSldLCAyKV0pXSldKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTQ3N2I4ZTVkXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTA1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcRHJvcGRvd24udnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTM5YmUxMDcyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zOWJlMTA3MlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIERyb3Bkb3duLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEwNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KTtcblx0XG5cdHZhciBfQ2xpY2tPdXRzaWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsaWNrT3V0c2lkZSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBkaXJlY3RpdmVzOiB7XG5cdCAgICBDbGlja091dHNpZGU6IF9DbGlja091dHNpZGUyLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2l6ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2RlZmF1bHQnIH0sXG5cdCAgICB2YWx1ZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIHNob3cgPSB0aGlzLnZhbHVlO1xuXHQgICAgcmV0dXJuIHsgc2hvdzogc2hvdyB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KHZhbCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICB0aGlzLnNob3cgPSB2YWw7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYnV0dG9uU2l6ZTogZnVuY3Rpb24gYnV0dG9uU2l6ZSgpIHtcblx0ICAgICAgcmV0dXJuIH5bJ2xnJywgJ3NtJywgJ3hzJ10uaW5kZXhPZih0aGlzLnNpemUpID8gJ2J0bi0nICsgdGhpcy5zaXplIDogJyc7XG5cdCAgICB9LFxuXHQgICAgaW5JbnB1dDogZnVuY3Rpb24gaW5JbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgaXNMaTogZnVuY3Rpb24gaXNMaSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faXNUYWJzIHx8IHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51O1xuXHQgICAgfSxcblx0ICAgIG1lbnU6IGZ1bmN0aW9uIG1lbnUoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy4kcGFyZW50IHx8IHRoaXMuJHBhcmVudC5uYXZiYXI7XG5cdCAgICB9LFxuXHQgICAgc2xvdHM6IGZ1bmN0aW9uIHNsb3RzKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc2xvdENvbnRlbnRzO1xuXHQgICAgfSxcblx0ICAgIHN1Ym1lbnU6IGZ1bmN0aW9uIHN1Ym1lbnUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQgJiYgKHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5zdWJtZW51KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcblx0ICAgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgndWwnLCB0aGlzLiRlbCkub24oJ2NsaWNrJywgJ2xpPmEnLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBfdGhpcy5zaG93ID0gZmFsc2U7XG5cdCAgICB9KTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgndWwnLCB0aGlzLiRlbCkub2ZmKCk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTA3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoX3ZtLmlzTGkgPyAnbGknIDogJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwiY2xpY2stb3V0c2lkZVwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtY2xpY2stb3V0c2lkZVwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5ibHVyKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJibHVyXCJcblx0ICAgIH1dLFxuXHQgICAgdGFnOiBcImRpdlwiLFxuXHQgICAgY2xhc3M6IFt7XG5cdCAgICAgIG9wZW46IF92bS5zaG93LFxuXHQgICAgICBkaXNhYmxlZDogX3ZtLmRpc2FibGVkLFxuXHQgICAgICBkcm9wZG93bjogX3ZtLmlzTGksXG5cdCAgICAgICdpbnB1dC1ncm91cC1idG4nOiBfdm0uaW5JbnB1dCxcblx0ICAgICAgJ2J0bi1ncm91cCc6ICFfdm0uaXNMaSAmJiAhX3ZtLmluSW5wdXRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fdChcImJlZm9yZVwiKSwgX3ZtLl92KFwiIFwiKSwgKF92bS5pc0xpKSA/IF92bS5fYygnYScsIHtcblx0ICAgIGNsYXNzOiBbJ2Ryb3Bkb3duLXRvZ2dsZScsIF92bS5idXR0b25TaXplLCB7XG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWRcblx0ICAgIH1dLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZXNjXCIsIDI3KSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0uc2hvdyA9IGZhbHNlXG5cdCAgICAgIH0sXG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgkZXZlbnQpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiYnV0dG9uXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50ZXh0KSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2FyZXRcIlxuXHQgIH0pXSwgMikgOiBfdm0uX2MoJ2J1dHRvbicsIHtcblx0ICAgIGNsYXNzOiBbJ2J0biBidG4tJyArIF92bS50eXBlLCBfdm0uYnV0dG9uU2l6ZSwgJ2Ryb3Bkb3duLXRvZ2dsZSddLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCIsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnNob3cgPSBmYWxzZVxuXHQgICAgICB9LFxuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS50b2dnbGUoJGV2ZW50KVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImJ1dHRvblwiLCBbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNhcmV0XCJcblx0ICB9KV0sIDIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkcm9wZG93bi1tZW51XCIsIFtfdm0uX2MoJ3VsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZHJvcGRvd24tbWVudVwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzliZTEwNzJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTA5KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxGb3JtR3JvdXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTc5ZWI0MDBhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi03OWViNDAwYVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEZvcm1Hcm91cC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvLyBsZXQgY29lcmNlID0ge1xuXHQvLyAgICAgZW50ZXJTdWJtaXQ6ICdib29sZWFuJyxcblx0Ly8gICAgIGljb246ICdib29sZWFuJ1xuXHQvLyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGVudGVyU3VibWl0OiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IGZhbHNlXG5cdCAgICB9LFxuXHQgICAgaWNvbjoge1xuXHQgICAgICB0eXBlOiBCb29sZWFuLFxuXHQgICAgICBkZWZhdWx0OiBmYWxzZVxuXHQgICAgfSxcblx0ICAgIGxhbmc6IHtcblx0ICAgICAgdHlwZTogU3RyaW5nLFxuXHQgICAgICBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2Vcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjaGlsZHJlbjogW10sXG5cdCAgICAgIHZhbGlkOiBudWxsLFxuXHQgICAgICB0aW1lb3V0OiBudWxsXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQgJiYgdGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgdmFyIHZhbGlkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jaGlsZHJlbi5zb21lKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHZhciB2ID0gZWwudmFsaWRhdGUgPyBlbC52YWxpZGF0ZSgpIDogZWwudmFsaWQgIT09IHVuZGVmaW5lZCA/IGVsLnZhbGlkIDogZWwucmVxdWlyZWQgJiYgIX5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZihlbC52YWx1ZSk7XG5cdCAgICAgICAgaWYgKCF2KSB2YWxpZCA9IGZhbHNlO1xuXHQgICAgICAgIHJldHVybiAhdmFsaWQ7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLnZhbGlkID0gdmFsaWQ7XG5cdCAgICAgIHJldHVybiB2YWxpZCA9PT0gdHJ1ZTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9mb3JtR3JvdXAgPSB0cnVlO1xuXHQgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcblx0ICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5fZm9ybUdyb3VwKSB7XG5cdCAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuXHQgICAgfVxuXHQgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuX2Zvcm1Hcm91cCkge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHRoaXMudmFsaWRhdGUoKTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxMTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnc3BhbicsIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNzllYjQwMGFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxGb3JtVmFsaWRhdG9yLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1iOWY1N2M0NlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtYjlmNTdjNDZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBGb3JtVmFsaWRhdG9yLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDExMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZW50ZXJTdWJtaXQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGljb246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2UgfSxcblx0ICAgIHZhbHVlOiBudWxsXG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY2hpbGRyZW46IFtdLFxuXHQgICAgICB2YWxpZDogbnVsbCxcblx0ICAgICAgdGltZW91dDogbnVsbFxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICB3YXRjaDoge1xuXHQgICAgdmFsaWQ6IGZ1bmN0aW9uIHZhbGlkKHZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lzdmFsaWQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQgJiYgdGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgdmFyIGludmFsaWQgPSAhdGhpcy5jaGlsZHJlbi5ldmVyeShmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwudmFsaWRhdGUgPyBlbC52YWxpZGF0ZSgpIDogZWwudmFsaWQgIT09IHVuZGVmaW5lZCA/IGVsLnZhbGlkIDogZWwucmVxdWlyZWQgJiYgIX5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZihlbC52YWx1ZSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLnZhbGlkID0gIWludmFsaWQ7XG5cdCAgICAgIHJldHVybiAhaW52YWxpZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9mb3JtVmFsaWRhdG9yID0gdHJ1ZTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHRoaXMudmFsaWRhdGUoKTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxMTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnc3BhbicsIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtYjlmNTdjNDZcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTE1KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTE3KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExOClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxJbnB1dC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdF9fdnVlX29wdGlvbnNfXy5fc2NvcGVJZCA9IFwiZGF0YS12LTY1MmFkN2I5XCJcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi02NTJhZDdiOVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNjUyYWQ3YjlcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBJbnB1dC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMTUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExNik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjUyYWQ3Yjkmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0lucHV0LnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjUyYWQ3Yjkmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0lucHV0LnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDExNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZm9ybS1ncm91cFtkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxubGFiZWx+LmNsb3NlW2RhdGEtdi02NTJhZDdiOV0ge1xcclxcbiAgdG9wOiAyNXB4O1xcbn1cXG4uaW5wdXQtZ3JvdXA+Lmljb25bZGF0YS12LTY1MmFkN2I5XSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcclxcbiAgd2lkdGg6MDtcXHJcXG4gIHotaW5kZXg6IDM7XFxufVxcbi5jbG9zZVtkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmhhcy1mZWVkYmFjayAuY2xvc2VbZGF0YS12LTY1MmFkN2I5XSB7XFxyXFxuICByaWdodDogMjBweDtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9JbnB1dC52dWU/MmM1NTRkM2RcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTBRQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFVBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFQUNBLFFBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsT0FBQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxZQUFBO0NBQ0FcIixcImZpbGVcIjpcIklucHV0LnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIiA6Y2xhc3M9XFxcInt2YWxpZGF0ZTpjYW5WYWxpZGF0ZSwnaGFzLWZlZWRiYWNrJzppY29uLCdoYXMtZXJyb3InOmNhblZhbGlkYXRlJiZ2YWxpZD09PWZhbHNlLCdoYXMtc3VjY2Vzcyc6Y2FuVmFsaWRhdGUmJnZhbGlkfVxcXCI+XFxyXFxuICAgIDxzbG90IG5hbWU9XFxcImxhYmVsXFxcIj48bGFiZWwgdi1pZj1cXFwibGFiZWxcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIiBAY2xpY2s9XFxcImZvY3VzXFxcIj57e2xhYmVsfX08L2xhYmVsPjwvc2xvdD5cXHJcXG4gICAgPGRpdiB2LWlmPVxcXCIkc2xvdHMuYmVmb3JlfHwkc2xvdHMuYWZ0ZXJcXFwiIGNsYXNzPVxcXCJpbnB1dC1ncm91cFxcXCI+XFxyXFxuICAgICAgPHNsb3QgbmFtZT1cXFwiYmVmb3JlXFxcIj48L3Nsb3Q+XFxyXFxuICAgICAgPHRleHRhcmVhIDppcz1cXFwidHlwZT09J3RleHRhcmVhJz90eXBlOidpbnB1dCdcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICA6Y29scz1cXFwiY29sc1xcXCJcXHJcXG4gICAgICAgIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiXFxyXFxuICAgICAgICA6bGlzdD1cXFwiaWRfZGF0YWxpc3RcXFwiXFxyXFxuICAgICAgICA6bWF4PVxcXCJhdHRyKG1heClcXFwiXFxyXFxuICAgICAgICA6bWF4bGVuZ3RoPVxcXCJtYXhsZW5ndGhcXFwiXFxyXFxuICAgICAgICA6bWluPVxcXCJhdHRyKG1pbilcXFwiXFxyXFxuICAgICAgICA6bmFtZT1cXFwibmFtZVxcXCJcXHJcXG4gICAgICAgIDpwbGFjZWhvbGRlcj1cXFwicGxhY2Vob2xkZXJcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOnJlcXVpcmVkPVxcXCJyZXF1aXJlZFxcXCJcXHJcXG4gICAgICAgIDpyb3dzPVxcXCJyb3dzXFxcIlxcclxcbiAgICAgICAgOnN0ZXA9XFxcInN0ZXBcXFwiXFxyXFxuICAgICAgICA6dGl0bGU9XFxcImF0dHIodGl0bGUpXFxcIlxcclxcbiAgICAgICAgOnR5cGU9XFxcInR5cGU9PSd0ZXh0YXJlYSc/bnVsbDp0eXBlXFxcIlxcclxcbiAgICAgICAgdi1tb2RlbD1cXFwidmFsXFxcIlxcclxcbiAgICAgICAgQGJsdXI9XFxcImVtaXRcXFwiIEBmb2N1cz1cXFwiZW1pdFxcXCIgQGlucHV0PVxcXCJlbWl0XFxcIlxcclxcbiAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ0eXBlIT0ndGV4dGFyZWEnJiZlbnRlclN1Ym1pdCYmc3VibWl0KClcXFwiXFxyXFxuICAgICAgPjwvdGV4dGFyZWE+XFxyXFxuICAgICAgPGRpdiB2LWlmPVxcXCJjbGVhckJ1dHRvbiAmJiB2YWx1ZVxcXCIgOmNsYXNzPVxcXCJ7aWNvbjppY29ufVxcXCI+XFxyXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwidmFsdWUgPSAnJ1xcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgICA8ZGl2IHYtaWY9XFxcImljb25cXFwiIGNsYXNzPVxcXCJpY29uXFxcIj5cXHJcXG4gICAgICAgIDxzcGFuIHYtaWY9XFxcImljb24mJnZhbGlkIT09bnVsbFxcXCIgOmNsYXNzPVxcXCJbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCdnbHlwaGljb24tJysodmFsaWQ/J29rJzoncmVtb3ZlJyldXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICAgIDxzbG90IG5hbWU9XFxcImFmdGVyXFxcIj48L3Nsb3Q+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8dGVtcGxhdGUgdi1lbHNlPlxcclxcbiAgICAgIDx0ZXh0YXJlYSA6aXM9XFxcInR5cGU9PSd0ZXh0YXJlYSc/dHlwZTonaW5wdXQnXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiByZWY9XFxcImlucHV0XFxcIlxcclxcbiAgICAgICAgOmNvbHM9XFxcImNvbHNcXFwiXFxyXFxuICAgICAgICA6ZGlzYWJsZWQ9XFxcImRpc2FibGVkXFxcIlxcclxcbiAgICAgICAgOmxpc3Q9XFxcImlkX2RhdGFsaXN0XFxcIlxcclxcbiAgICAgICAgOm1heD1cXFwiYXR0cihtYXgpXFxcIlxcclxcbiAgICAgICAgOm1heGxlbmd0aD1cXFwibWF4bGVuZ3RoXFxcIlxcclxcbiAgICAgICAgOm1pbj1cXFwiYXR0cihtaW4pXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cGxhY2Vob2xkZXI9XFxcInBsYWNlaG9sZGVyXFxcIlxcclxcbiAgICAgICAgOnJlYWRvbmx5PVxcXCJyZWFkb25seVxcXCJcXHJcXG4gICAgICAgIDpyZXF1aXJlZD1cXFwicmVxdWlyZWRcXFwiXFxyXFxuICAgICAgICA6cm93cz1cXFwicm93c1xcXCJcXHJcXG4gICAgICAgIDpzdGVwPVxcXCJzdGVwXFxcIlxcclxcbiAgICAgICAgOnRpdGxlPVxcXCJhdHRyKHRpdGxlKVxcXCJcXHJcXG4gICAgICAgIDp0eXBlPVxcXCJ0eXBlPT0ndGV4dGFyZWEnP251bGw6dHlwZVxcXCJcXHJcXG4gICAgICAgIHYtbW9kZWw9XFxcInZhbFxcXCJcXHJcXG4gICAgICAgIEBibHVyPVxcXCJlbWl0XFxcIiBAZm9jdXM9XFxcImVtaXRcXFwiIEBpbnB1dD1cXFwiZW1pdFxcXCJcXHJcXG4gICAgICAgIEBrZXl1cC5lbnRlcj1cXFwidHlwZSE9J3RleHRhcmVhJyYmZW50ZXJTdWJtaXQmJnN1Ym1pdCgpXFxcIlxcclxcbiAgICAgID48L3RleHRhcmVhPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImNsZWFyQnV0dG9uICYmIHZhbFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcInZhbCA9ICcnXFxcIj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImljb24mJnZhbGlkIT09bnVsbFxcXCIgOmNsYXNzPVxcXCJbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCdnbHlwaGljb24tJysodmFsaWQ/J29rJzoncmVtb3ZlJyldXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcclxcbiAgICA8L3RlbXBsYXRlPlxcclxcbiAgICA8ZGF0YWxpc3Qgdi1pZj1cXFwiaWRfZGF0YWxpc3RcXFwiIDppZD1cXFwiaWRfZGF0YWxpc3RcXFwiPlxcclxcbiAgICAgIDxvcHRpb24gdi1mb3I9XFxcIm9wYyBpbiBvcHRpb25zXFxcIiA6dmFsdWU9XFxcIm9wY1xcXCI+PC9vcHRpb24+XFxyXFxuICAgIDwvZGF0YWxpc3Q+XFxyXFxuICAgIDxkaXYgdi1pZj1cXFwic2hvd0hlbHBcXFwiIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIiBAY2xpY2s9XFxcImZvY3VzXFxcIj57e2hlbHB9fTwvZGl2PlxcclxcbiAgICA8ZGl2IHYtaWY9XFxcInNob3dFcnJvclxcXCIgY2xhc3M9XFxcImhlbHAtYmxvY2sgd2l0aC1lcnJvcnNcXFwiIEBjbGljaz1cXFwiZm9jdXNcXFwiPnt7ZXJyb3JUZXh0fX08L2Rpdj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2NvZXJjZSwgZGVsYXllciwgdHJhbnNsYXRpb25zfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xcclxcbmltcG9ydCAkIGZyb20gJy4vdXRpbHMvTm9kZUxpc3QuanMnXFxyXFxuXFxyXFxudmFyIERFTEFZID0gMzAwXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGNvbHM6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBkYXRhbGlzdDoge3R5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgZGlzYWJsZWQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGVudGVyU3VibWl0OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBlcnJvcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGhlbHA6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBoaWRlSGVscDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWV9LFxcclxcbiAgICBpY29uOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYWJlbDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxhbmc6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZX0sXFxyXFxuICAgIG1hc2s6IG51bGwsXFxyXFxuICAgIG1hc2tEZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMTAwfSxcXHJcXG4gICAgbWF0Y2g6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtYXg6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtYXhsZW5ndGg6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtaW46IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtaW5sZW5ndGg6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDB9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcGF0dGVybjoge2RlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBwbGFjZWhvbGRlcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHJlYWRvbmx5OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICByZXF1aXJlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgcm93czoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogM30sXFxyXFxuICAgIHN0ZXA6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB0eXBlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGV4dCd9LFxcclxcbiAgICB1cmw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB1cmxNYXA6IHt0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbGlkYXRpb25EZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMjUwfSxcXHJcXG4gICAgdmFsdWU6IHtkZWZhdWx0OiBudWxsfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZVxcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZGF0YWxpc3QsXFxyXFxuICAgICAgdmFsLFxcclxcbiAgICAgIHZhbGlkOiBudWxsLFxcclxcbiAgICAgIHRpbWVvdXQ6IG51bGxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGNhblZhbGlkYXRlICgpIHsgcmV0dXJuICF0aGlzLmRpc2FibGVkICYmICF0aGlzLnJlYWRvbmx5ICYmICh0aGlzLnJlcXVpcmVkIHx8IHRoaXMucmVnZXggfHwgdGhpcy5uYXRpdmVWYWxpZGF0ZSB8fCB0aGlzLm1hdGNoICE9PSBudWxsKSB9LFxcclxcbiAgICBlcnJvclRleHQgKCkge1xcclxcbiAgICAgIGxldCB2YWx1ZSA9IHRoaXMudmFsdWVcXHJcXG4gICAgICBsZXQgZXJyb3IgPSBbdGhpcy5lcnJvcl1cXHJcXG4gICAgICBpZiAoIXZhbHVlICYmIHRoaXMucmVxdWlyZWQpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0LnJlcXVpcmVkLnRvTG93ZXJDYXNlKCkgKyAnKScpXFxyXFxuICAgICAgaWYgKHZhbHVlICYmICh2YWx1ZS5sZW5ndGggPCB0aGlzLm1pbmxlbmd0aCkpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0Lm1pbkxlbmd0aC50b0xvd2VyQ2FzZSgpICsgJzogJyArIHRoaXMubWlubGVuZ3RoICsgJyknKVxcclxcbiAgICAgIHJldHVybiBlcnJvci5qb2luKCcgJylcXHJcXG4gICAgfSxcXHJcXG4gICAgaWRfZGF0YWxpc3QgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLnR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdGhpcy5kYXRhbGlzdCBpbnN0YW5jZW9mIEFycmF5KSB7XFxyXFxuICAgICAgICBpZiAoIXRoaXMuX2lkX2RhdGFsaXN0KSB7XFxyXFxuICAgICAgICAgIGlmICghdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCkgeyB0aGlzLiRyb290LmlkX2RhdGFsaXN0ID0gMCB9XFxyXFxuICAgICAgICAgIHRoaXMuX2lkX2RhdGFsaXN0ID0gJ2lucHV0LWRhdGFsaXN0JyArIHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QrK1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkX2RhdGFsaXN0XFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiBudWxsXFxyXFxuICAgIH0sXFxyXFxuICAgIGlucHV0ICgpIHsgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXQgfSxcXHJcXG4gICAgbmF0aXZlVmFsaWRhdGUgKCkgeyByZXR1cm4gKHRoaXMuaW5wdXQgfHwge30pLmNoZWNrVmFsaWRpdHkgJiYgKH5bJ3VybCcsICdlbWFpbCddLmluZGV4T2YodGhpcy50eXBlLnRvTG93ZXJDYXNlKCkpIHx8IHRoaXMubWluIHx8IHRoaXMubWF4KSB9LFxcclxcbiAgICByZWdleCAoKSB7IHJldHVybiBjb2VyY2UucGF0dGVybih0aGlzLnBhdHRlcm4pIH0sXFxyXFxuICAgIHNob3dFcnJvciAoKSB7IHJldHVybiB0aGlzLmVycm9yICYmIHRoaXMudmFsaWQgPT09IGZhbHNlIH0sXFxyXFxuICAgIHNob3dIZWxwICgpIHsgcmV0dXJuIHRoaXMuaGVscCAmJiAoIXRoaXMuc2hvd0Vycm9yIHx8ICF0aGlzLmhpZGVIZWxwKSB9LFxcclxcbiAgICB0ZXh0ICgpIHsgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpIH0sXFxyXFxuICAgIHRpdGxlICgpIHsgcmV0dXJuIHRoaXMuZXJyb3JUZXh0IHx8IHRoaXMuaGVscCB8fCAnJyB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgZGF0YWxpc3QgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkICYmIHZhbCBpbnN0YW5jZW9mIEFycmF5KSB7IHRoaXMub3B0aW9ucyA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIG1hdGNoICh2YWwpIHsgdGhpcy5ldmFsKCkgfSxcXHJcXG4gICAgb3B0aW9ucyAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ29wdGlvbnMnLCB2YWwpXFxyXFxuICAgIH0sXFxyXFxuICAgIHVybCAodmFsKSB7XFxyXFxuICAgICAgdGhpcy5fdXJsKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkge1xcclxcbiAgICAgICAgaWYgKHRoaXMubWFzayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XFxyXFxuICAgICAgICAgIHZhbCA9IHRoaXMubWFzayh2YWwgfHwgJycpXFxyXFxuICAgICAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XFxyXFxuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzaylcXHJcXG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0Lm1hc2sgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgICAgIHRoaXMudmFsID0gdmFsXFxyXFxuICAgICAgICAgICAgfSwgaXNOYU4odGhpcy5tYXNrRGVsYXkpID8gMCA6IHRoaXMubWFza0RlbGF5KVxcclxcbiAgICAgICAgICB9XFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICB0aGlzLmV2YWwoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKVxcclxcbiAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIGF0dHIgKHZhbHVlKSB7XFxyXFxuICAgICAgcmV0dXJuIH5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IG51bGwgOiB2YWx1ZVxcclxcbiAgICB9LFxcclxcbiAgICBlbWl0IChlKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdChlLnR5cGUsIGUudHlwZSA9PSAnaW5wdXQnID8gZS50YXJnZXQudmFsdWUgOiBlKVxcclxcbiAgICAgIGlmIChlLnR5cGUgPT09ICdibHVyJyAmJiB0aGlzLmNhblZhbGlkYXRlKSB7IHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKCkgfVxcclxcbiAgICB9LFxcclxcbiAgICBldmFsICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5fdGltZW91dC5ldmFsKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5ldmFsKVxcclxcbiAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkge1xcclxcbiAgICAgICAgdGhpcy52YWxpZCA9IHRydWVcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5fdGltZW91dC5ldmFsID0gc2V0VGltZW91dCgoKSA9PiB7XFxyXFxuICAgICAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKClcXHJcXG4gICAgICAgICAgdGhpcy5fdGltZW91dC5ldmFsID0gbnVsbFxcclxcbiAgICAgICAgfSwgdGhpcy52YWxpZGF0aW9uRGVsYXkpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBmb2N1cyAoKSB7IHRoaXMuaW5wdXQuZm9jdXMoKSB9LFxcclxcbiAgICBzdWJtaXQgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLiRwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcXHJcXG4gICAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQudmFsaWRhdGUoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZiAodGhpcy5pbnB1dC5mb3JtKSB7XFxyXFxuICAgICAgICBjb25zdCBpbnZhbGlkcyA9ICQoJy5mb3JtLWdyb3VwLnZhbGlkYXRlOm5vdCguaGFzLXN1Y2Nlc3MpJywgdGhpcy5pbnB1dC5mb3JtKVxcclxcbiAgICAgICAgaWYgKGludmFsaWRzLmxlbmd0aCkge1xcclxcbiAgICAgICAgICBpbnZhbGlkcy5maW5kKCdpbnB1dCx0ZXh0YXJlYSxzZWxlY3QnKVswXS5mb2N1cygpXFxyXFxuICAgICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgICB0aGlzLmlucHV0LmZvcm0uc3VibWl0KClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbGlkYXRlICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuY2FuVmFsaWRhdGUpIHsgcmV0dXJuIHRydWUgfVxcclxcbiAgICAgIGxldCB2YWx1ZSA9ICh0aGlzLnZhbCB8fCAnJykudHJpbSgpXFxyXFxuICAgICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gIXRoaXMucmVxdWlyZWQgfVxcclxcbiAgICAgIGlmICh0aGlzLm1hdGNoICE9PSBudWxsKSB7IHJldHVybiB0aGlzLm1hdGNoID09PSB2YWx1ZSB9XFxyXFxuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgaWYgKHRoaXMubmF0aXZlVmFsaWRhdGUgJiYgIXRoaXMuaW5wdXQuY2hlY2tWYWxpZGl0eSgpKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgaWYgKHRoaXMucmVnZXgpIHtcXHJcXG4gICAgICAgIGlmICghKHRoaXMucmVnZXggaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHRoaXMucmVnZXgodGhpcy52YWx1ZSkgOiB0aGlzLnJlZ2V4LnRlc3QodGhpcy52YWx1ZSkpKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIHJlc2V0KCkge1xcclxcbiAgICAgIHRoaXMudmFsdWUgPSAnJ1xcclxcbiAgICAgIHRoaXMudmFsaWQgPSBudWxsXFxyXFxuICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzaylcXHJcXG4gICAgICBpZiAodGhpcy5fdGltZW91dC5ldmFsKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5ldmFsKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX2lucHV0ID0gdHJ1ZVxcclxcbiAgICB0aGlzLl90aW1lb3V0ID0ge31cXHJcXG4gICAgbGV0IHBhcmVudCA9IHRoaXMuJHBhcmVudFxcclxcbiAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHsgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQgfVxcclxcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xcclxcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50XFxyXFxuICAgIH1cXHJcXG4gICAgdGhpcy5fdXJsID0gZGVsYXllcihmdW5jdGlvbiAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCB8fCB0aGlzLl9sb2FkaW5nKSB7IHJldHVybiB9XFxyXFxuICAgICAgdGhpcy5fbG9hZGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihyZXNwb25zZSA9PiB7XFxyXFxuICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXVxcclxcbiAgICAgICAgdHJ5IHsgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSkgfSBjYXRjaCAoZSkge31cXHJcXG4gICAgICAgIGlmICh0aGlzLnVybE1hcCkgeyBkYXRhID0gZGF0YS5tYXAodGhpcy51cmxNYXApIH1cXHJcXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGRhdGFcXHJcXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSwgcmVzcG9uc2UgPT4ge1xcclxcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcXHJcXG4gICAgICB9KVxcclxcbiAgICB9LCBERUxBWSlcXHJcXG4gICAgaWYgKHRoaXMudXJsKSB0aGlzLl91cmwoKVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICAvLyAkKHRoaXMuaW5wdXQpLm9uKCdmb2N1cycsIGUgPT4geyB0aGlzLiRlbWl0KCdmb2N1cycsIGUpIH0pLm9uKCdibHVyJywgZSA9PiB7XFxyXFxuICAgIC8vICAgaWYgKHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XFxyXFxuICAgIC8vICAgdGhpcy4kZW1pdCgnYmx1cicsIGUpXFxyXFxuICAgIC8vIH0pXFxyXFxuICB9LFxcclxcbiAgYmVmb3JlRGVzdHJveSAoKSB7XFxyXFxuICAgIC8vICQodGhpcy5pbnB1dCkub2ZmKClcXHJcXG4gICAgaWYgKHRoaXMuX3BhcmVudCkge1xcclxcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSlcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbi5mb3JtLWdyb3VwIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG59XFxyXFxubGFiZWx+LmNsb3NlIHtcXHJcXG4gIHRvcDogMjVweDtcXHJcXG59XFxyXFxuLmlucHV0LWdyb3VwPi5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XFxyXFxuICB3aWR0aDowO1xcclxcbiAgei1pbmRleDogMztcXHJcXG59XFxyXFxuLmNsb3NlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmhhcy1mZWVkYmFjayAuY2xvc2Uge1xcclxcbiAgcmlnaHQ6IDIwcHg7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxMTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0dmFyIERFTEFZID0gMzAwO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBjbGVhckJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgY29sczogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGRhdGFsaXN0OiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZW50ZXJTdWJtaXQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGVycm9yOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgaGVscDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGhpZGVIZWxwOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGljb246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhYmVsOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgbWFzazogbnVsbCxcblx0ICAgIG1hc2tEZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDEwMCB9LFxuXHQgICAgbWF0Y2g6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtYXg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtYXhsZW5ndGg6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtaW46IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtaW5sZW5ndGg6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG5cdCAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgcGF0dGVybjogeyBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICByZXF1aXJlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgcm93czogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDMgfSxcblx0ICAgIHN0ZXA6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RleHQnIH0sXG5cdCAgICB1cmw6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB1cmxNYXA6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbGlkYXRpb25EZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDI1MCB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogbnVsbCB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBvcHRpb25zOiB0aGlzLmRhdGFsaXN0LFxuXHQgICAgICB2YWw6IHZhbCxcblx0ICAgICAgdmFsaWQ6IG51bGwsXG5cdCAgICAgIHRpbWVvdXQ6IG51bGxcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGNhblZhbGlkYXRlOiBmdW5jdGlvbiBjYW5WYWxpZGF0ZSgpIHtcblx0ICAgICAgcmV0dXJuICF0aGlzLmRpc2FibGVkICYmICF0aGlzLnJlYWRvbmx5ICYmICh0aGlzLnJlcXVpcmVkIHx8IHRoaXMucmVnZXggfHwgdGhpcy5uYXRpdmVWYWxpZGF0ZSB8fCB0aGlzLm1hdGNoICE9PSBudWxsKTtcblx0ICAgIH0sXG5cdCAgICBlcnJvclRleHQ6IGZ1bmN0aW9uIGVycm9yVGV4dCgpIHtcblx0ICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcblx0ICAgICAgdmFyIGVycm9yID0gW3RoaXMuZXJyb3JdO1xuXHQgICAgICBpZiAoIXZhbHVlICYmIHRoaXMucmVxdWlyZWQpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0LnJlcXVpcmVkLnRvTG93ZXJDYXNlKCkgKyAnKScpO1xuXHQgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoIDwgdGhpcy5taW5sZW5ndGgpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0Lm1pbkxlbmd0aC50b0xvd2VyQ2FzZSgpICsgJzogJyArIHRoaXMubWlubGVuZ3RoICsgJyknKTtcblx0ICAgICAgcmV0dXJuIGVycm9yLmpvaW4oJyAnKTtcblx0ICAgIH0sXG5cdCAgICBpZF9kYXRhbGlzdDogZnVuY3Rpb24gaWRfZGF0YWxpc3QoKSB7XG5cdCAgICAgIGlmICh0aGlzLnR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdGhpcy5kYXRhbGlzdCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLl9pZF9kYXRhbGlzdCkge1xuXHQgICAgICAgICAgaWYgKCF0aGlzLiRyb290LmlkX2RhdGFsaXN0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QgPSAwO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgdGhpcy5faWRfZGF0YWxpc3QgPSAnaW5wdXQtZGF0YWxpc3QnICsgdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCsrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5faWRfZGF0YWxpc3Q7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9LFxuXHQgICAgaW5wdXQ6IGZ1bmN0aW9uIGlucHV0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dDtcblx0ICAgIH0sXG5cdCAgICBuYXRpdmVWYWxpZGF0ZTogZnVuY3Rpb24gbmF0aXZlVmFsaWRhdGUoKSB7XG5cdCAgICAgIHJldHVybiAodGhpcy5pbnB1dCB8fCB7fSkuY2hlY2tWYWxpZGl0eSAmJiAoflsndXJsJywgJ2VtYWlsJ10uaW5kZXhPZih0aGlzLnR5cGUudG9Mb3dlckNhc2UoKSkgfHwgdGhpcy5taW4gfHwgdGhpcy5tYXgpO1xuXHQgICAgfSxcblx0ICAgIHJlZ2V4OiBmdW5jdGlvbiByZWdleCgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UucGF0dGVybih0aGlzLnBhdHRlcm4pO1xuXHQgICAgfSxcblx0ICAgIHNob3dFcnJvcjogZnVuY3Rpb24gc2hvd0Vycm9yKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5lcnJvciAmJiB0aGlzLnZhbGlkID09PSBmYWxzZTtcblx0ICAgIH0sXG5cdCAgICBzaG93SGVscDogZnVuY3Rpb24gc2hvd0hlbHAoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmhlbHAgJiYgKCF0aGlzLnNob3dFcnJvciB8fCAhdGhpcy5oaWRlSGVscCk7XG5cdCAgICB9LFxuXHQgICAgdGV4dDogZnVuY3Rpb24gdGV4dCgpIHtcblx0ICAgICAgcmV0dXJuICgwLCBfdXRpbHMudHJhbnNsYXRpb25zKSh0aGlzLmxhbmcpO1xuXHQgICAgfSxcblx0ICAgIHRpdGxlOiBmdW5jdGlvbiB0aXRsZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZXJyb3JUZXh0IHx8IHRoaXMuaGVscCB8fCAnJztcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBkYXRhbGlzdDogZnVuY3Rpb24gZGF0YWxpc3QodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkICYmIHZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgICAgdGhpcy5vcHRpb25zID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbWF0Y2g6IGZ1bmN0aW9uIG1hdGNoKHZhbCkge1xuXHQgICAgICB0aGlzLmV2YWwoKTtcblx0ICAgIH0sXG5cdCAgICBvcHRpb25zOiBmdW5jdGlvbiBvcHRpb25zKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkgdGhpcy4kZW1pdCgnb3B0aW9ucycsIHZhbCk7XG5cdCAgICB9LFxuXHQgICAgdXJsOiBmdW5jdGlvbiB1cmwodmFsKSB7XG5cdCAgICAgIHRoaXMuX3VybCgpO1xuXHQgICAgfSxcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwsIG9sZCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgaWYgKF92YWwgIT09IG9sZCkge1xuXHQgICAgICAgIGlmICh0aGlzLm1hc2sgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHQgICAgICAgICAgX3ZhbCA9IHRoaXMubWFzayhfdmFsIHx8ICcnKTtcblx0ICAgICAgICAgIGlmICh0aGlzLnZhbCAhPT0gX3ZhbCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fdGltZW91dC5tYXNrKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5tYXNrKTtcblx0ICAgICAgICAgICAgdGhpcy5fdGltZW91dC5tYXNrID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgX3RoaXMudmFsID0gX3ZhbDtcblx0ICAgICAgICAgICAgfSwgaXNOYU4odGhpcy5tYXNrRGVsYXkpID8gMCA6IHRoaXMubWFza0RlbGF5KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5ldmFsKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGF0dHI6IGZ1bmN0aW9uIGF0dHIodmFsdWUpIHtcblx0ICAgICAgcmV0dXJuIH5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IG51bGwgOiB2YWx1ZTtcblx0ICAgIH0sXG5cdCAgICBlbWl0OiBmdW5jdGlvbiBlbWl0KGUpIHtcblx0ICAgICAgdGhpcy4kZW1pdChlLnR5cGUsIGUudHlwZSA9PSAnaW5wdXQnID8gZS50YXJnZXQudmFsdWUgOiBlKTtcblx0ICAgICAgaWYgKGUudHlwZSA9PT0gJ2JsdXInICYmIHRoaXMuY2FuVmFsaWRhdGUpIHtcblx0ICAgICAgICB0aGlzLnZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZXZhbDogZnVuY3Rpb24gX2V2YWwoKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKHRoaXMuX3RpbWVvdXQuZXZhbCkgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQuZXZhbCk7XG5cdCAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkge1xuXHQgICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuX3RpbWVvdXQuZXZhbCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgX3RoaXMyLnZhbGlkID0gX3RoaXMyLnZhbGlkYXRlKCk7XG5cdCAgICAgICAgICBfdGhpczIuX3RpbWVvdXQuZXZhbCA9IG51bGw7XG5cdCAgICAgICAgfSwgdGhpcy52YWxpZGF0aW9uRGVsYXkpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHQgICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgc3VibWl0OiBmdW5jdGlvbiBzdWJtaXQoKSB7XG5cdCAgICAgIGlmICh0aGlzLiRwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LnZhbGlkYXRlKCk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMuaW5wdXQuZm9ybSkge1xuXHQgICAgICAgIHZhciBpbnZhbGlkcyA9ICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCcuZm9ybS1ncm91cC52YWxpZGF0ZTpub3QoLmhhcy1zdWNjZXNzKScsIHRoaXMuaW5wdXQuZm9ybSk7XG5cdCAgICAgICAgaWYgKGludmFsaWRzLmxlbmd0aCkge1xuXHQgICAgICAgICAgaW52YWxpZHMuZmluZCgnaW5wdXQsdGV4dGFyZWEsc2VsZWN0JylbMF0uZm9jdXMoKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5pbnB1dC5mb3JtLnN1Ym1pdCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgaWYgKCF0aGlzLmNhblZhbGlkYXRlKSB7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIHZhbHVlID0gKHRoaXMudmFsIHx8ICcnKS50cmltKCk7XG5cdCAgICAgIGlmICghdmFsdWUpIHtcblx0ICAgICAgICByZXR1cm4gIXRoaXMucmVxdWlyZWQ7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMubWF0Y2ggIT09IG51bGwpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5tYXRjaCA9PT0gdmFsdWU7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLm5hdGl2ZVZhbGlkYXRlICYmICF0aGlzLmlucHV0LmNoZWNrVmFsaWRpdHkoKSkge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5yZWdleCkge1xuXHQgICAgICAgIGlmICghKHRoaXMucmVnZXggaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHRoaXMucmVnZXgodGhpcy52YWx1ZSkgOiB0aGlzLnJlZ2V4LnRlc3QodGhpcy52YWx1ZSkpKSB7XG5cdCAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcblx0ICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuXHQgICAgICB0aGlzLnZhbGlkID0gbnVsbDtcblx0ICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzayk7XG5cdCAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lucHV0ID0gdHJ1ZTtcblx0ICAgIHRoaXMuX3RpbWVvdXQgPSB7fTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgICAgdGhpcy5fdXJsID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCB8fCB0aGlzLl9sb2FkaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0ICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdCAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICBpZiAoX3RoaXMzLnVybE1hcCkge1xuXHQgICAgICAgICAgZGF0YSA9IGRhdGEubWFwKF90aGlzMy51cmxNYXApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBfdGhpczMub3B0aW9ucyA9IGRhdGE7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSk7XG5cdCAgICB9LCBERUxBWSk7XG5cdCAgICBpZiAodGhpcy51cmwpIHRoaXMuX3VybCgpO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIC8vICQodGhpcy5pbnB1dCkub24oJ2ZvY3VzJywgZSA9PiB7IHRoaXMuJGVtaXQoJ2ZvY3VzJywgZSkgfSkub24oJ2JsdXInLCBlID0+IHtcblx0ICAgIC8vICAgaWYgKHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XG5cdCAgICAvLyAgIHRoaXMuJGVtaXQoJ2JsdXInLCBlKVxuXHQgICAgLy8gfSlcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICAvLyAkKHRoaXMuaW5wdXQpLm9mZigpXG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1ncm91cFwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgdmFsaWRhdGU6IF92bS5jYW5WYWxpZGF0ZSwgJ2hhcy1mZWVkYmFjayc6IF92bS5pY29uLCAnaGFzLWVycm9yJzogX3ZtLmNhblZhbGlkYXRlICYmIF92bS52YWxpZCA9PT0gZmFsc2UsICdoYXMtc3VjY2Vzcyc6IF92bS5jYW5WYWxpZGF0ZSAmJiBfdm0udmFsaWRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwibGFiZWxcIiwgWyhfdm0ubGFiZWwpID8gX3ZtLl9jKCdsYWJlbCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNvbnRyb2wtbGFiZWxcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxhYmVsKSldKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLmJlZm9yZSB8fCBfdm0uJHNsb3RzLmFmdGVyKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaW5wdXQtZ3JvdXBcIlxuXHQgIH0sIFtfdm0uX3QoXCJiZWZvcmVcIiksIF92bS5fdihcIiBcIiksIF92bS5fYyhfdm0udHlwZSA9PSAndGV4dGFyZWEnID8gX3ZtLnR5cGUgOiAnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJpbnB1dFwiLFxuXHQgICAgdGFnOiBcInRleHRhcmVhXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiY29sc1wiOiBfdm0uY29scyxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIFwibGlzdFwiOiBfdm0uaWRfZGF0YWxpc3QsXG5cdCAgICAgIFwibWF4XCI6IF92bS5hdHRyKF92bS5tYXgpLFxuXHQgICAgICBcIm1heGxlbmd0aFwiOiBfdm0ubWF4bGVuZ3RoLFxuXHQgICAgICBcIm1pblwiOiBfdm0uYXR0cihfdm0ubWluKSxcblx0ICAgICAgXCJuYW1lXCI6IF92bS5uYW1lLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlcixcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJvd3NcIjogX3ZtLnJvd3MsXG5cdCAgICAgIFwic3RlcFwiOiBfdm0uc3RlcCxcblx0ICAgICAgXCJ0aXRsZVwiOiBfdm0uYXR0cihfdm0udGl0bGUpLFxuXHQgICAgICBcInR5cGVcIjogX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IG51bGwgOiBfdm0udHlwZVxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImZvY3VzXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImlucHV0XCI6IFtmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnZhbCA9ICRldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgfSwgX3ZtLmVtaXRdLFxuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS50eXBlICE9ICd0ZXh0YXJlYScgJiYgX3ZtLmVudGVyU3VibWl0ICYmIF92bS5zdWJtaXQoKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0uY2xlYXJCdXR0b24gJiYgX3ZtLnZhbHVlKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgaWNvbjogX3ZtLmljb25cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbHVlID0gJydcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoXCLDl1wiKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKF92bS5pY29uKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvblwiXG5cdCAgfSwgWyhfdm0uaWNvbiAmJiBfdm0udmFsaWQgIT09IG51bGwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IFsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsaWQgPyAnb2snIDogJ3JlbW92ZScpXSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiYWZ0ZXJcIildLCAyKSA6IFtfdm0uX2MoX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IF92bS50eXBlIDogJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIHRhZzogXCJ0ZXh0YXJlYVwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImNvbHNcIjogX3ZtLmNvbHMsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkLFxuXHQgICAgICBcImxpc3RcIjogX3ZtLmlkX2RhdGFsaXN0LFxuXHQgICAgICBcIm1heFwiOiBfdm0uYXR0cihfdm0ubWF4KSxcblx0ICAgICAgXCJtYXhsZW5ndGhcIjogX3ZtLm1heGxlbmd0aCxcblx0ICAgICAgXCJtaW5cIjogX3ZtLmF0dHIoX3ZtLm1pbiksXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0ucGxhY2Vob2xkZXIsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5LFxuXHQgICAgICBcInJlcXVpcmVkXCI6IF92bS5yZXF1aXJlZCxcblx0ICAgICAgXCJyb3dzXCI6IF92bS5yb3dzLFxuXHQgICAgICBcInN0ZXBcIjogX3ZtLnN0ZXAsXG5cdCAgICAgIFwidGl0bGVcIjogX3ZtLmF0dHIoX3ZtLnRpdGxlKSxcblx0ICAgICAgXCJ0eXBlXCI6IF92bS50eXBlID09ICd0ZXh0YXJlYScgPyBudWxsIDogX3ZtLnR5cGVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0udmFsKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiYmx1clwiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJmb2N1c1wiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJpbnB1dFwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKCRldmVudC50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS52YWwgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgIH0sIF92bS5lbWl0XSxcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzKSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0udHlwZSAhPSAndGV4dGFyZWEnICYmIF92bS5lbnRlclN1Ym1pdCAmJiBfdm0uc3VibWl0KClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbCA9ICcnXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmljb24gJiYgX3ZtLnZhbGlkICE9PSBudWxsKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCAnZ2x5cGhpY29uLScgKyAoX3ZtLnZhbGlkID8gJ29rJyA6ICdyZW1vdmUnKV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9XG5cdCAgfSkgOiBfdm0uX2UoKV0sIF92bS5fdihcIiBcIiksIChfdm0uaWRfZGF0YWxpc3QpID8gX3ZtLl9jKCdkYXRhbGlzdCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiaWRcIjogX3ZtLmlkX2RhdGFsaXN0XG5cdCAgICB9XG5cdCAgfSwgX3ZtLl9sKChfdm0ub3B0aW9ucyksIGZ1bmN0aW9uKG9wYykge1xuXHQgICAgcmV0dXJuIF92bS5fYygnb3B0aW9uJywge1xuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwidmFsdWVcIjogb3BjXG5cdCAgICAgIH1cblx0ICAgIH0pXG5cdCAgfSkpIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0uc2hvd0hlbHApID8gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJoZWxwLWJsb2NrXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5mb2N1c1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5oZWxwKSldKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLnNob3dFcnJvcikgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImhlbHAtYmxvY2sgd2l0aC1lcnJvcnNcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmVycm9yVGV4dCkpXSkgOiBfdm0uX2UoKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTY1MmFkN2I5XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTE5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMClcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcTW9kYWwudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWZlN2Q1ZGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1mZTdkNWRjOFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE1vZGFsLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEyMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIxKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5tb2RhbCB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcbn1cXG4ubW9kYWwuaW4ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjUpO1xcbn1cXG4ubW9kYWwuem9vbSAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdG9wOiAzMDBweDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4zcztcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzO1xcbn1cXG4ubW9kYWwuem9vbS5pbiAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgb3BhY2l0eTogMTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9Nb2RhbC52dWU/NDU4ZmI2OWFcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQThGQTtFQUNBLDBCQUFBO0NBQ0E7QUFDQTtFQUNBLGtDQUFBO0NBQ0E7QUFDQTtFQUNBLDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSwwQkFBQTtFQUNBLHNCQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSw2QkFBQTtFQUNBLDBCQUFBO0VBQ0EscUJBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7RUFDQSx5QkFBQTtFQUNBLHdCQUFBO0VBQ0Esb0JBQUE7RUFDQSw2Q0FBQTtFQUNBLHFDQUFBO0VBQ0EsV0FBQTtDQUNBXCIsXCJmaWxlXCI6XCJNb2RhbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiByb2xlPVxcXCJkaWFsb2dcXFwiIDpjbGFzcz1cXFwiWydtb2RhbCcsZWZmZWN0XVxcXCIgQGNsaWNrPVxcXCJiYWNrQ2xvc2VcXFwiIEB0cmFuc2l0aW9uZW5kPVxcXCJ0cmFuc2l0aW9uZW5kXFxcIj5cXHJcXG4gICAgPGRpdiA6Y2xhc3M9XFxcInsnbW9kYWwtZGlhbG9nJzp0cnVlLCdtb2RhbC1sZyc6bGFyZ2UsJ21vZGFsLXNtJzpzbWFsbH1cXFwiIHJvbGU9XFxcImRvY3VtZW50XFxcIiA6c3R5bGU9XFxcInt3aWR0aDogb3B0aW9uYWxXaWR0aH1cXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcImNsb3NlXFxcIj48c3Bhbj4mdGltZXM7PC9zcGFuPjwvYnV0dG9uPlxcclxcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPjxzbG90IG5hbWU9XFxcInRpdGxlXFxcIj57e3RpdGxlfX08L3Nsb3Q+PC9oND5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICA8L3Nsb3Q+XFxyXFxuICAgICAgICA8c2xvdCBuYW1lPVxcXCJtb2RhbC1ib2R5XFxcIj48ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj48c2xvdD48L3Nsb3Q+PC9kaXY+PC9zbG90PlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdFxcXCIgQGNsaWNrPVxcXCJjbG9zZVxcXCI+e3sgY2FuY2VsVGV4dCB9fTwvYnV0dG9uPlxcclxcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcIm9rXFxcIj57eyBva1RleHQgfX08L2J1dHRvbj5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICA8L3Nsb3Q+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Z2V0U2Nyb2xsQmFyV2lkdGh9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgYmFja2Ryb3A6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlfSxcXHJcXG4gICAgY2FsbGJhY2s6IHt0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGNhbmNlbFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdDbG9zZSd9LFxcclxcbiAgICBlZmZlY3Q6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBsYXJnZToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgb2tUZXh0OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnU2F2ZSBjaGFuZ2VzJ30sXFxyXFxuICAgIHNtYWxsOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICB0aXRsZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9LFxcclxcbiAgICB2YWx1ZToge3R5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlfSxcXHJcXG4gICAgd2lkdGg6IHtkZWZhdWx0OiBudWxsfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIG9wdGlvbmFsV2lkdGggKCkge1xcclxcbiAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsKSB7XFxyXFxuICAgICAgICByZXR1cm4gbnVsbFxcclxcbiAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzSW50ZWdlcih0aGlzLndpZHRoKSkge1xcclxcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKyAncHgnXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiB0aGlzLndpZHRoXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICB2YWx1ZSAodmFsKSB7XFxyXFxuICAgICAgdGhpcy50cmFuc2l0aW9uc3RhcnQoKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBiYWNrQ2xvc2UgKGUpIHtcXHJcXG4gICAgICBpZiAodGhpcy5iYWNrZHJvcCAmJiBlLnRhcmdldCA9PT0gdGhpcy4kZWwpIHsgdGhpcy5jbG9zZSgpIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgY2xvc2UgKCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2NhbmNlbCcpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBmYWxzZSlcXHJcXG4gICAgfSxcXHJcXG4gICAgb2sgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHRoaXMuY2FsbGJhY2soKVxcclxcbiAgICAgIHRoaXMuJGVtaXQoJ29rJylcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHRydWUpXFxyXFxuICAgIH0sXFxyXFxuICAgIHRyYW5zaXRpb25zdGFydCAoKSB7XFxyXFxuICAgICAgY29uc3QgZWwgPSB0aGlzLiRlbFxcclxcbiAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5XFxyXFxuICAgICAgY29uc3Qgc2Nyb2xsQmFyV2lkdGggPSBnZXRTY3JvbGxCYXJXaWR0aCgpXFxyXFxuICAgICAgaWYgKHRoaXMudmFsdWUpIHtcXHJcXG4gICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1jb250ZW50JykuZm9jdXMoKVxcclxcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcXHJcXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZWwuY2xhc3NMaXN0LmFkZCgnaW4nKSwgMClcXHJcXG4gICAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICBpZiAoc2Nyb2xsQmFyV2lkdGggIT09IDApIHtcXHJcXG4gICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBzY3JvbGxCYXJXaWR0aCArICdweCdcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnaW4nKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdHJhbnNpdGlvbmVuZCAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XFxyXFxuICAgICAgICB0aGlzLiRlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXFxyXFxuICAgICAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuYm9keVxcclxcbiAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBudWxsXFxyXFxuICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG48c3R5bGU+XFxyXFxuLm1vZGFsIHtcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XFxyXFxufVxcclxcbi5tb2RhbC5pbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7XFxyXFxufVxcclxcbi5tb2RhbC56b29tIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0b3A6IDMwMHB4O1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxuICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxufVxcclxcbi5tb2RhbC56b29tLmluIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICBvcGFjaXR5OiAxO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfaXNJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjMpO1xuXHRcblx0dmFyIF9pc0ludGVnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNJbnRlZ2VyKTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJhY2tkcm9wOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGNhbGxiYWNrOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBjYW5jZWxUZXh0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ0Nsb3NlJyB9LFxuXHQgICAgZWZmZWN0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbGFyZ2U6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG9rVGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdTYXZlIGNoYW5nZXMnIH0sXG5cdCAgICBzbWFsbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHdpZHRoOiB7IGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIG9wdGlvbmFsV2lkdGg6IGZ1bmN0aW9uIG9wdGlvbmFsV2lkdGgoKSB7XG5cdCAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgIH0gZWxzZSBpZiAoKDAsIF9pc0ludGVnZXIyLmRlZmF1bHQpKHRoaXMud2lkdGgpKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKyAncHgnO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLndpZHRoO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy50cmFuc2l0aW9uc3RhcnQoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJhY2tDbG9zZTogZnVuY3Rpb24gYmFja0Nsb3NlKGUpIHtcblx0ICAgICAgaWYgKHRoaXMuYmFja2Ryb3AgJiYgZS50YXJnZXQgPT09IHRoaXMuJGVsKSB7XG5cdCAgICAgICAgdGhpcy5jbG9zZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdjYW5jZWwnKTtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBmYWxzZSk7XG5cdCAgICB9LFxuXHQgICAgb2s6IGZ1bmN0aW9uIG9rKCkge1xuXHQgICAgICBpZiAodGhpcy5jYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB0aGlzLmNhbGxiYWNrKCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ29rJyk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdHJ1ZSk7XG5cdCAgICB9LFxuXHQgICAgdHJhbnNpdGlvbnN0YXJ0OiBmdW5jdGlvbiB0cmFuc2l0aW9uc3RhcnQoKSB7XG5cdCAgICAgIHZhciBlbCA9IHRoaXMuJGVsO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIHZhciBzY3JvbGxCYXJXaWR0aCA9ICgwLCBfdXRpbHMuZ2V0U2Nyb2xsQmFyV2lkdGgpKCk7XG5cdCAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG5cdCAgICAgICAgZWwucXVlcnlTZWxlY3RvcignLm1vZGFsLWNvbnRlbnQnKS5mb2N1cygpO1xuXHQgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoJ2luJyk7XG5cdCAgICAgICAgfSwgMCk7XG5cdCAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgaWYgKHNjcm9sbEJhcldpZHRoICE9PSAwKSB7XG5cdCAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoICsgJ3B4Jztcblx0ICAgICAgICB9XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnaW4nKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHRyYW5zaXRpb25lbmQ6IGZ1bmN0aW9uIHRyYW5zaXRpb25lbmQoKSB7XG5cdCAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuXHQgICAgICAgIHRoaXMuJGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdCAgICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXHQgICAgICAgIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gbnVsbDtcblx0ICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDEyMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNCksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuLyoqKi8gfSxcbi8qIDEyNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMjUpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNykuTnVtYmVyLmlzSW50ZWdlcjtcblxuLyoqKi8gfSxcbi8qIDEyNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG5cdHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0XG5cdCRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge2lzSW50ZWdlcjogX193ZWJwYWNrX3JlcXVpcmVfXygxMjYpfSk7XG5cbi8qKiovIH0sXG4vKiAxMjYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDIwLjEuMi4zIE51bWJlci5pc0ludGVnZXIobnVtYmVyKVxuXHR2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKVxuXHQgICwgZmxvb3IgICAgPSBNYXRoLmZsb29yO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCl7XG5cdCAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMjcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsnbW9kYWwnLCBfdm0uZWZmZWN0XSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImRpYWxvZ1wiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uYmFja0Nsb3NlLFxuXHQgICAgICBcInRyYW5zaXRpb25lbmRcIjogX3ZtLnRyYW5zaXRpb25lbmRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczoge1xuXHQgICAgICAnbW9kYWwtZGlhbG9nJzogdHJ1ZSwgJ21vZGFsLWxnJzogX3ZtLmxhcmdlLCAnbW9kYWwtc20nOiBfdm0uc21hbGxcblx0ICAgIH0sXG5cdCAgICBzdHlsZTogKHtcblx0ICAgICAgd2lkdGg6IF92bS5vcHRpb25hbFdpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImRvY3VtZW50XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1jb250ZW50XCJcblx0ICB9LCBbX3ZtLl90KFwibW9kYWwtaGVhZGVyXCIsIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm1vZGFsLWhlYWRlclwiXG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uY2xvc2Vcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywgW192bS5fdihcIsOXXCIpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdoNCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm1vZGFsLXRpdGxlXCJcblx0ICB9LCBbX3ZtLl90KFwidGl0bGVcIiwgW192bS5fdihfdm0uX3MoX3ZtLnRpdGxlKSldKV0sIDIpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwibW9kYWwtYm9keVwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1ib2R5XCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSksIF92bS5fdihcIiBcIiksIF92bS5fdChcIm1vZGFsLWZvb3RlclwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1mb290ZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2J1dHRvbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJ0biBidG4tZGVmYXVsdFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5jbG9zZVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5jYW5jZWxUZXh0KSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJidG4gYnRuLXByaW1hcnlcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0ub2tcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0ub2tUZXh0KSldKV0pXSldLCAyKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtZmU3ZDVkYzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMjggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTI5KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxOYXZiYXIudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTM4ZjA2MTllXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zOGYwNjE5ZVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE5hdmJhci52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBpZDogJ2JzLWV4YW1wbGUtbmF2YmFyLWNvbGxhcHNlLTEnLFxuXHQgICAgICBjb2xsYXBzZWQ6IHRydWUsXG5cdCAgICAgIHN0eWxlczoge31cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHNsb3RzOiBmdW5jdGlvbiBzbG90cygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3Nsb3RDb250ZW50cztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZUNvbGxhcHNlOiBmdW5jdGlvbiB0b2dnbGVDb2xsYXBzZShlKSB7XG5cdCAgICAgIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9uYXZiYXIgPSB0cnVlO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgdHJ5IHtcblx0ICAgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgJGRyb3Bkb3duID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bj5bZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScsIF90aGlzLiRlbCkucGFyZW50KCk7XG5cdCAgICAgICAgaWYgKCRkcm9wZG93bikge1xuXHQgICAgICAgICAgJGRyb3Bkb3duLm9uKCdjbGljaycsICcuZHJvcGRvd24tdG9nZ2xlJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub24oJ2NsaWNrJywgJy5kcm9wZG93bi1tZW51PmxpPmEnLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub25CbHVyKGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICAgICRkcm9wZG93bi5lYWNoKGZ1bmN0aW9uIChjb250ZW50KSB7XG5cdCAgICAgICAgICAgICAgaWYgKCFjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KSgpO1xuXHQgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGZpbmRpbmcgZHJvcGRvd24nKTtcblx0ICAgIH1cblx0XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLiRlbCkub24oJ2NsaWNrIHRvdWNoc3RhcnQnLCAnbGk6bm90KC5kcm9wZG93bik+YScsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIF90aGlzLmNvbGxhcHNlZCA9IHRydWU7XG5cdCAgICAgIH0sIDIwMCk7XG5cdCAgICB9KS5vbkJsdXIoZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgaWYgKCFfdGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpKSB7XG5cdCAgICAgICAgX3RoaXMuY29sbGFwc2VkID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICB2YXIgaGVpZ2h0ID0gdGhpcy4kZWwub2Zmc2V0SGVpZ2h0O1xuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAndG9wJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdUb3AgPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAnYm90dG9tJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdCb3R0b20gPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZUNvbGxhcHNlKGUpO1xuXHQgICAgfSk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bicsIHRoaXMuJGVsKS5vZmYoJ2NsaWNrJykub2ZmQmx1cigpO1xuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub2ZmKCdjbGljaycpO1xuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDEzMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCduYXYnLCB7XG5cdCAgICBjbGFzczogWyduYXZiYXInLCAnbmF2YmFyLScgKyBfdm0udHlwZSwgX3ZtLnBsYWNlbWVudCA9PT0gJ3N0YXRpYycgPyAnbmF2YmFyLXN0YXRpYy10b3AnIDogJ25hdmJhci1maXhlZC0nICsgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjb250YWluZXItZmx1aWRcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5hdmJhci1oZWFkZXJcIlxuXHQgIH0sIFsoIV92bS4kc2xvdHMuY29sbGFwc2UpID8gX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXZiYXItdG9nZ2xlIGNvbGxhcHNlZFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCIsXG5cdCAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBcImZhbHNlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS50b2dnbGVDb2xsYXBzZVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJzci1vbmx5XCJcblx0ICB9LCBbX3ZtLl92KFwiVG9nZ2xlIG5hdmlnYXRpb25cIildKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvbi1iYXJcIlxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uLWJhclwiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb24tYmFyXCJcblx0ICB9KV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImNvbGxhcHNlXCIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJicmFuZFwiKV0sIDIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGNsYXNzOiBbJ25hdmJhci1jb2xsYXBzZScsIHtcblx0ICAgICAgY29sbGFwc2U6IF92bS5jb2xsYXBzZWRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXYgbmF2YmFyLW5hdlwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKSwgX3ZtLl92KFwiIFwiKSwgKF92bS4kc2xvdHMubGVmdCkgPyBfdm0uX2MoJ3VsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibmF2IG5hdmJhci1uYXYgbmF2YmFyLWxlZnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJsZWZ0XCIpXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKF92bS4kc2xvdHMucmlnaHQpID8gX3ZtLl9jKCd1bCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5hdiBuYXZiYXItbmF2IG5hdmJhci1yaWdodFwiXG5cdCAgfSwgW192bS5fdChcInJpZ2h0XCIpXSwgMikgOiBfdm0uX2UoKV0pXSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0zOGYwNjE5ZVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzIpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTMzKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXE9wdGlvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNDIwODgxMTZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTQyMDg4MTE2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gT3B0aW9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEzMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHsgdmFsdWU6IG51bGwgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHsgbG9hZGluZzogdHJ1ZSB9O1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLiRwYXJlbnQuX3NlbGVjdCkge1xuXHQgICAgICBpZiAoIXRoaXMuJHBhcmVudC5vcHRpb25zKSB7XG5cdCAgICAgICAgdGhpcy4kcGFyZW50Lm9wdGlvbnMgPSBbXTtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZWwgPSB7fTtcblx0ICAgICAgZWxbdGhpcy4kcGFyZW50Lm9wdGlvbnNMYWJlbF0gPSB0aGlzLiRlbC5pbm5lckhUTUw7XG5cdCAgICAgIGVsW3RoaXMuJHBhcmVudC5vcHRpb25zVmFsdWVdID0gdGhpcy52YWx1ZTtcblx0ICAgICAgdGhpcy4kcGFyZW50Lm9wdGlvbnMucHVzaChlbCk7XG5cdCAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29uc29sZS53YXJuKCdvcHRpb25zIG9ubHkgd29yayBpbnNpZGUgYSBzZWxlY3QgY29tcG9uZW50Jyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTMzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiAoX3ZtLmxvYWRpbmcpID8gX3ZtLl9jKCdsaScsIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMikgOiBfdm0uX2UoKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi00MjA4ODExNlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMzUpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzcpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTM4KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFBhbmVsLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1iMWUwNDYxYVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtYjFlMDQ2MWFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBQYW5lbC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzNik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtYjFlMDQ2MWEhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1BhbmVsLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtYjFlMDQ2MWEhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1BhbmVsLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWNjb3JkaW9uLXRvZ2dsZSB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5jb2xsYXBzZS1lbnRlci1hY3RpdmUsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgLjVzIGVhc2U7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG4uY29sbGFwc2UtZW50ZXIsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxufVxcclxcblxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvUGFuZWwudnVlPzYwZTc5OGUyXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF5RUE7RUFDQSxnQkFBQTtDQUNBO0FBQ0E7O0VBRUEseUJBQUE7RUFDQSxpQkFBQTtDQUNBO0FBQ0E7O0NBR0FcIixcImZpbGVcIjpcIlBhbmVsLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IDpjbGFzcz1cXFwiWydwYW5lbCcscGFuZWxUeXBlXVxcXCI+XFxyXFxuICAgIDxkaXYgOmNsYXNzPVxcXCJbJ3BhbmVsLWhlYWRpbmcnLHsnYWNjb3JkaW9uLXRvZ2dsZSc6aW5BY2NvcmRpb259XVxcXCIgQGNsaWNrLnByZXZlbnQ9XFxcImluQWNjb3JkaW9uJiZ0b2dnbGUoKVxcXCI+XFxyXFxuICAgICAgPHNsb3QgbmFtZT1cXFwiaGVhZGVyXFxcIj48aDQgY2xhc3M9XFxcInBhbmVsLXRpdGxlXFxcIj57eyBoZWFkZXIgfX08L2g0Pjwvc2xvdD5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDx0cmFuc2l0aW9uXFxyXFxuICAgICAgbmFtZT1cXFwiY29sbGFwc2VcXFwiXFxyXFxuICAgICAgQGVudGVyPVxcXCJlbnRlclxcXCJcXHJcXG4gICAgICBAYWZ0ZXItZW50ZXI9XFxcImFmdGVyRW50ZXJcXFwiXFxyXFxuICAgICAgQGJlZm9yZS1sZWF2ZT1cXFwiYmVmb3JlTGVhdmVcXFwiXFxyXFxuICAgID5cXHJcXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1jb2xsYXBzZVxcXCIgdi1pZj1cXFwib3BlblxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIj5cXHJcXG4gICAgICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvdHJhbnNpdGlvbj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBpc09wZW46IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdHlwZToge3R5cGU6IFN0cmluZywgZGVmYXVsdCA6IG51bGx9XFxyXFxuICB9LFxcclxcbiAgZGF0YSgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBvcGVuOiB0aGlzLmlzT3BlblxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaXNPcGVuKCB2YWwgKSB7XFxyXFxuICAgICAgdGhpcy5vcGVuID0gdmFsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBpbkFjY29yZGlvbiAoKSB7IHJldHVybiB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50Ll9pc0FjY29yZGlvbiB9LFxcclxcbiAgICBwYW5lbFR5cGUgKCkgeyByZXR1cm4gJ3BhbmVsLScgKyAodGhpcy50eXBlIHx8ICh0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUpIHx8ICdkZWZhdWx0JykgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgdG9nZ2xlICgpIHtcXHJcXG4gICAgICB0aGlzLm9wZW4gPSAhdGhpcy5vcGVuXFxyXFxuICAgICAgaWYgKHRoaXMuaW5BY2NvcmRpb24pIHtcXHJcXG4gICAgICAgIHRoaXMuJHBhcmVudC5vcGVuQ2hpbGQodGhpcylcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGVudGVyIChlbCkge1xcclxcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJ1xcclxcbiAgICAgIHZhciBlbmRXaWR0aCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodFxcclxcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcwcHgnXFxyXFxuICAgICAgZWwub2Zmc2V0SGVpZ2h0IC8vIGZvcmNlIHJlcGFpbnRcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSBlbmRXaWR0aDtcXHJcXG4gICAgfSxcXHJcXG4gICAgYWZ0ZXJFbnRlciAoZWwpIHtcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0bydcXHJcXG4gICAgfSxcXHJcXG4gICAgYmVmb3JlTGVhdmUgKGVsKSB7XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCkuaGVpZ2h0XFxyXFxuICAgICAgZWwub2Zmc2V0SGVpZ2h0IC8vIGZvcmNlIHJlcGFpbnRcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnMHB4J1xcclxcbiAgICB9LFxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICBpZiAodGhpcy5pc09wZW4gPT09IG51bGwpIHtcXHJcXG4gICAgICB0aGlzLm9wZW4gPSAhdGhpcy5pbkFjY29yZGlvblxcclxcbiAgICB9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uYWNjb3JkaW9uLXRvZ2dsZSB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcbi5jb2xsYXBzZS1lbnRlci1hY3RpdmUsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgLjVzIGVhc2U7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbn1cXHJcXG4uY29sbGFwc2UtZW50ZXIsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxMzcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBoZWFkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBpc09wZW46IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIG9wZW46IHRoaXMuaXNPcGVuXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBpc09wZW46IGZ1bmN0aW9uIGlzT3Blbih2YWwpIHtcblx0ICAgICAgdGhpcy5vcGVuID0gdmFsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluQWNjb3JkaW9uOiBmdW5jdGlvbiBpbkFjY29yZGlvbigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuX2lzQWNjb3JkaW9uO1xuXHQgICAgfSxcblx0ICAgIHBhbmVsVHlwZTogZnVuY3Rpb24gcGFuZWxUeXBlKCkge1xuXHQgICAgICByZXR1cm4gJ3BhbmVsLScgKyAodGhpcy50eXBlIHx8IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSB8fCAnZGVmYXVsdCcpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XG5cdCAgICAgIGlmICh0aGlzLmluQWNjb3JkaW9uKSB7XG5cdCAgICAgICAgdGhpcy4kcGFyZW50Lm9wZW5DaGlsZCh0aGlzKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGVudGVyOiBmdW5jdGlvbiBlbnRlcihlbCkge1xuXHQgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG5cdCAgICAgIHZhciBlbmRXaWR0aCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodDtcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG5cdCAgICAgIGVsLm9mZnNldEhlaWdodDsgLy8gZm9yY2UgcmVwYWludFxuXHQgICAgICBlbC5zdHlsZS5oZWlnaHQgPSBlbmRXaWR0aDtcblx0ICAgIH0sXG5cdCAgICBhZnRlckVudGVyOiBmdW5jdGlvbiBhZnRlckVudGVyKGVsKSB7XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcblx0ICAgIH0sXG5cdCAgICBiZWZvcmVMZWF2ZTogZnVuY3Rpb24gYmVmb3JlTGVhdmUoZWwpIHtcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCkuaGVpZ2h0O1xuXHQgICAgICBlbC5vZmZzZXRIZWlnaHQ7IC8vIGZvcmNlIHJlcGFpbnRcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgaWYgKHRoaXMuaXNPcGVuID09PSBudWxsKSB7XG5cdCAgICAgIHRoaXMub3BlbiA9ICF0aGlzLmluQWNjb3JkaW9uO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDEzOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWydwYW5lbCcsIF92bS5wYW5lbFR5cGVdXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsncGFuZWwtaGVhZGluZycsIHtcblx0ICAgICAgJ2FjY29yZGlvbi10b2dnbGUnOiBfdm0uaW5BY2NvcmRpb25cblx0ICAgIH1dLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0uaW5BY2NvcmRpb24gJiYgX3ZtLnRvZ2dsZSgpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiaGVhZGVyXCIsIFtfdm0uX2MoJ2g0Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicGFuZWwtdGl0bGVcIlxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5oZWFkZXIpKV0pXSldLCAyKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6IFwiY29sbGFwc2VcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiZW50ZXJcIjogX3ZtLmVudGVyLFxuXHQgICAgICBcImFmdGVyLWVudGVyXCI6IF92bS5hZnRlckVudGVyLFxuXHQgICAgICBcImJlZm9yZS1sZWF2ZVwiOiBfdm0uYmVmb3JlTGVhdmVcblx0ICAgIH1cblx0ICB9LCBbKF92bS5vcGVuKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicGFuZWwtY29sbGFwc2VcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLWJvZHlcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKSA6IF92bS5fZSgpXSldLCAxKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1iMWUwNDYxYVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxNDApXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDIpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ0KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFBvcG92ZXIudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTI0NjViZjU0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0yNDY1YmY1NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFBvcG92ZXIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTQwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDEpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTI0NjViZjU0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Qb3BvdmVyLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtMjQ2NWJmNTQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1BvcG92ZXIudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTQxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5wb3BvdmVyLnRvcCxcXHJcXG4ucG9wb3Zlci5sZWZ0LFxcclxcbi5wb3BvdmVyLnJpZ2h0LFxcclxcbi5wb3BvdmVyLmJvdHRvbSB7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuLnNjYWxlLWVudGVyIHtcXHJcXG4gIGFuaW1hdGlvbjpzY2FsZS1pbiAwLjE1cyBlYXNlLWluO1xcbn1cXG4uc2NhbGUtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzY2FsZS1vdXQgMC4xNXMgZWFzZS1vdXQ7XFxufVxcbkBrZXlmcmFtZXMgc2NhbGUtaW4ge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbn1cXG5Aa2V5ZnJhbWVzIHNjYWxlLW91dCB7XFxuMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvUG9wb3Zlci52dWU/ZTYxNjk2M2FcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQXlCQTs7OztFQUlBLGVBQUE7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxvQkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxvQkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQVwiLFwiZmlsZVwiOlwiUG9wb3Zlci52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPHNwYW4gcmVmPVxcXCJ0cmlnZ2VyXFxcIj5cXHJcXG4gICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8dHJhbnNpdGlvbiA6bmFtZT1cXFwiZWZmZWN0XFxcIj5cXHJcXG4gICAgICA8ZGl2IHJlZj1cXFwicG9wb3ZlclxcXCIgdi1pZj1cXFwic2hvd1xcXCIgOmNsYXNzPVxcXCJbJ3BvcG92ZXInLHBsYWNlbWVudF1cXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXJyb3dcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGgzIGNsYXNzPVxcXCJwb3BvdmVyLXRpdGxlXFxcIiB2LWlmPVxcXCJ0aXRsZVxcXCI+PHNsb3QgbmFtZT1cXFwidGl0bGVcXFwiPnt7dGl0bGV9fTwvc2xvdD48L2gzPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicG9wb3Zlci1jb250ZW50XFxcIj48c2xvdCBuYW1lPVxcXCJjb250ZW50XFxcIj48c3BhbiB2LWh0bWw9XFxcImNvbnRlbnRcXFwiPjwvc3Bhbj48L3Nsb3Q+PC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvdHJhbnNpdGlvbj5cXHJcXG4gIDwvc3Bhbj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IFBvcG92ZXJNaXhpbiBmcm9tICcuL3V0aWxzL3BvcG92ZXJNaXhpbnMuanMnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgbWl4aW5zOiBbUG9wb3Zlck1peGluXSxcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIHRyaWdnZXI6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljayd9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4ucG9wb3Zlci50b3AsXFxyXFxuLnBvcG92ZXIubGVmdCxcXHJcXG4ucG9wb3Zlci5yaWdodCxcXHJcXG4ucG9wb3Zlci5ib3R0b20ge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcbi5zY2FsZS1lbnRlciB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtaW4gMC4xNXMgZWFzZS1pbjtcXHJcXG59XFxyXFxuLnNjYWxlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtb3V0IDAuMTVzIGVhc2Utb3V0O1xcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNjYWxlLWluIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNjYWxlLW91dCB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE0MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3BvcG92ZXJNaXhpbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0Myk7XG5cdFxuXHR2YXIgX3BvcG92ZXJNaXhpbnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9wb3Zlck1peGlucyk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIG1peGluczogW19wb3BvdmVyTWl4aW5zMi5kZWZhdWx0XSxcblx0ICBwcm9wczoge1xuXHQgICAgdHJpZ2dlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljaycgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDE0MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgY29udGVudDogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGVmZmVjdDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdmYWRlJyB9LFxuXHQgICAgaGVhZGVyOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0b3AnIH0sXG5cdCAgICB0aXRsZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHRyaWdnZXI6IHsgdHlwZTogU3RyaW5nIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB0b3A6IDAsXG5cdCAgICAgIGxlZnQ6IDAsXG5cdCAgICAgIHNob3c6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBldmVudHM6IGZ1bmN0aW9uIGV2ZW50cygpIHtcblx0ICAgICAgcmV0dXJuIHsgY29udGV4dG1lbnU6IFsnY29udGV4dG1lbnUnXSwgaG92ZXI6IFsnbW91c2VsZWF2ZScsICdtb3VzZWVudGVyJ10sIGZvY3VzOiBbJ2JsdXInLCAnZm9jdXMnXSB9W3RoaXMudHJpZ2dlcl0gfHwgWydjbGljayddO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgYmVmb3JlRW50ZXI6IGZ1bmN0aW9uIGJlZm9yZUVudGVyKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy5wb3NpdGlvbigpO1xuXHQgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gX3RoaXMucG9zaXRpb24oKTtcblx0ICAgICAgfSwgMzApO1xuXHQgICAgfSxcblx0ICAgIHBvc2l0aW9uOiBmdW5jdGlvbiBwb3NpdGlvbigpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHBvcG92ZXIgPSBfdGhpczIuJHJlZnMucG9wb3Zlcjtcblx0ICAgICAgICB2YXIgdHJpZ2dlciA9IF90aGlzMi4kcmVmcy50cmlnZ2VyLmNoaWxkcmVuWzBdO1xuXHQgICAgICAgIHN3aXRjaCAoX3RoaXMyLnBsYWNlbWVudCkge1xuXHQgICAgICAgICAgY2FzZSAndG9wJzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgLSBwb3BvdmVyLm9mZnNldFdpZHRoIC8gMiArIHRyaWdnZXIub2Zmc2V0V2lkdGggLyAyO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgLSBwb3BvdmVyLm9mZnNldEhlaWdodDtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlICdsZWZ0Jzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgLSBwb3BvdmVyLm9mZnNldFdpZHRoO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgKyB0cmlnZ2VyLm9mZnNldEhlaWdodCAvIDIgLSBwb3BvdmVyLm9mZnNldEhlaWdodCAvIDI7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSAncmlnaHQnOlxuXHQgICAgICAgICAgICBfdGhpczIubGVmdCA9IHRyaWdnZXIub2Zmc2V0TGVmdCArIHRyaWdnZXIub2Zmc2V0V2lkdGg7XG5cdCAgICAgICAgICAgIF90aGlzMi50b3AgPSB0cmlnZ2VyLm9mZnNldFRvcCArIHRyaWdnZXIub2Zmc2V0SGVpZ2h0IC8gMiAtIHBvcG92ZXIub2Zmc2V0SGVpZ2h0IC8gMjtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlICdib3R0b20nOlxuXHQgICAgICAgICAgICBfdGhpczIubGVmdCA9IHRyaWdnZXIub2Zmc2V0TGVmdCAtIHBvcG92ZXIub2Zmc2V0V2lkdGggLyAyICsgdHJpZ2dlci5vZmZzZXRXaWR0aCAvIDI7XG5cdCAgICAgICAgICAgIF90aGlzMi50b3AgPSB0cmlnZ2VyLm9mZnNldFRvcCArIHRyaWdnZXIub2Zmc2V0SGVpZ2h0O1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgIGNvbnNvbGUud2FybignV3JvbmcgcGxhY2VtZW50IHByb3AnKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcG9wb3Zlci5zdHlsZS50b3AgPSBfdGhpczIudG9wICsgJ3B4Jztcblx0ICAgICAgICBwb3BvdmVyLnN0eWxlLmxlZnQgPSBfdGhpczIubGVmdCArICdweCc7XG5cdCAgICAgIH0pO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKGUpIHtcblx0ICAgICAgaWYgKGUgJiYgdGhpcy50cmlnZ2VyID09PSAnY29udGV4dG1lbnUnKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgIHRoaXMuc2hvdyA9ICF0aGlzLnNob3c7XG5cdCAgICAgIGlmICh0aGlzLnNob3cpIHRoaXMuYmVmb3JlRW50ZXIoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgICB2YXIgdHJpZ2dlciA9IHRoaXMuJHJlZnMudHJpZ2dlci5jaGlsZHJlblswXTtcblx0ICAgIGlmICghdHJpZ2dlcikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHRyaWdnZXIgdi1lbCBpbiB5b3VyIGNvbXBvbmVudCB0aGF0IHVzZXMgcG9wb3Zlck1peGluLicpO1xuXHRcblx0ICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycgJiYgIX50cmlnZ2VyLnRhYkluZGV4KSB7XG5cdCAgICAgIHRyaWdnZXIgPSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnYSxpbnB1dCxzZWxlY3QsdGV4dGFyZWEsYnV0dG9uJywgdHJpZ2dlcik7XG5cdCAgICAgIGlmICghdHJpZ2dlci5sZW5ndGgpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRyaWdnZXIpLm9uKGV2ZW50LCBfdGhpczMudG9nZ2xlKTtcblx0ICAgIH0pO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl90cmlnZ2VyKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLl90cmlnZ2VyKS5vZmYoKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHJlZjogXCJ0cmlnZ2VyXCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6IF92bS5lZmZlY3Rcblx0ICAgIH1cblx0ICB9LCBbKF92bS5zaG93KSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgcmVmOiBcInBvcG92ZXJcIixcblx0ICAgIGNsYXNzOiBbJ3BvcG92ZXInLCBfdm0ucGxhY2VtZW50XVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFycm93XCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgKF92bS50aXRsZSkgPyBfdm0uX2MoJ2gzJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicG9wb3Zlci10aXRsZVwiXG5cdCAgfSwgW192bS5fdChcInRpdGxlXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50aXRsZSkpXSldLCAyKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBvcG92ZXItY29udGVudFwiXG5cdCAgfSwgW192bS5fdChcImNvbnRlbnRcIiwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhfdm0uY29udGVudClcblx0ICAgIH1cblx0ICB9KV0pXSwgMildKSA6IF92bS5fZSgpXSldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0yNDY1YmY1NFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE0NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDYpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ3KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFByb2dyZXNzYmFyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi02OGFhMzM3NVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNjhhYTMzNzVcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBQcm9ncmVzc2Jhci52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNDYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBhbmltYXRlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFiZWw6IHsgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5vdzogeyByZXF1aXJlZDogdHJ1ZSB9LFxuXHQgICAgc3RyaXBlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGxhYmVsQm9vbDogZnVuY3Rpb24gbGFiZWxCb29sKCkge1xuXHQgICAgICByZXR1cm4gX3V0aWxzLmNvZXJjZS5ib29sZWFuKHRoaXMubGFiZWwpO1xuXHQgICAgfSxcblx0ICAgIG5vd051bTogZnVuY3Rpb24gbm93TnVtKCkge1xuXHQgICAgICByZXR1cm4gX3V0aWxzLmNvZXJjZS5udW1iZXIodGhpcy5ub3cpO1xuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDE0NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWydwcm9ncmVzcy1iYXInLCAncHJvZ3Jlc3MtYmFyLScgKyBfdm0udHlwZSwge1xuXHQgICAgICBhY3RpdmU6IF92bS5hbmltYXRlZCxcblx0ICAgICAgJ3Byb2dyZXNzLWJhci1zdHJpcGVkJzogX3ZtLnN0cmlwZWRcblx0ICAgIH1dLFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIHdpZHRoOiBfdm0ubm93TnVtICsgJyUnXG5cdCAgICB9KSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidGV4dENvbnRlbnRcIjogX3ZtLl9zKF92bS5sYWJlbEJvb2wgPyBfdm0ubm93TnVtICsgJyUnIDogbnVsbClcblx0ICAgIH1cblx0ICB9KVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi02OGFhMzM3NVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE0OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxNDkpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTEpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUyKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFJhZGlvLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi03NGNmZDkyY1wiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNzRjZmQ5MmNcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBSYWRpby52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1MCk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzRjZmQ5MmMhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1JhZGlvLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzRjZmQ5MmMhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1JhZGlvLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4ucmFkaW8geyBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi5yYWRpbyA+IGxhYmVsID4gaW5wdXQge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICB6LWluZGV4OiAtMTtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcbi5yYWRpbyA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAuMTVyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IC43cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxufVxcbi5yYWRpbzpub3QoLmFjdGl2ZSkgPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xcbn1cXG4ucmFkaW8gPiBsYWJlbCA+IGlucHV0OmZvY3VzIH4gLmljb24ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcbn1cXG4ucmFkaW8uYWN0aXZlID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lQanhqYVhKamJHVWdZM2c5SWpVaUlHTjVQU0kxSWlCeVBTSTBJaUJtYVd4c1BTSWpabVptSWk4K1BDOXpkbWMrKTtcXG59XFxuLnJhZGlvLmFjdGl2ZSAuYnRuLWRlZmF1bHQgeyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTtcXG59XFxuLnJhZGlvLmRpc2FibGVkID4gbGFiZWwgPiAuaWNvbixcXHJcXG4ucmFkaW8ucmVhZG9ubHkgPiBsYWJlbCA+IC5pY29uLFxcclxcbi5idG4ucmVhZG9ubHkge1xcclxcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1KTtcXHJcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICBvcGFjaXR5OiAuNjU7XFxufVxcbmxhYmVsLmJ0biA+IGlucHV0W3R5cGU9cmFkaW9dIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9SYWRpby52dWU/MjZkZTYxODRcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQW1HQSxTQUFBLG1CQUFBO0NBQUE7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsVUFBQTtFQUNBLFdBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLHVCQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLFFBQUE7RUFDQSxlQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0VBQ0EscUJBQUE7RUFDQSw2QkFBQTtFQUNBLG1DQUFBO0VBQ0EseUJBQUE7Q0FDQTtBQUNBO0VBQ0EsdUJBQUE7RUFDQSx1QkFBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsMEJBQUE7RUFDQSwwRUFBQTtDQUNBO0FBQ0E7RUFDQSwyQkFBQTtFQUNBLDhPQUFBO0NBQ0E7QUFDQSw2QkFBQSx3QkFBQTtDQUFBO0FBRUE7OztFQUdBLDBCQUFBO0VBQ0EsaUJBQUE7RUFDQSxhQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0Esb0JBQUE7RUFDQSxxQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJSYWRpby52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiA6aXM9XFxcImJ1dHRvblN0eWxlPydsYWJlbCc6J2RpdidcXFwiIEBjbGljay5wcmV2ZW50PVxcXCJ0b2dnbGVcXFwiXFxyXFxuICAgIDpjbGFzcz1cXFwiWyhidXR0b25TdHlsZT8nYnRuIGJ0bi0nK3R5cGVDb2xvcjoncmFkaW8gJyt0eXBlQ29sb3IpLHthY3RpdmU6YWN0aXZlLGRpc2FibGVkOmRpc2FibGVkLHJlYWRvbmx5OnJlYWRvbmx5fV1cXFwiXFxyXFxuICA+XFxyXFxuICAgIDx0ZW1wbGF0ZSB2LWlmPVxcXCJidXR0b25TdHlsZVxcXCI+XFxyXFxuICAgICAgPGlucHV0IHR5cGU9XFxcInJhZGlvXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJpbnB1dFxcXCJcXHJcXG4gICAgICAgIHYtc2hvdz1cXFwiIXJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgdi1tb2RlbD1cXFwiY2hlY2tcXFwiXFxyXFxuICAgICAgICA6dmFsdWU9XFxcImNoZWNrZWRWYWx1ZVxcXCJcXHJcXG4gICAgICAgIDpuYW1lPVxcXCJuYW1lXFxcIlxcclxcbiAgICAgICAgOnJlYWRvbmx5PVxcXCJyZWFkb25seVxcXCJcXHJcXG4gICAgICAgIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiXFxyXFxuICAgICAgLz5cXHJcXG4gICAgICA8c2xvdD48L3Nsb3Q+XFxyXFxuICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgIDxsYWJlbCB2LWVsc2UgY2xhc3M9XFxcIm9wZW5cXFwiPlxcclxcbiAgICAgIDxpbnB1dCB0eXBlPVxcXCJyYWRpb1xcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICB2LW1vZGVsPVxcXCJjaGVja1xcXCJcXHJcXG4gICAgICAgIDp2YWx1ZT1cXFwiY2hlY2tlZFZhbHVlXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAvPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbYWN0aXZlPydidG4tJyt0eXBlQ29sb3I6Jycse2JnOnR5cGVDb2xvcj09PSdkZWZhdWx0J31dXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiYWN0aXZlJiZ0eXBlQ29sb3I9PT0nZGVmYXVsdCdcXFwiIGNsYXNzPVxcXCJpY29uXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8L2xhYmVsPlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgY2hlY2tlZFZhbHVlOiB7ZGVmYXVsdDogdHJ1ZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcmVhZG9ubHk6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGNoZWNrOiB0aGlzLnZhbHVlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBhY3RpdmUgKCkgeyByZXR1cm4gdGhpcy5jaGVjayA9PT0gdGhpcy5jaGVja2VkVmFsdWUgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKCkgeyByZXR1cm4gdGhpcy5faW5Hcm91cCA/IHRoaXMuJHBhcmVudC52YWwgPT09IHRoaXMudmFsdWUgOiBudWxsIH0sXFxyXFxuICAgIGJ1dHRvblN0eWxlICgpIHsgcmV0dXJuIHRoaXMuYnV0dG9uIHx8ICh0aGlzLl9pbkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zKSB9LFxcclxcbiAgICB0eXBlQ29sb3IgKCkgeyByZXR1cm4gKHRoaXMudHlwZSB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC50eXBlKSkgfHwgJ2RlZmF1bHQnIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBjaGVjayAodmFsKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuY2hlY2tlZFZhbHVlID09PSB2YWwpIHtcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hlY2tlZCcsIHRydWUpXFxyXFxuICAgICAgICBpZiAodGhpcy5faW5Hcm91cCkgeyB0aGlzLiRwYXJlbnQudmFsID0gdmFsIH1cXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHBhcmVudFZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy5jaGVjayAhPT0gdmFsICYmIHRoaXMuY2hlY2tlZFZhbHVlID09PSB2YWwpIHsgdGhpcy5jaGVjayA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICB0aGlzLmNoZWNrID0gdGhpcy5jaGVja2VkVmFsdWUgPT09IHZhbCA/IHZhbCA6IG51bGxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9idG5Hcm91cCAmJiAhcGFyZW50Ll9jaGVja2JveEdyb3VwKSB7XFxyXFxuICAgICAgdGhpcy5faW5Hcm91cCA9IHRydWVcXHJcXG4gICAgICBwYXJlbnQuX3JhZGlvR3JvdXAgPSB0cnVlXFxyXFxuICAgIH1cXHJcXG4gICAgaWYgKHRoaXMuJHBhcmVudC5fcmFkaW9Hcm91cCkge1xcclxcbiAgICAgIGlmICh0aGlzLiRwYXJlbnQudmFsKSB7XFxyXFxuICAgICAgICB0aGlzLmNoZWNrID0gKHRoaXMuJHBhcmVudC52YWwgPT09IHRoaXMuY2hlY2tlZFZhbHVlKVxcclxcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGVjaykge1xcclxcbiAgICAgICAgdGhpcy4kcGFyZW50LnZhbCA9IHRoaXMuY2hlY2tlZFZhbHVlXFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBmb2N1cyAoKSB7XFxyXFxuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsgcmV0dXJuIH1cXHJcXG4gICAgICB0aGlzLmZvY3VzKClcXHJcXG4gICAgICBpZiAodGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLmNoZWNrZWRWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLl9pbkdyb3VwKSB7XFxyXFxuICAgICAgICB0aGlzLiRwYXJlbnQudmFsID0gdGhpcy5jaGVja2VkVmFsdWVcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlIHNjb3BlPlxcclxcbi5yYWRpbyB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgfVxcclxcbi5yYWRpbyA+IGxhYmVsID4gaW5wdXQge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICB6LWluZGV4OiAtMTtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxufVxcclxcbi5yYWRpbyA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAuMTVyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IC43cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxyXFxufVxcclxcbi5yYWRpbzpub3QoLmFjdGl2ZSkgPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xcclxcbn1cXHJcXG4ucmFkaW8gPiBsYWJlbCA+IGlucHV0OmZvY3VzIH4gLmljb24ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcclxcbn1cXHJcXG4ucmFkaW8uYWN0aXZlID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lQanhqYVhKamJHVWdZM2c5SWpVaUlHTjVQU0kxSWlCeVBTSTBJaUJtYVd4c1BTSWpabVptSWk4K1BDOXpkbWMrKTtcXHJcXG59XFxyXFxuLnJhZGlvLmFjdGl2ZSAuYnRuLWRlZmF1bHQgeyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTsgfVxcclxcblxcclxcbi5yYWRpby5kaXNhYmxlZCA+IGxhYmVsID4gLmljb24sXFxyXFxuLnJhZGlvLnJlYWRvbmx5ID4gbGFiZWwgPiAuaWNvbixcXHJcXG4uYnRuLnJlYWRvbmx5IHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcclxcbn1cXHJcXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPXJhZGlvXSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBidXR0b246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGNoZWNrZWRWYWx1ZTogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGNoZWNrOiB0aGlzLnZhbHVlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY2hlY2sgPT09IHRoaXMuY2hlY2tlZFZhbHVlO1xuXHQgICAgfSxcblx0ICAgIHBhcmVudFZhbHVlOiBmdW5jdGlvbiBwYXJlbnRWYWx1ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX2luR3JvdXAgPyB0aGlzLiRwYXJlbnQudmFsID09PSB0aGlzLnZhbHVlIDogbnVsbDtcblx0ICAgIH0sXG5cdCAgICBidXR0b25TdHlsZTogZnVuY3Rpb24gYnV0dG9uU3R5bGUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmJ1dHRvbiB8fCB0aGlzLl9pbkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zO1xuXHQgICAgfSxcblx0ICAgIHR5cGVDb2xvcjogZnVuY3Rpb24gdHlwZUNvbG9yKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50eXBlIHx8IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSB8fCAnZGVmYXVsdCc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgY2hlY2s6IGZ1bmN0aW9uIGNoZWNrKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy5jaGVja2VkVmFsdWUgPT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgICAgICB0aGlzLiRlbWl0KCdjaGVja2VkJywgdHJ1ZSk7XG5cdCAgICAgICAgaWYgKHRoaXMuX2luR3JvdXApIHtcblx0ICAgICAgICAgIHRoaXMuJHBhcmVudC52YWwgPSB2YWw7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy5jaGVjayAhPT0gdmFsICYmIHRoaXMuY2hlY2tlZFZhbHVlID09PSB2YWwpIHtcblx0ICAgICAgICB0aGlzLmNoZWNrID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICB0aGlzLmNoZWNrID0gdGhpcy5jaGVja2VkVmFsdWUgPT09IHZhbCA/IHZhbCA6IG51bGw7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcblx0ICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9idG5Hcm91cCAmJiAhcGFyZW50Ll9jaGVja2JveEdyb3VwKSB7XG5cdCAgICAgIHRoaXMuX2luR3JvdXAgPSB0cnVlO1xuXHQgICAgICBwYXJlbnQuX3JhZGlvR3JvdXAgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuJHBhcmVudC5fcmFkaW9Hcm91cCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50LnZhbCkge1xuXHQgICAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLiRwYXJlbnQudmFsID09PSB0aGlzLmNoZWNrZWRWYWx1ZTtcblx0ICAgICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrKSB7XG5cdCAgICAgICAgdGhpcy4kcGFyZW50LnZhbCA9IHRoaXMuY2hlY2tlZFZhbHVlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0XG5cdCAgbWV0aG9kczoge1xuXHQgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHQgICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuZm9jdXMoKTtcblx0ICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5jaGVjayA9IHRoaXMuY2hlY2tlZFZhbHVlO1xuXHQgICAgICBpZiAodGhpcy5faW5Hcm91cCkge1xuXHQgICAgICAgIHRoaXMuJHBhcmVudC52YWwgPSB0aGlzLmNoZWNrZWRWYWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDE1MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKF92bS5idXR0b25TdHlsZSA/ICdsYWJlbCcgOiAnZGl2Jywge1xuXHQgICAgdGFnOiBcImRpdlwiLFxuXHQgICAgY2xhc3M6IFsoX3ZtLmJ1dHRvblN0eWxlID8gJ2J0biBidG4tJyArIF92bS50eXBlQ29sb3IgOiAncmFkaW8gJyArIF92bS50eXBlQ29sb3IpLCB7XG5cdCAgICAgIGFjdGl2ZTogX3ZtLmFjdGl2ZSxcblx0ICAgICAgZGlzYWJsZWQ6IF92bS5kaXNhYmxlZCxcblx0ICAgICAgcmVhZG9ubHk6IF92bS5yZWFkb25seVxuXHQgICAgfV0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS50b2dnbGUoJGV2ZW50KVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uYnV0dG9uU3R5bGUpID8gW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6ICghX3ZtLnJlYWRvbmx5KSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCIhcmVhZG9ubHlcIlxuXHQgICAgfSwge1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jaGVjayksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY2hlY2tcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInJhZGlvXCIsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCIsXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJ2YWx1ZVwiOiBfdm0uY2hlY2tlZFZhbHVlLFxuXHQgICAgICBcImNoZWNrZWRcIjogX3ZtLl9xKF92bS5jaGVjaywgX3ZtLmNoZWNrZWRWYWx1ZSlcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jaGVjayA9IF92bS5jaGVja2VkVmFsdWVcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSA6IF92bS5fYygnbGFiZWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJvcGVuXCJcblx0ICB9LCBbX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwibW9kZWxcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LW1vZGVsXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmNoZWNrKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJjaGVja1wiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJpbnB1dFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwicmFkaW9cIixcblx0ICAgICAgXCJhdXRvY29tcGxldGVcIjogXCJvZmZcIixcblx0ICAgICAgXCJuYW1lXCI6IF92bS5uYW1lLFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seSxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5jaGVja2VkVmFsdWUsXG5cdCAgICAgIFwiY2hlY2tlZFwiOiBfdm0uX3EoX3ZtLmNoZWNrLCBfdm0uY2hlY2tlZFZhbHVlKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLmNoZWNrID0gX3ZtLmNoZWNrZWRWYWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb24gZHJvcGRvd24tdG9nZ2xlXCIsXG5cdCAgICBjbGFzczogW192bS5hY3RpdmUgPyAnYnRuLScgKyBfdm0udHlwZUNvbG9yIDogJycsIHtcblx0ICAgICAgYmc6IF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0J1xuXHQgICAgfV1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgKF92bS5hY3RpdmUgJiYgX3ZtLnR5cGVDb2xvciA9PT0gJ2RlZmF1bHQnKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb25cIlxuXHQgIH0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRlZmF1bHRcIildLCAyKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTc0Y2ZkOTJjXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTUzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE1NClcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1Nilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcU2VsZWN0LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtZTUxNGRiYzZcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWU1MTRkYmM2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1lNTE0ZGJjNlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFNlbGVjdC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1NSk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtZTUxNGRiYzYmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1NlbGVjdC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWU1MTRkYmM2JnNjb3BlZD10cnVlIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TZWxlY3QudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTU1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlW2RhdGEtdi1lNTE0ZGJjNl17XFxyXFxuICBoZWlnaHQ6IGF1dG87XFxyXFxuICBwYWRkaW5nLXJpZ2h0OiAyNHB4O1xcbn1cXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZVtkYXRhLXYtZTUxNGRiYzZdOmFmdGVye1xcclxcbiAgY29udGVudDogJyAnO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgcmlnaHQ6IDEzcHg7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIG1hcmdpbjogLTFweCAwIDA7XFxyXFxuICBib3JkZXItdG9wOiA0cHggZGFzaGVkO1xcclxcbiAgYm9yZGVyLXRvcDogNHB4IHNvbGlkIFxcXFw5O1xcclxcbiAgYm9yZGVyLXJpZ2h0OiA0cHggc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxuICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbn1cXG4uYnMtc2VhcmNoYm94W2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgbWFyZ2luOiA0cHggOHB4O1xcbn1cXG4uYnMtc2VhcmNoYm94IC5jbG9zZVtkYXRhLXYtZTUxNGRiYzZdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmJzLXNlYXJjaGJveCBpbnB1dFtkYXRhLXYtZTUxNGRiYzZdOmZvY3VzLFxcclxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlW2RhdGEtdi1lNTE0ZGJjNl06Zm9jdXMge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlci1jb2xvcjogIzY2YWZlOSAhaW1wb3J0YW50O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXG59XFxuLnNlY3JldFtkYXRhLXYtZTUxNGRiYzZdIHtcXHJcXG4gIGJvcmRlcjogMDtcXHJcXG4gIGNsaXA6IHJlY3QoMCAwIDAgMCk7XFxyXFxuICBoZWlnaHQ6IDFweDtcXHJcXG4gIG1hcmdpbjogLTFweDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgd2lkdGg6IDFweDtcXG59XFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU+LmNsb3NlW2RhdGEtdi1lNTE0ZGJjNl0geyBtYXJnaW4tbGVmdDogNXB4O1xcbn1cXG4ubm90aWZ5Lm91dFtkYXRhLXYtZTUxNGRiYzZdIHsgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4ubm90aWZ5LmluW2RhdGEtdi1lNTE0ZGJjNl0sXFxyXFxuLm5vdGlmeT5kaXZbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB3aWR0aDogOTYlO1xcclxcbiAgbWFyZ2luOiAwIDIlO1xcclxcbiAgbWluLWhlaWdodDogMjZweDtcXHJcXG4gIHBhZGRpbmc6IDNweCA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2UzZTNlMztcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLm5vdGlmeT5kaXZbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICB0b3A6IDVweDtcXHJcXG4gIHotaW5kZXg6IDE7XFxufVxcbi5ub3RpZnkuaW5bZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXHJcXG4gIGJvdHRvbTogNXB4O1xcbn1cXG4uYnRuLWdyb3VwLWp1c3RpZmllZCAuZHJvcGRvd24tdG9nZ2xlPnNwYW5bZGF0YS12LWU1MTRkYmM2XTpub3QoLmNsb3NlKSB7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gMThweCk7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogLTRweDtcXG59XFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLW1lbnVbZGF0YS12LWU1MTRkYmM2XSB7IHdpZHRoOiAxMDAlO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1NlbGVjdC52dWU/M2VkNWE0MjJcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQW1RQTtFQUNBLGFBQUE7RUFDQSxvQkFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsU0FBQTtFQUNBLGlCQUFBO0VBQ0EsdUJBQUE7RUFDQSx5QkFBQTtFQUNBLG9DQUFBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxnQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLGVBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBOztFQUVBLFdBQUE7RUFDQSxpQ0FBQTtFQUNBLDBFQUFBO0NBQ0E7QUFDQTtFQUNBLFVBQUE7RUFDQSxvQkFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0EsaUJBQUE7RUFDQSxXQUFBO0VBQ0EsbUJBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQSx3REFBQSxpQkFBQTtDQUFBO0FBQ0EsK0JBQUEsbUJBQUE7Q0FBQTtBQUNBOztFQUVBLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLGFBQUE7RUFDQSxpQkFBQTtFQUNBLGlCQUFBO0VBQ0Esb0JBQUE7RUFDQSwwQkFBQTtFQUNBLDRDQUFBO0VBQ0EscUJBQUE7Q0FDQTtBQUNBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsWUFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EseUJBQUE7RUFDQSxzQkFBQTtFQUNBLGlCQUFBO0VBQ0Esb0JBQUE7RUFDQSx3QkFBQTtFQUNBLG9CQUFBO0NBQ0E7QUFDQSx1REFBQSxZQUFBO0NBQUFcIixcImZpbGVcIjpcIlNlbGVjdC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiByZWY9XFxcInNlbGVjdFxcXCIgOmNsYXNzPVxcXCJjbGFzc2VzXFxcIiB2LWNsaWNrLW91dHNpZGU9XFxcImNsb3NlXFxcIj5cXHJcXG4gICAgPGRpdiByZWY9XFxcImJ0blxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBkcm9wZG93bi10b2dnbGVcXFwiIHRhYmluZGV4PVxcXCIxXFxcIiA6ZGlzYWJsZWQ9XFxcImRpc2FibGVkIHx8ICFoYXNQYXJlbnRcXFwiIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiXFxyXFxuICAgICAgQGJsdXI9XFxcImNhblNlYXJjaCA/IG51bGwgOiBjbG9zZSgpXFxcIlxcclxcbiAgICAgIEBjbGljaz1cXFwidG9nZ2xlKClcXFwiXFxyXFxuICAgICAgQGtleWRvd24uZXNjLnN0b3AucHJldmVudD1cXFwiY2xvc2VcXFwiXFxyXFxuICAgICAgQGtleWRvd24uc3BhY2Uuc3RvcC5wcmV2ZW50PVxcXCJ0b2dnbGVcXFwiXFxyXFxuICAgICAgQGtleWRvd24uZW50ZXIuc3RvcC5wcmV2ZW50PVxcXCJ0b2dnbGVcXFwiXFxyXFxuICAgID5cXHJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiYnRuLWNvbnRlbnRcXFwiIHYtaHRtbD1cXFwibG9hZGluZyA/IHRleHQubG9hZGluZyA6IHNob3dQbGFjZWhvbGRlciB8fCBzZWxlY3RlZFxcXCI+PC9zcGFuPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImNsZWFyQnV0dG9uJiZ2YWx1ZXMubGVuZ3RoXFxcIiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwiY2xlYXIoKVxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDxzZWxlY3QgcmVmPVxcXCJzZWxcXFwiIHYtbW9kZWw9XFxcInZhbFxcXCIgOm5hbWU9XFxcIm5hbWVcXFwiIGNsYXNzPVxcXCJzZWNyZXRcXFwiIDptdWx0aXBsZT1cXFwibXVsdGlwbGVcXFwiIDpyZXF1aXJlZD1cXFwicmVxdWlyZWRcXFwiIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiPlxcclxcbiAgICAgIDxvcHRpb24gdi1pZj1cXFwicmVxdWlyZWRcXFwiIHZhbHVlPVxcXCJcXFwiPjwvb3B0aW9uPlxcclxcbiAgICAgIDxvcHRpb24gdi1mb3I9XFxcIm9wdGlvbiBpbiBsaXN0XFxcIiA6dmFsdWU9XFxcIm9wdGlvbltvcHRpb25zVmFsdWVdXFxcIj57eyBvcHRpb25bb3B0aW9uc0xhYmVsXSB9fTwvb3B0aW9uPlxcclxcbiAgICA8L3NlbGVjdD5cXHJcXG4gICAgPHVsIGNsYXNzPVxcXCJkcm9wZG93bi1tZW51XFxcIj5cXHJcXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cXFwibGlzdC5sZW5ndGhcXFwiPlxcclxcbiAgICAgICAgPGxpIHYtaWY9XFxcImNhblNlYXJjaFxcXCIgY2xhc3M9XFxcImJzLXNlYXJjaGJveFxcXCI+XFxyXFxuICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiA6cGxhY2Vob2xkZXI9XFxcInNlYXJjaFRleHR8fHRleHQuc2VhcmNoXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJzZWFyY2hcXFwiXFxyXFxuICAgICAgICAgICAgdi1tb2RlbD1cXFwic2VhcmNoVmFsdWVcXFwiXFxyXFxuICAgICAgICAgICAgQGtleXVwLmVzYz1cXFwiY2xvc2VcXFwiXFxyXFxuICAgICAgICAgIC8+XFxyXFxuICAgICAgICAgIDxzcGFuIHYtc2hvdz1cXFwic2VhcmNoVmFsdWVcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJjbGVhclNlYXJjaFxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDwvbGk+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwicmVxdWlyZWQmJiFjbGVhckJ1dHRvblxcXCI+PGEgQG1vdXNlZG93bi5wcmV2ZW50PVxcXCJjbGVhcigpICYmIGNsb3NlKClcXFwiPnt7IHBsYWNlaG9sZGVyIHx8IHRleHQubm90U2VsZWN0ZWQgfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDxsaSB2LWZvcj1cXFwib3B0aW9uIGluIGZpbHRlcmVkT3B0aW9uc1xcXCIgOmlkPVxcXCJvcHRpb25bb3B0aW9uc1ZhbHVlXVxcXCI+XFxyXFxuICAgICAgICAgIDxhIEBtb3VzZWRvd24ucHJldmVudD1cXFwic2VsZWN0KG9wdGlvbltvcHRpb25zVmFsdWVdKVxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gdi1odG1sPVxcXCJvcHRpb25bb3B0aW9uc0xhYmVsXVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcXFwiIHYtc2hvdz1cXFwiaXNTZWxlY3RlZChvcHRpb25bb3B0aW9uc1ZhbHVlXSlcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgPC9hPlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgIWNsb3NlT25TZWxlY3RcXFwiIG5hbWU9XFxcImZhZGVpblxcXCI+PGRpdiBjbGFzcz1cXFwibm90aWZ5IGluXFxcIj57e2xpbWl0VGV4dH19PC9kaXY+PC90cmFuc2l0aW9uPlxcclxcbiAgICA8L3VsPlxcclxcbiAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgY2xvc2VPblNlbGVjdFxcXCIgbmFtZT1cXFwiZmFkZWluXFxcIj48ZGl2IGNsYXNzPVxcXCJub3RpZnkgb3V0XFxcIj48ZGl2Pnt7bGltaXRUZXh0fX08L2Rpdj48L2Rpdj48L3RyYW5zaXRpb24+XFxyXFxuICAgIDwhLS0gPHByZT5PcHRpb25zOiB7e2xpc3R9fTwvcHJlPiAtLT5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge3RyYW5zbGF0aW9uc30gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgQ2xpY2tPdXRzaWRlIGZyb20gJy4vZGlyZWN0aXZlcy9DbGlja091dHNpZGUuanMnXFxyXFxuXFxyXFxudmFyIHRpbWVvdXQgPSB7fVxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIGRpcmVjdGl2ZXM6IHtcXHJcXG4gICAgQ2xpY2tPdXRzaWRlXFxyXFxuICB9LFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGNsb3NlT25TZWxlY3Q6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYW5nOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2V9LFxcclxcbiAgICBsaW1pdDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMTAyNH0sXFxyXFxuICAgIG1pblNlYXJjaDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMH0sXFxyXFxuICAgIG11bHRpcGxlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgb3B0aW9uczoge3R5cGU6IEFycmF5LCBkZWZhdWx0ICgpIHsgcmV0dXJuIFtdIH19LFxcclxcbiAgICBvcHRpb25zTGFiZWw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdsYWJlbCd9LFxcclxcbiAgICBvcHRpb25zVmFsdWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd2YWx1ZSd9LFxcclxcbiAgICBwYXJlbnQ6IHtkZWZhdWx0OiB0cnVlfSxcXHJcXG4gICAgcGxhY2Vob2xkZXI6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZXF1aXJlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBzZWFyY2g6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHNlYXJjaFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB1cmw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB2YWx1ZTogbnVsbFxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGxpc3Q6IFtdLFxcclxcbiAgICAgIGxvYWRpbmc6IG51bGwsXFxyXFxuICAgICAgc2VhcmNoVmFsdWU6IG51bGwsXFxyXFxuICAgICAgc2hvdzogZmFsc2UsXFxyXFxuICAgICAgbm90aWZ5OiBmYWxzZSxcXHJcXG4gICAgICB2YWw6IG51bGwsXFxyXFxuICAgICAgdmFsaWQ6IG51bGxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGNhblNlYXJjaCAoKSB7IHJldHVybiB0aGlzLm1pblNlYXJjaCA/IHRoaXMubGlzdC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2ggOiB0aGlzLnNlYXJjaCB9LFxcclxcbiAgICBjbGFzc2VzICgpIHsgcmV0dXJuIFt7b3BlbjogdGhpcy5zaG93LCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZH0sIHRoaXMuY2xhc3MsIHRoaXMuaXNMaSA/ICdkcm9wZG93bicgOiB0aGlzLmluSW5wdXQgPyAnaW5wdXQtZ3JvdXAtYnRuJyA6ICdidG4tZ3JvdXAnXSB9LFxcclxcbiAgICBmaWx0ZXJlZE9wdGlvbnMgKCkge1xcclxcbiAgICAgIHZhciBzZWFyY2ggPSAodGhpcy5zZWFyY2hWYWx1ZSB8fCAnJykudG9Mb3dlckNhc2UoKVxcclxcbiAgICAgIHJldHVybiAhc2VhcmNoID8gdGhpcy5saXN0IDogdGhpcy5saXN0LmZpbHRlcihlbCA9PiB7XFxyXFxuICAgICAgICByZXR1cm4gfmVsW3RoaXMub3B0aW9uc0xhYmVsXS50b0xvd2VyQ2FzZSgpLnNlYXJjaChzZWFyY2gpXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgaGFzUGFyZW50ICgpIHsgcmV0dXJuIHRoaXMucGFyZW50IGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLnBhcmVudC5sZW5ndGggOiB0aGlzLnBhcmVudCB9LFxcclxcbiAgICBpbklucHV0ICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQgfSxcXHJcXG4gICAgaXNMaSAoKSB7IHJldHVybiB0aGlzLiRwYXJlbnQuX25hdmJhciB8fCB0aGlzLiRwYXJlbnQubWVudSB8fCB0aGlzLiRwYXJlbnQuX3RhYnNldCB9LFxcclxcbiAgICBsaW1pdFRleHQgKCkgeyByZXR1cm4gdGhpcy50ZXh0LmxpbWl0LnJlcGxhY2UoJ3t7bGltaXR9fScsIHRoaXMubGltaXQpIH0sXFxyXFxuICAgIHNlbGVjdGVkICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJycgfVxcclxcbiAgICAgIHZhciBzZWwgPSB0aGlzLnZhbHVlcy5tYXAodmFsID0+ICh0aGlzLmxpc3QuZmluZChvID0+IG9bdGhpcy5vcHRpb25zVmFsdWVdID09PSB2YWwpIHx8IHt9KVt0aGlzLm9wdGlvbnNMYWJlbF0pLmZpbHRlcih2YWwgPT4gdmFsICE9PSB1bmRlZmluZWQpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0ZWQnLCBzZWwpXFxyXFxuICAgICAgcmV0dXJuIHNlbC5qb2luKCcsICcpXFxyXFxuICAgIH0sXFxyXFxuICAgIHNob3dQbGFjZWhvbGRlciAoKSB7IHJldHVybiAodGhpcy52YWx1ZXMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmhhc1BhcmVudCkgPyAodGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLnRleHQubm90U2VsZWN0ZWQpIDogbnVsbCB9LFxcclxcbiAgICB0ZXh0ICgpIHsgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpIH0sXFxyXFxuICAgIHZhbHVlcyAoKSB7IHJldHVybiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwgOiB+W251bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih0aGlzLnZhbCkgPyBbXSA6IFt0aGlzLnZhbF0gfSxcXHJcXG4gICAgdmFsT3B0aW9ucyAoKSB7IHJldHVybiB0aGlzLmxpc3QubWFwKGVsID0+IGVsW3RoaXMub3B0aW9uc1ZhbHVlXSkgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIG9wdGlvbnMgKG9wdGlvbnMpIHtcXHJcXG4gICAgICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5KSB0aGlzLnNldE9wdGlvbnMob3B0aW9ucylcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAodmFsKSB7XFxyXFxuICAgICAgaWYgKHZhbCkge1xcclxcbiAgICAgICAgdGhpcy4kcmVmcy5zZWFyY2ggPyB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpIDogdGhpcy4kcmVmcy5idG4uZm9jdXMoKVxcclxcbiAgICAgICAgLy8gb25CbHVyKHRoaXMuJHJlZnMuc2VsZWN0LCBlID0+IHsgdGhpcy5zaG93ID0gZmFsc2UgfSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgLy8gb2ZmQmx1cih0aGlzLiRyZWZzLnNlbGVjdClcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHVybCAoKSB7XFxyXFxuICAgICAgdGhpcy51cmxDaGFuZ2VkKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKVxcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsgdGhpcy52YWwgPSB2YWwgPSBudWxsIH1cXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHtcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbClcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXkgJiYgdmFsLmxlbmd0aCA+IHRoaXMubGltaXQpIHtcXHJcXG4gICAgICAgIHRoaXMudmFsID0gdmFsLnNsaWNlKDAsIHRoaXMubGltaXQpXFxyXFxuICAgICAgICB0aGlzLm5vdGlmeSA9IHRydWVcXHJcXG4gICAgICAgIGlmICh0aW1lb3V0LmxpbWl0KSBjbGVhclRpbWVvdXQodGltZW91dC5saW1pdClcXHJcXG4gICAgICAgIHRpbWVvdXQubGltaXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgdGltZW91dC5saW1pdCA9IGZhbHNlXFxyXFxuICAgICAgICAgIHRoaXMubm90aWZ5ID0gZmFsc2VcXHJcXG4gICAgICAgIH0sIDE1MDApXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgY2xvc2UgKCkge1xcclxcbiAgICAgIHRoaXMuc2hvdyA9IGZhbHNlXFxyXFxuICAgIH0sXFxyXFxuICAgIGNoZWNrRGF0YSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcXHJcXG4gICAgICAgIGlmICh0aGlzLmxpbWl0IDwgMSkgeyB0aGlzLmxpbWl0ID0gMSB9XFxyXFxuICAgICAgICBpZiAoISh0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xcclxcbiAgICAgICAgICB0aGlzLnZhbCA9ICh0aGlzLnZhbCA9PT0gbnVsbCB8fCB0aGlzLnZhbCA9PT0gdW5kZWZpbmVkKSA/IFtdIDogW3RoaXMudmFsXVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsT3B0aW9uc1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbC5maWx0ZXIoZWwgPT4gfnZhbHVlcy5pbmRleE9mKGVsKSlcXHJcXG4gICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgaWYgKCF+dGhpcy52YWxPcHRpb25zLmluZGV4T2YodGhpcy52YWwpKSB7IHRoaXMudmFsID0gbnVsbCB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBjbGVhciAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDogbnVsbFxcclxcbiAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgY2xlYXJTZWFyY2ggKCkge1xcclxcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJ1xcclxcbiAgICAgIHRoaXMuJHJlZnMuc2VhcmNoLmZvY3VzKClcXHJcXG4gICAgfSxcXHJcXG4gICAgaXNTZWxlY3RlZCAodikge1xcclxcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5pbmRleE9mKHYpID4gLTFcXHJcXG4gICAgfSxcXHJcXG4gICAgc2VsZWN0ICh2KSB7XFxyXFxuICAgICAgaWYgKHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcXHJcXG4gICAgICAgIHZhciBuZXdWYWwgPSB0aGlzLnZhbC5zbGljZSgwKVxcclxcbiAgICAgICAgaWYgKH5uZXdWYWwuaW5kZXhPZih2KSkge1xcclxcbiAgICAgICAgICBuZXdWYWwuc3BsaWNlKG5ld1ZhbC5pbmRleE9mKHYpLCAxKVxcclxcbiAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgbmV3VmFsLnB1c2godilcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMudmFsID0gbmV3VmFsXFxyXFxuICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB2XFxyXFxuICAgICAgICB0aGlzLnRvZ2dsZSgpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzZXRPcHRpb25zIChvcHRpb25zKSB7XFxyXFxuICAgICAgdGhpcy5saXN0ID0gb3B0aW9ucy5tYXAoZWwgPT4ge1xcclxcbiAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgT2JqZWN0KSB7IHJldHVybiBlbCB9XFxyXFxuICAgICAgICBsZXQgb2JqID0ge31cXHJcXG4gICAgICAgIG9ialt0aGlzLm9wdGlvbnNMYWJlbF0gPSBlbFxcclxcbiAgICAgICAgb2JqW3RoaXMub3B0aW9uc1ZhbHVlXSA9IGVsXFxyXFxuICAgICAgICByZXR1cm4gb2JqXFxyXFxuICAgICAgfSlcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdvcHRpb25zJywgdGhpcy5saXN0KVxcclxcbiAgICB9LFxcclxcbiAgICB0b2dnbGUgKCkge1xcclxcbiAgICAgIHRoaXMuc2hvdyA9ICF0aGlzLnNob3dcXHJcXG4gICAgICBpZiAoIXRoaXMuc2hvdykgdGhpcy4kcmVmcy5idG4uZm9jdXMoKVxcclxcbiAgICB9LFxcclxcbiAgICB1cmxDaGFuZ2VkICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMudXJsIHx8ICF0aGlzLiRodHRwKSB7IHJldHVybiB9XFxyXFxuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxcclxcbiAgICAgIHRoaXMuJGh0dHAuZ2V0KHRoaXMudXJsKS50aGVuKHJlc3BvbnNlID0+IHtcXHJcXG4gICAgICAgIHZhciBkYXRhID0gcmVzcG9uc2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5ID8gcmVzcG9uc2UuZGF0YSA6IFtdXFxyXFxuICAgICAgICB0cnkgeyBkYXRhID0gSlNPTi5wYXJzZShkYXRhKSB9IGNhdGNoIChlKSB7fVxcclxcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zKGRhdGEpXFxyXFxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgICAgdGhpcy5jaGVja0RhdGEoKVxcclxcbiAgICAgIH0sIHJlc3BvbnNlID0+IHtcXHJcXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWRhdGUgKCkge1xcclxcbiAgICAgIHJldHVybiAhdGhpcy5yZXF1aXJlZCA/IHRydWUgOiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwubGVuZ3RoID4gMCA6IHRoaXMudmFsICE9PSBudWxsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucylcXHJcXG4gICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHRoaXMuX3NlbGVjdCA9IHRydWVcXHJcXG4gICAgaWYgKHRoaXMudmFsID09PSB1bmRlZmluZWQgfHwgIXRoaXMucGFyZW50KSB7IHRoaXMudmFsID0gbnVsbCB9XFxyXFxuICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XFxyXFxuICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbFswXVxcclxcbiAgICB9XFxyXFxuICAgIHRoaXMuY2hlY2tEYXRhKClcXHJcXG4gICAgaWYgKHRoaXMudXJsKSB0aGlzLnVybENoYW5nZWQoKVxcclxcbiAgICBsZXQgcGFyZW50ID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5fZm9ybVZhbGlkYXRvcikgeyBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudCB9XFxyXFxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XFxyXFxuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcylcXHJcXG4gICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnRcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICBpZiAodGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKVxcclxcbiAgICB0aGlzLnNldE9wdGlvbnModGhpcy5vcHRpb25zKVxcclxcbiAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWVcXHJcXG4gICAgdGhpcy5jaGVja0RhdGEoKVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICBpZiAodGhpcy5fcGFyZW50KSB7XFxyXFxuICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcylcXHJcXG4gICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKVxcclxcbiAgICB9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZSBzY29wZWQ+XFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGV7XFxyXFxuICBoZWlnaHQ6IGF1dG87XFxyXFxuICBwYWRkaW5nLXJpZ2h0OiAyNHB4O1xcclxcbn1cXHJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZTphZnRlcntcXHJcXG4gIGNvbnRlbnQ6ICcgJztcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHJpZ2h0OiAxM3B4O1xcclxcbiAgdG9wOiA1MCU7XFxyXFxuICBtYXJnaW46IC0xcHggMCAwO1xcclxcbiAgYm9yZGVyLXRvcDogNHB4IGRhc2hlZDtcXHJcXG4gIGJvcmRlci10b3A6IDRweCBzb2xpZCBcXFxcOTtcXHJcXG4gIGJvcmRlci1yaWdodDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcXHJcXG59XFxyXFxuLmJzLXNlYXJjaGJveCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBtYXJnaW46IDRweCA4cHg7XFxyXFxufVxcclxcbi5icy1zZWFyY2hib3ggLmNsb3NlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmJzLXNlYXJjaGJveCBpbnB1dDpmb2N1cyxcXHJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZTpmb2N1cyB7XFxyXFxuICBvdXRsaW5lOiAwO1xcclxcbiAgYm9yZGVyLWNvbG9yOiAjNjZhZmU5ICFpbXBvcnRhbnQ7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcclxcbn1cXHJcXG4uc2VjcmV0IHtcXHJcXG4gIGJvcmRlcjogMDtcXHJcXG4gIGNsaXA6IHJlY3QoMCAwIDAgMCk7XFxyXFxuICBoZWlnaHQ6IDFweDtcXHJcXG4gIG1hcmdpbjogLTFweDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgd2lkdGg6IDFweDtcXHJcXG59XFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU+LmNsb3NlIHsgbWFyZ2luLWxlZnQ6IDVweDt9XFxyXFxuLm5vdGlmeS5vdXQgeyBwb3NpdGlvbjogcmVsYXRpdmU7IH1cXHJcXG4ubm90aWZ5LmluLFxcclxcbi5ub3RpZnk+ZGl2IHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiA5NiU7XFxyXFxuICBtYXJnaW46IDAgMiU7XFxyXFxuICBtaW4taGVpZ2h0OiAyNnB4O1xcclxcbiAgcGFkZGluZzogM3B4IDVweDtcXHJcXG4gIGJhY2tncm91bmQ6ICNmNWY1ZjU7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjZTNlM2UzO1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA1KTtcXHJcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcclxcbn1cXHJcXG4ubm90aWZ5PmRpdiB7XFxyXFxuICB0b3A6IDVweDtcXHJcXG4gIHotaW5kZXg6IDE7XFxyXFxufVxcclxcbi5ub3RpZnkuaW4ge1xcclxcbiAgb3BhY2l0eTogLjk7XFxyXFxuICBib3R0b206IDVweDtcXHJcXG59XFxyXFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLXRvZ2dsZT5zcGFuOm5vdCguY2xvc2UpIHtcXHJcXG4gIHdpZHRoOiBjYWxjKDEwMCUgLSAxOHB4KTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAtNHB4O1xcclxcbn1cXHJcXG4uYnRuLWdyb3VwLWp1c3RpZmllZCAuZHJvcGRvd24tbWVudSB7IHdpZHRoOiAxMDAlOyB9XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE1NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgX0NsaWNrT3V0c2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xpY2tPdXRzaWRlKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0dmFyIHRpbWVvdXQgPSB7fTtcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIENsaWNrT3V0c2lkZTogX0NsaWNrT3V0c2lkZTIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIGNsZWFyQnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBjbG9zZU9uU2VsZWN0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgbGltaXQ6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMDI0IH0sXG5cdCAgICBtaW5TZWFyY2g6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG5cdCAgICBtdWx0aXBsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIG9wdGlvbnM6IHsgdHlwZTogQXJyYXksIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuXHQgICAgICAgIHJldHVybiBbXTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG9wdGlvbnNMYWJlbDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdsYWJlbCcgfSxcblx0ICAgIG9wdGlvbnNWYWx1ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd2YWx1ZScgfSxcblx0ICAgIHBhcmVudDogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlcXVpcmVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHNlYXJjaDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2VhcmNoVGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHVybDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiBudWxsXG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgbGlzdDogW10sXG5cdCAgICAgIGxvYWRpbmc6IG51bGwsXG5cdCAgICAgIHNlYXJjaFZhbHVlOiBudWxsLFxuXHQgICAgICBzaG93OiBmYWxzZSxcblx0ICAgICAgbm90aWZ5OiBmYWxzZSxcblx0ICAgICAgdmFsOiBudWxsLFxuXHQgICAgICB2YWxpZDogbnVsbFxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgY2FuU2VhcmNoOiBmdW5jdGlvbiBjYW5TZWFyY2goKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLm1pblNlYXJjaCA/IHRoaXMubGlzdC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2ggOiB0aGlzLnNlYXJjaDtcblx0ICAgIH0sXG5cdCAgICBjbGFzc2VzOiBmdW5jdGlvbiBjbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gW3sgb3BlbjogdGhpcy5zaG93LCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCB0aGlzLmNsYXNzLCB0aGlzLmlzTGkgPyAnZHJvcGRvd24nIDogdGhpcy5pbklucHV0ID8gJ2lucHV0LWdyb3VwLWJ0bicgOiAnYnRuLWdyb3VwJ107XG5cdCAgICB9LFxuXHQgICAgZmlsdGVyZWRPcHRpb25zOiBmdW5jdGlvbiBmaWx0ZXJlZE9wdGlvbnMoKSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICB2YXIgc2VhcmNoID0gKHRoaXMuc2VhcmNoVmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cdCAgICAgIHJldHVybiAhc2VhcmNoID8gdGhpcy5saXN0IDogdGhpcy5saXN0LmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gfmVsW190aGlzLm9wdGlvbnNMYWJlbF0udG9Mb3dlckNhc2UoKS5zZWFyY2goc2VhcmNoKTtcblx0ICAgICAgfSk7XG5cdCAgICB9LFxuXHQgICAgaGFzUGFyZW50OiBmdW5jdGlvbiBoYXNQYXJlbnQoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnBhcmVudCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy5wYXJlbnQubGVuZ3RoIDogdGhpcy5wYXJlbnQ7XG5cdCAgICB9LFxuXHQgICAgaW5JbnB1dDogZnVuY3Rpb24gaW5JbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgaXNMaTogZnVuY3Rpb24gaXNMaSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5fdGFic2V0O1xuXHQgICAgfSxcblx0ICAgIGxpbWl0VGV4dDogZnVuY3Rpb24gbGltaXRUZXh0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0LmxpbWl0LnJlcGxhY2UoJ3t7bGltaXR9fScsIHRoaXMubGltaXQpO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdGVkOiBmdW5jdGlvbiBzZWxlY3RlZCgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgc2VsID0gdGhpcy52YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICByZXR1cm4gKF90aGlzMi5saXN0LmZpbmQoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgICAgIHJldHVybiBvW190aGlzMi5vcHRpb25zVmFsdWVdID09PSB2YWw7XG5cdCAgICAgICAgfSkgfHwge30pW190aGlzMi5vcHRpb25zTGFiZWxdO1xuXHQgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZDtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdGVkJywgc2VsKTtcblx0ICAgICAgcmV0dXJuIHNlbC5qb2luKCcsICcpO1xuXHQgICAgfSxcblx0ICAgIHNob3dQbGFjZWhvbGRlcjogZnVuY3Rpb24gc2hvd1BsYWNlaG9sZGVyKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmhhc1BhcmVudCA/IHRoaXMucGxhY2Vob2xkZXIgfHwgdGhpcy50ZXh0Lm5vdFNlbGVjdGVkIDogbnVsbDtcblx0ICAgIH0sXG5cdCAgICB0ZXh0OiBmdW5jdGlvbiB0ZXh0KCkge1xuXHQgICAgICByZXR1cm4gKDAsIF91dGlscy50cmFuc2xhdGlvbnMpKHRoaXMubGFuZyk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwgOiB+W251bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih0aGlzLnZhbCkgPyBbXSA6IFt0aGlzLnZhbF07XG5cdCAgICB9LFxuXHQgICAgdmFsT3B0aW9uczogZnVuY3Rpb24gdmFsT3B0aW9ucygpIHtcblx0ICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cdFxuXHQgICAgICByZXR1cm4gdGhpcy5saXN0Lm1hcChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWxbX3RoaXMzLm9wdGlvbnNWYWx1ZV07XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIG9wdGlvbnM6IGZ1bmN0aW9uIG9wdGlvbnMoX29wdGlvbnMpIHtcblx0ICAgICAgaWYgKF9vcHRpb25zIGluc3RhbmNlb2YgQXJyYXkpIHRoaXMuc2V0T3B0aW9ucyhfb3B0aW9ucyk7XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyh2YWwpIHtcblx0ICAgICAgaWYgKHZhbCkge1xuXHQgICAgICAgIHRoaXMuJHJlZnMuc2VhcmNoID8gdGhpcy4kcmVmcy5zZWFyY2guZm9jdXMoKSA6IHRoaXMuJHJlZnMuYnRuLmZvY3VzKCk7XG5cdCAgICAgICAgLy8gb25CbHVyKHRoaXMuJHJlZnMuc2VsZWN0LCBlID0+IHsgdGhpcy5zaG93ID0gZmFsc2UgfSlcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIC8vIG9mZkJsdXIodGhpcy4kcmVmcy5zZWxlY3QpXG5cdCAgICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHVybDogZnVuY3Rpb24gdXJsKCkge1xuXHQgICAgICB0aGlzLnVybENoYW5nZWQoKTtcblx0ICAgIH0sXG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQgJiYgdGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoX3ZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSBfdmFsID0gbnVsbDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoX3ZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgX3ZhbCk7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoX3ZhbCBpbnN0YW5jZW9mIEFycmF5ICYmIF92YWwubGVuZ3RoID4gdGhpcy5saW1pdCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gX3ZhbC5zbGljZSgwLCB0aGlzLmxpbWl0KTtcblx0ICAgICAgICB0aGlzLm5vdGlmeSA9IHRydWU7XG5cdCAgICAgICAgaWYgKHRpbWVvdXQubGltaXQpIGNsZWFyVGltZW91dCh0aW1lb3V0LmxpbWl0KTtcblx0ICAgICAgICB0aW1lb3V0LmxpbWl0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICB0aW1lb3V0LmxpbWl0ID0gZmFsc2U7XG5cdCAgICAgICAgICBfdGhpczQubm90aWZ5ID0gZmFsc2U7XG5cdCAgICAgICAgfSwgMTUwMCk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcblx0ICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgY2hlY2tEYXRhOiBmdW5jdGlvbiBjaGVja0RhdGEoKSB7XG5cdCAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG5cdCAgICAgICAgaWYgKHRoaXMubGltaXQgPCAxKSB7XG5cdCAgICAgICAgICB0aGlzLmxpbWl0ID0gMTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCEodGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkpIHtcblx0ICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwgPT09IG51bGwgfHwgdGhpcy52YWwgPT09IHVuZGVmaW5lZCA/IFtdIDogW3RoaXMudmFsXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsT3B0aW9ucztcblx0ICAgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIHJldHVybiB+dmFsdWVzLmluZGV4T2YoZWwpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XG5cdCAgICAgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBpZiAoIX50aGlzLnZhbE9wdGlvbnMuaW5kZXhPZih0aGlzLnZhbCkpIHtcblx0ICAgICAgICAgIHRoaXMudmFsID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gW10gOiBudWxsO1xuXHQgICAgICB0aGlzLnRvZ2dsZSgpO1xuXHQgICAgfSxcblx0ICAgIGNsZWFyU2VhcmNoOiBmdW5jdGlvbiBjbGVhclNlYXJjaCgpIHtcblx0ICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuXHQgICAgICB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpO1xuXHQgICAgfSxcblx0ICAgIGlzU2VsZWN0ZWQ6IGZ1bmN0aW9uIGlzU2VsZWN0ZWQodikge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZXMuaW5kZXhPZih2KSA+IC0xO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHYpIHtcblx0ICAgICAgaWYgKHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcblx0ICAgICAgICB2YXIgbmV3VmFsID0gdGhpcy52YWwuc2xpY2UoMCk7XG5cdCAgICAgICAgaWYgKH5uZXdWYWwuaW5kZXhPZih2KSkge1xuXHQgICAgICAgICAgbmV3VmFsLnNwbGljZShuZXdWYWwuaW5kZXhPZih2KSwgMSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIG5ld1ZhbC5wdXNoKHYpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnZhbCA9IG5ld1ZhbDtcblx0ICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XG5cdCAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLnZhbCA9IHY7XG5cdCAgICAgICAgdGhpcy50b2dnbGUoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuXHQgICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblx0XG5cdCAgICAgIHRoaXMubGlzdCA9IG9wdGlvbnMubWFwKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIE9iamVjdCkge1xuXHQgICAgICAgICAgcmV0dXJuIGVsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgb2JqID0ge307XG5cdCAgICAgICAgb2JqW190aGlzNS5vcHRpb25zTGFiZWxdID0gZWw7XG5cdCAgICAgICAgb2JqW190aGlzNS5vcHRpb25zVmFsdWVdID0gZWw7XG5cdCAgICAgICAgcmV0dXJuIG9iajtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ29wdGlvbnMnLCB0aGlzLmxpc3QpO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgICBpZiAoIXRoaXMuc2hvdykgdGhpcy4kcmVmcy5idG4uZm9jdXMoKTtcblx0ICAgIH0sXG5cdCAgICB1cmxDaGFuZ2VkOiBmdW5jdGlvbiB1cmxDaGFuZ2VkKCkge1xuXHQgICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblx0XG5cdCAgICAgIGlmICghdGhpcy51cmwgfHwgIXRoaXMuJGh0dHApIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblx0ICAgICAgdGhpcy4kaHR0cC5nZXQodGhpcy51cmwpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdCAgICAgICAgdmFyIGRhdGEgPSByZXNwb25zZS5kYXRhIGluc3RhbmNlb2YgQXJyYXkgPyByZXNwb25zZS5kYXRhIDogW107XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cdCAgICAgICAgX3RoaXM2LnNldE9wdGlvbnMoZGF0YSk7XG5cdCAgICAgICAgX3RoaXM2LmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgICBfdGhpczYuY2hlY2tEYXRhKCk7XG5cdCAgICAgIH0sIGZ1bmN0aW9uIChyZXNwb25zZSkge1xuXHQgICAgICAgIF90aGlzNi5sb2FkaW5nID0gZmFsc2U7XG5cdCAgICAgIH0pO1xuXHQgICAgfSxcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgcmV0dXJuICF0aGlzLnJlcXVpcmVkID8gdHJ1ZSA6IHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLnZhbC5sZW5ndGggPiAwIDogdGhpcy52YWwgIT09IG51bGw7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucyk7XG5cdCAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWU7XG5cdCAgICB0aGlzLl9zZWxlY3QgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMudmFsID09PSB1bmRlZmluZWQgfHwgIXRoaXMucGFyZW50KSB7XG5cdCAgICAgIHRoaXMudmFsID0gbnVsbDtcblx0ICAgIH1cblx0ICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgIHRoaXMudmFsID0gdGhpcy52YWxbMF07XG5cdCAgICB9XG5cdCAgICB0aGlzLmNoZWNrRGF0YSgpO1xuXHQgICAgaWYgKHRoaXMudXJsKSB0aGlzLnVybENoYW5nZWQoKTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuXHQgICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucyk7XG5cdCAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWU7XG5cdCAgICB0aGlzLmNoZWNrRGF0YSgpO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcblx0ICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDE1NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcImNsaWNrLW91dHNpZGVcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LWNsaWNrLW91dHNpZGVcIixcblx0ICAgICAgdmFsdWU6IChfdm0uY2xvc2UpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImNsb3NlXCJcblx0ICAgIH1dLFxuXHQgICAgcmVmOiBcInNlbGVjdFwiLFxuXHQgICAgY2xhc3M6IF92bS5jbGFzc2VzXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgcmVmOiBcImJ0blwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sIGRyb3Bkb3duLXRvZ2dsZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0YWJpbmRleFwiOiBcIjFcIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWQgfHwgIV92bS5oYXNQYXJlbnQsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5XG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jYW5TZWFyY2ggPyBudWxsIDogX3ZtLmNsb3NlKClcblx0ICAgICAgfSxcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udG9nZ2xlKClcblx0ICAgICAgfSxcblx0ICAgICAgXCJrZXlkb3duXCI6IFtmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS5jbG9zZSgkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwic3BhY2VcIiwgMzIpKSB7IHJldHVybjsgfVxuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfSwgZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlbnRlclwiLCAxMykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS50b2dnbGUoJGV2ZW50KVxuXHQgICAgICB9XVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJidG4tY29udGVudFwiLFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJpbm5lckhUTUxcIjogX3ZtLl9zKF92bS5sb2FkaW5nID8gX3ZtLnRleHQubG9hZGluZyA6IF92bS5zaG93UGxhY2Vob2xkZXIgfHwgX3ZtLnNlbGVjdGVkKVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWx1ZXMubGVuZ3RoKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNsb3NlXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jbGVhcigpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc2VsZWN0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VsXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJzZWNyZXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJtdWx0aXBsZVwiOiBfdm0ubXVsdGlwbGUsXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seSxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNoYW5nZVwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udmFsID0gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKCRldmVudC50YXJnZXQub3B0aW9ucywgZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgcmV0dXJuIG8uc2VsZWN0ZWRcblx0ICAgICAgICB9KS5tYXAoZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgdmFyIHZhbCA9IFwiX3ZhbHVlXCIgaW4gbyA/IG8uX3ZhbHVlIDogby52YWx1ZTtcblx0ICAgICAgICAgIHJldHVybiB2YWxcblx0ICAgICAgICB9KVswXVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ucmVxdWlyZWQpID8gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInZhbHVlXCI6IFwiXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2woKF92bS5saXN0KSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJ2YWx1ZVwiOiBvcHRpb25bX3ZtLm9wdGlvbnNWYWx1ZV1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdihfdm0uX3Mob3B0aW9uW192bS5vcHRpb25zTGFiZWxdKSldKVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkcm9wZG93bi1tZW51XCJcblx0ICB9LCBbKF92bS5saXN0Lmxlbmd0aCkgPyBbKF92bS5jYW5TZWFyY2gpID8gX3ZtLl9jKCdsaScsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJzLXNlYXJjaGJveFwiXG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VhcmNoXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInRleHRcIixcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0uc2VhcmNoVGV4dCB8fCBfdm0udGV4dC5zZWFyY2gsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCJcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0uc2VhcmNoVmFsdWUpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLmNsb3NlKCRldmVudClcblx0ICAgICAgfSxcblx0ICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnNlYXJjaFZhbHVlID0gJGV2ZW50LnRhcmdldC52YWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uY2xlYXJTZWFyY2hcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0ucmVxdWlyZWQgJiYgIV92bS5jbGVhckJ1dHRvbikgPyBfdm0uX2MoJ2xpJywgW192bS5fYygnYScsIHtcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS5jbGVhcigpICYmIF92bS5jbG9zZSgpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0ucGxhY2Vob2xkZXIgfHwgX3ZtLnRleHQubm90U2VsZWN0ZWQpKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9sKChfdm0uZmlsdGVyZWRPcHRpb25zKSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgYXR0cnM6IHtcblx0ICAgICAgICBcImlkXCI6IG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uc2VsZWN0KG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXSlcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJpbm5lckhUTUxcIjogX3ZtLl9zKG9wdGlvbltfdm0ub3B0aW9uc0xhYmVsXSlcblx0ICAgICAgfVxuXHQgICAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICAgIHZhbHVlOiAoX3ZtLmlzU2VsZWN0ZWQob3B0aW9uW192bS5vcHRpb25zVmFsdWVdKSksXG5cdCAgICAgICAgZXhwcmVzc2lvbjogXCJpc1NlbGVjdGVkKG9wdGlvbltvcHRpb25zVmFsdWVdKVwiXG5cdCAgICAgIH1dLFxuXHQgICAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcIlxuXHQgICAgfSldKV0pXG5cdCAgfSldIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmICFfdm0uY2xvc2VPblNlbGVjdCkgPyBfdm0uX2MoJ3RyYW5zaXRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcIm5hbWVcIjogXCJmYWRlaW5cIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5vdGlmeSBpblwiXG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKSA6IF92bS5fZSgpXSwgMiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmIF92bS5jbG9zZU9uU2VsZWN0KSA/IF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImZhZGVpblwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibm90aWZ5IG91dFwiXG5cdCAgfSwgW192bS5fYygnZGl2JywgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKV0pIDogX3ZtLl9lKCldLCAxKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1lNTE0ZGJjNlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFNsaWRlci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzIxODViODJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTMyMTg1YjgyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gU2xpZGVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE1OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC4kY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcblx0ICAgIH0sXG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LmluZGV4ID09PSB0aGlzLmluZGV4O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLiRwYXJlbnQuaW5kaWNhdG9yX2xpc3QpIHtcblx0ICAgICAgdGhpcy4kcGFyZW50LmluZGljYXRvcl9saXN0LnB1c2godGhpcy5pbmRleCk7XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKHRoaXMuaW5kZXggPT09IDApIHtcblx0ICAgICAgdGhpcy4kZWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTYwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIml0ZW1cIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzIxODViODJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTYyKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTY0KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2NSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxTcGlubmVyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi04YjI5OGU3MFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtOGIyOThlNzBcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBTcGlubmVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE2MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYzKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi04YjI5OGU3MCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vU3Bpbm5lci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LThiMjk4ZTcwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TcGlubmVyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE2MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5Aa2V5ZnJhbWVzIHNwaW4ge1xcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbn1cXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXG59XFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvU3Bpbm5lci52dWU/NjVmYzVhOGZcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJGQTtBQUNBO0lBQ0EsMEJBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSxPQUFBO0VBQ0EsUUFBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0VBQ0EsY0FBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLGlDQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLDRCQUFBO0VBQ0EsbUJBQUE7RUFDQSxzQkFBQTtFQUNBLDRCQUFBO0VBQ0Esb0NBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxlQUFBO0VBQ0EsZUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsWUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7Ozs7O0VBS0EsNklBQUE7RUFDQSxnQkFBQTtFQUNBLGVBQUE7RUFDQSxnQkFBQTtFQUNBLGFBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtDQUNBXCIsXCJmaWxlXCI6XCJTcGlubmVyLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IDpjbGFzcz1cXFwiWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLHNwaW5uZXJTaXplLHsnc3Bpbm5lci1maXhlZCc6Zml4ZWR9XVxcXCIgdi1zaG93PVxcXCJhY3RpdmV8fGxvY2tlZFxcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItd3JhcHBlclxcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3Bpbm5lci1jaXJjbGVcXFwiPjwvZGl2PlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItdGV4dFxcXCI+e3t0ZXh0fX08L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtjb2VyY2UsIGRlbGF5ZXJ9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuY29uc3QgTUlOX1dBSVQgPSA1MDAgLy8gaW4gbXNcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBmaXhlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZ2xvYmFsOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBzaXplOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbWQnfSxcXHJcXG4gICAgdGV4dDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcXHJcXG4gICAgICBsb2NrZWQ6IGZhbHNlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBzcGlubmVyU2l6ZSAoKSB7IHJldHVybiAnc3Bpbm5lci0nICsgKHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZSA6ICdzbScpIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBhY3RpdmUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7IHRoaXNbdmFsID8gJ3Nob3cnIDogJ2hpZGUnXSgpIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgaGlkZSAoKSB7XFxyXFxuICAgICAgdmFyIGRlbGF5ID0gMFxcclxcbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAob3B0aW9ucykge1xcclxcbiAgICAgIGlmIChvcHRpb25zKSB7XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy50ZXh0KSB7IHRoaXMudGV4dCA9IG9wdGlvbnMudGV4dCB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7IHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZSB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5maXhlZCkgeyB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZCB9XFxyXFxuICAgICAgfVxcclxcbiAgICAgIC8vIGJsb2NrIHNjcm9sbGluZyB3aGVuIHNwaW5uZXIgaXMgb25cXHJcXG4gICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nXFxyXFxuICAgICAgLy8gYWN0aXZhdGUgc3Bpbm5lclxcclxcbiAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpXFxyXFxuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5sb2NrZWQgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5fdW5sb2NrKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9ib2R5ID0gZG9jdW1lbnQuYm9keVxcclxcbiAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WVxcclxcbiAgICB0aGlzLl91bmxvY2sgPSBkZWxheWVyKGZ1bmN0aW9uICgpIHtcXHJcXG4gICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gICAgfSwgTUlOX1dBSVQpXFxyXFxuICAgIGlmICh0aGlzLmdsb2JhbCkge1xcclxcbiAgICAgIGlmICghdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lcikge1xcclxcbiAgICAgICAgdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lciA9IHRydWVcXHJcXG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xcclxcbiAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xcclxcbiAgICAgICAgICBoaWRlICgpIHsgc2VsZi5oaWRlKCkgfSxcXHJcXG4gICAgICAgICAgc2hvdyAoKSB7IHNlbGYuc2hvdygpIH1cXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuJHJvb3QuJG9uKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICBpZiAodGhpcy5fZ2xvYmFsKSB7XFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpoaWRlJywgdGhpcy5fZ2xvYmFsLmhpZGUpXFxyXFxuICAgICAgZGVsZXRlIHRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXJcXHJcXG4gICAgfVxcclxcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc3Bpbm5lckFuaW1hdGlvbilcXHJcXG4gICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbkBrZXlmcmFtZXMgc3BpbiB7XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXHJcXG59XFxyXFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIE1JTl9XQUlUID0gNTAwOyAvLyBpbiBtc1xuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZml4ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGdsb2JhbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2l6ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdtZCcgfSxcblx0ICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcblx0ICAgICAgbG9ja2VkOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgc3Bpbm5lclNpemU6IGZ1bmN0aW9uIHNwaW5uZXJTaXplKCkge1xuXHQgICAgICByZXR1cm4gJ3NwaW5uZXItJyArICh0aGlzLnNpemUgPyB0aGlzLnNpemUgOiAnc20nKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpc1t2YWwgPyAnc2hvdycgOiAnaGlkZSddKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGhpZGU6IGZ1bmN0aW9uIGhpZGUoKSB7XG5cdCAgICAgIHZhciBkZWxheSA9IDA7XG5cdCAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyhvcHRpb25zKSB7XG5cdCAgICAgIGlmIChvcHRpb25zKSB7XG5cdCAgICAgICAgaWYgKG9wdGlvbnMudGV4dCkge1xuXHQgICAgICAgICAgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7XG5cdCAgICAgICAgICB0aGlzLnNpemUgPSBvcHRpb25zLnNpemU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChvcHRpb25zLmZpeGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgLy8gYmxvY2sgc2Nyb2xsaW5nIHdoZW4gc3Bpbm5lciBpcyBvblxuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuXHQgICAgICAvLyBhY3RpdmF0ZSBzcGlubmVyXG5cdCAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpO1xuXHQgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cdCAgICAgIHRoaXMubG9ja2VkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fdW5sb2NrKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5fYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WTtcblx0ICAgIHRoaXMuX3VubG9jayA9ICgwLCBfdXRpbHMuZGVsYXllcikoZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9IHRoaXMuX2JvZHlPdmVyZmxvdztcblx0ICAgIH0sIE1JTl9XQUlUKTtcblx0ICAgIGlmICh0aGlzLmdsb2JhbCkge1xuXHQgICAgICBpZiAoIXRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXIpIHtcblx0ICAgICAgICB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xuXHQgICAgICAgICAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcblx0ICAgICAgICAgICAgc2VsZi5oaWRlKCk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgICAgICAgc2VsZi5zaG93KCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6c2hvdycsIHRoaXMuX2dsb2JhbC5zaG93KTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9nbG9iYWwpIHtcblx0ICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpO1xuXHQgICAgICB0aGlzLiRyb290LiRvZmYoJ3NwaW5uZXI6OmhpZGUnLCB0aGlzLl9nbG9iYWwuaGlkZSk7XG5cdCAgICAgIGRlbGV0ZSB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyO1xuXHQgICAgfVxuXHQgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NwaW5uZXJBbmltYXRpb24pO1xuXHQgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3c7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5hY3RpdmUgfHwgX3ZtLmxvY2tlZCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiYWN0aXZlfHxsb2NrZWRcIlxuXHQgICAgfV0sXG5cdCAgICBjbGFzczogWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLCBfdm0uc3Bpbm5lclNpemUsIHtcblx0ICAgICAgJ3NwaW5uZXItZml4ZWQnOiBfdm0uZml4ZWRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci13cmFwcGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJzcGlubmVyLWNpcmNsZVwiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci10ZXh0XCJcblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSldKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LThiMjk4ZTcwXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTY2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFiLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0wOTg1ZTg3OFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtMDk4NWU4NzhcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBUYWIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTY3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGZhZGVpbjogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdmFyIGFjdGl2ZSA9ICF0aGlzLl90YWJzIHx8IHRoaXMuX3RhYnMuc2hvdyA9PT0gdGhpcztcblx0ICAgICAgdGhpcy5mYWRlaW4gPSBmYWxzZTtcblx0ICAgICAgaWYgKGFjdGl2ZSkge1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgX3RoaXMuZmFkZWluID0gdHJ1ZTtcblx0ICAgICAgICB9LCAwKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gYWN0aXZlO1xuXHQgICAgfSxcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3RhYnMudGFicy5pbmRleE9mKHRoaXMpO1xuXHQgICAgfSxcblx0ICAgIHRyYW5zaXRpb246IGZ1bmN0aW9uIHRyYW5zaXRpb24oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl90YWJzID8gdGhpcy5fdGFicy5lZmZlY3QgOiBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiID0gdHJ1ZTtcblx0ICAgIHZhciB0YWJzID0gdGhpcztcblx0ICAgIHdoaWxlICghdGhpcy5fdGFicyAmJiB0YWJzLiRwYXJlbnQpIHtcblx0ICAgICAgaWYgKHRhYnMuX2lzVGFiR3JvdXApIHtcblx0ICAgICAgICB0YWJzLnRhYnMucHVzaCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl90YWJHcm91cCA9IHRhYnM7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRhYnMuX2lzVGFicykge1xuXHQgICAgICAgIHRhYnMudGFicy5wdXNoKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3RhYnMgPSB0YWJzO1xuXHQgICAgICAgIGlmICghdGhpcy5fdGFiR3JvdXApIHRhYnMuaGVhZGVycy5wdXNoKHRoaXMpO1xuXHQgICAgICB9XG5cdCAgICAgIHRhYnMgPSB0YWJzLiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMuX3RhYnMpIHRocm93IEVycm9yKCd0YWIgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgaWYgKHRoaXMuX3RhYkdyb3VwKSB7XG5cdCAgICAgIHRoaXMuX3RhYkdyb3VwLnRhYnMgPSB0aGlzLl90YWJHcm91cC50YWJzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwgIT09IF90aGlzMjtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB0aGlzLl90YWJzLnRhYnMgPSB0aGlzLl90YWJzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbCAhPT0gX3RoaXMyO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl90YWJzKSB7XG5cdCAgICAgIGlmICh0aGlzLl90YWJzLmFjdGl2ZSA9PT0gdGhpcy5pbmRleCkge1xuXHQgICAgICAgIHRoaXMuX3RhYnMuaW5kZXggPSAwO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9pbmdyb3VwKSB7XG5cdCAgICAgICAgdmFyIGlkID0gdGhpcy4kcGFyZW50LnRhYnMuaW5kZXhPZih0aGlzKTtcblx0ICAgICAgICBpZiAofmlkKSB0aGlzLiRwYXJlbnQudGFicy5zcGxpY2UoaWQsIDEpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB2YXIgX2lkID0gdGhpcy5fdGFicy50YWJzLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIGlmICh+X2lkKSB0aGlzLl90YWJzLnRhYnMuc3BsaWNlKF9pZCwgMSk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwYW5lbFwiLFxuXHQgICAgY2xhc3M6IFsndGFiLXBhbmUnLCB7XG5cdCAgICAgICdhY3RpdmUgZmFkZSc6IF92bS5hY3RpdmUsXG5cdCAgICAgICdpbic6IF92bS5mYWRlaW5cblx0ICAgIH1dLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwidGFicGFuZWxcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMDk4NWU4NzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTcwKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTcyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Mylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUYWJHcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNTVmYWYzY2JcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTU1ZmFmM2NiXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFiR3JvdXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTcwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzEpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLnRhYi1jb250ZW50IC50YWItcGFuZSB7IGRpc3BsYXk6IG5vbmU7XFxufVxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVGFiR3JvdXAudnVlPzIyYWUxYzA4XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrQ0EseUJBQUEsY0FBQTtDQUFBO0FBQ0EsZ0NBQUEsZUFBQTtDQUFBXCIsXCJmaWxlXCI6XCJUYWJHcm91cC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPjxzcGFuPjxzbG90Pjwvc2xvdD48L3NwYW4+PC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgc2hvdzogZmFsc2UsXFxyXFxuICAgICAgdGFiczogW11cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGFjdGl2ZSAoKSB7IHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KSB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBibHVyICgpIHsgdGhpcy5zaG93ID0gZmFsc2UgfSxcXHJcXG4gICAgdG9nZ2xlICgpIHsgdGhpcy5zaG93ID0gIXRoaXMuc2hvdyB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlXFxyXFxuICAgIGlmICh0aGlzLiRwYXJlbnQpIHtcXHJcXG4gICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFxcXCd0IG5lc3QgdGFiLWdyb3Vwcy4nKVxcclxcbiAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJylcXHJcXG4gICAgfVxcclxcbiAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIHRoaXMuX3RhYnMuaGVhZGVycy5wdXNoKHRoaXMpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4udGFiLWNvbnRlbnQgLnRhYi1wYW5lIHsgZGlzcGxheTogbm9uZTsgfVxcclxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7IH1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTcyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHNob3c6IGZhbHNlLFxuXHQgICAgICB0YWJzOiBbXVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYWN0aXZlOiBmdW5jdGlvbiBhY3RpdmUoKSB7XG5cdCAgICAgIHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMuJHBhcmVudCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFwndCBuZXN0IHRhYi1ncm91cHMuJyk7XG5cdCAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50O1xuXHQgICAgdGhpcy5fdGFicy5oZWFkZXJzLnB1c2godGhpcyk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTczICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTU1ZmFmM2NiXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTc0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFicy52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzAxMDBkZGZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTcwMTAwZGRmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFicy52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzAxMDBkZGYhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1RhYnMudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi03MDEwMGRkZiEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vVGFicy52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1RhYnMudnVlPzQzMTdiOWFmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUEwRUE7RUFDQSxlQUFBO0NBQ0FcIixcImZpbGVcIjpcIlRhYnMudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgdGFicz5cXHJcXG4gICAgPHVsIDpjbGFzcz1cXFwibmF2U3R5bGVDbGFzc1xcXCIgcm9sZT1cXFwidGFibGlzdFxcXCI+XFxyXFxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVxcXCJoZWFkZXIgaW4gaGVhZGVyc1xcXCI+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwiaGVhZGVyLl9pc1RhYlxcXCIgOmNsYXNzPVxcXCJ7YWN0aXZlOmhlYWRlci5hY3RpdmUsIGRpc2FibGVkOmhlYWRlci5kaXNhYmxlZH1cXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QoaGVhZGVyKVxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+PGEgaHJlZj1cXFwiI1xcXCIgdi1odG1sPVxcXCJoZWFkZXIuaGVhZGVyXFxcIj48L2E+PC9zbG90PlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICAgIDxkcm9wZG93biB2LWlmPVxcXCJoZWFkZXIuX2lzVGFiR3JvdXBcXFwiIDp0ZXh0PVxcXCJoZWFkZXIuaGVhZGVyXFxcIiA6Y2xhc3M9XFxcInthY3RpdmU6aGVhZGVyLmFjdGl2ZX1cXFwiIDpkaXNhYmxlZD1cXFwiaGVhZGVyLmRpc2FibGVkXFxcIj5cXHJcXG4gICAgICAgICAgPGxpIHYtZm9yPVxcXCJ0YWIgaW4gaGVhZGVyLnRhYnNcXFwiIDpjbGFzcz1cXFwie2Rpc2FibGVkOnRhYi5kaXNhYmxlZH1cXFwiPjxhIGhyZWY9XFxcIiNcXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QodGFiKVxcXCI+e3t0YWIuaGVhZGVyfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDwvZHJvcGRvd24+XFxyXFxuICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPC91bD5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwidGFiLWNvbnRlbnRcXFwiPjxzbG90Pjwvc2xvdD48L2Rpdj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2NvZXJjZX0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgZHJvcGRvd24gZnJvbSAnLi9Ecm9wZG93bi52dWUnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgY29tcG9uZW50czoge1xcclxcbiAgICBkcm9wZG93blxcclxcbiAgfSxcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIC8vIGVmZmVjdDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2ZhZGVpbid9LFxcclxcbiAgICBqdXN0aWZpZWQ6IGZhbHNlLFxcclxcbiAgICBuYXZTdHlsZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICB2YXIgaW5kZXggPSB0aGlzLnZhbHVlIHx8IDBcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBpbmRleCxcXHJcXG4gICAgICBoZWFkZXJzOiBbXSxcXHJcXG4gICAgICB0YWJzOiBbXVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaW5kZXggKHZhbCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2FjdGl2ZScsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHRoaXMuaW5kZXggPSB2YWxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIG5hdlN0eWxlQ2xhc3MgKCkge1xcclxcbiAgICAgIHJldHVybiBbXFxyXFxuICAgICAgICAnbmF2JyxcXHJcXG4gICAgICAgIH5bJ3BpbGxzJywgJ3N0YWNrZWQnXS5pbmRleE9mKHRoaXMubmF2U3R5bGUpID8gJ25hdi0nICsgdGhpcy5uYXZTdHlsZSA6ICduYXYtdGFicycsXFxyXFxuICAgICAgICB7XFxyXFxuICAgICAgICAgICduYXYtanVzdGlmaWVkJzogY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxcclxcbiAgICAgICAgICAnbmF2LXBpbGxzJzogdGhpcy5uYXZTdHlsZSA9PT0gJ3N0YWNrZWQnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgXVxcclxcbiAgICB9LFxcclxcbiAgICBzaG93ICgpIHsgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF0gfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgc2VsZWN0ICh0YWIpIHtcXHJcXG4gICAgICBpZiAoIXRhYi5kaXNhYmxlZCkge1xcclxcbiAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMudGFicy5pbmRleE9mKHRhYilcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5faXNUYWJzID0gdHJ1ZVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcclxcbn1cXHJcXG48L3N0eWxlPlwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTc3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdHZhciBfRHJvcGRvd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNSk7XG5cdFxuXHR2YXIgX0Ryb3Bkb3duMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Ryb3Bkb3duKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGNvbXBvbmVudHM6IHtcblx0ICAgIGRyb3Bkb3duOiBfRHJvcGRvd24yLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICAvLyBlZmZlY3Q6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdmYWRlaW4nfSxcblx0ICAgIGp1c3RpZmllZDogZmFsc2UsXG5cdCAgICBuYXZTdHlsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIGluZGV4ID0gdGhpcy52YWx1ZSB8fCAwO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaW5kZXg6IGluZGV4LFxuXHQgICAgICBoZWFkZXJzOiBbXSxcblx0ICAgICAgdGFiczogW11cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCh2YWwpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnYWN0aXZlJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy5pbmRleCA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBuYXZTdHlsZUNsYXNzOiBmdW5jdGlvbiBuYXZTdHlsZUNsYXNzKCkge1xuXHQgICAgICByZXR1cm4gWyduYXYnLCB+WydwaWxscycsICdzdGFja2VkJ10uaW5kZXhPZih0aGlzLm5hdlN0eWxlKSA/ICduYXYtJyArIHRoaXMubmF2U3R5bGUgOiAnbmF2LXRhYnMnLCB7XG5cdCAgICAgICAgJ25hdi1qdXN0aWZpZWQnOiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxuXHQgICAgICAgICduYXYtcGlsbHMnOiB0aGlzLm5hdlN0eWxlID09PSAnc3RhY2tlZCdcblx0ICAgICAgfV07XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF07XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdCh0YWIpIHtcblx0ICAgICAgaWYgKCF0YWIuZGlzYWJsZWQpIHtcblx0ICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy50YWJzLmluZGV4T2YodGFiKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFicyA9IHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTc4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidGFic1wiOiBcIlwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygndWwnLCB7XG5cdCAgICBjbGFzczogX3ZtLm5hdlN0eWxlQ2xhc3MsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJ0YWJsaXN0XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9sKChfdm0uaGVhZGVycyksIGZ1bmN0aW9uKGhlYWRlcikge1xuXHQgICAgcmV0dXJuIFsoaGVhZGVyLl9pc1RhYikgPyBfdm0uX2MoJ2xpJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZSwgZGlzYWJsZWQ6IGhlYWRlci5kaXNhYmxlZFxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICAgIF92bS5zZWxlY3QoaGVhZGVyKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICB9LFxuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhoZWFkZXIuaGVhZGVyKVxuXHQgICAgICB9XG5cdCAgICB9KV0pXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKGhlYWRlci5faXNUYWJHcm91cCkgPyBfdm0uX2MoJ2Ryb3Bkb3duJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZVxuXHQgICAgICB9LFxuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwidGV4dFwiOiBoZWFkZXIuaGVhZGVyLFxuXHQgICAgICAgIFwiZGlzYWJsZWRcIjogaGVhZGVyLmRpc2FibGVkXG5cdCAgICAgIH1cblx0ICAgIH0sIF92bS5fbCgoaGVhZGVyLnRhYnMpLCBmdW5jdGlvbih0YWIpIHtcblx0ICAgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAgIGRpc2FibGVkOiB0YWIuZGlzYWJsZWRcblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX2MoJ2EnLCB7XG5cdCAgICAgICAgYXR0cnM6IHtcblx0ICAgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgb246IHtcblx0ICAgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICBfdm0uc2VsZWN0KHRhYilcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX3YoX3ZtLl9zKHRhYi5oZWFkZXIpKV0pXSlcblx0ICAgIH0pKSA6IF92bS5fZSgpXVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwidGFiLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03MDEwMGRkZlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE3OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODApXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTgxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvZ2dsZUJ1dHRvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtZjAzNGE1ZjJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWYwMzRhNWYyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVG9nZ2xlQnV0dG9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE4MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGRpc2FibGVkOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGZhbHNlVHlwZTogeyBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBuYW1lOiBudWxsLFxuXHQgICAgcmVhZG9ubHk6IHsgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHJ1ZVR5cGU6IHsgZGVmYXVsdDogJ3ByaW1hcnknIH0sXG5cdCAgICB2YWx1ZTogZmFsc2Vcblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBhY3RpdmU6IF91dGlscy5jb2VyY2UuYm9vbGVhbih0aGlzLnZhbHVlKSxcblx0ICAgICAgdHlwZXM6IHtcblx0ICAgICAgICBkYW5nZXI6ICdidG4tZGFuZ2VyJyxcblx0ICAgICAgICBpbmZvOiAnYnRuLWluZm8nLFxuXHQgICAgICAgIHByaW1hcnk6ICdidG4tcHJpbWFyeScsXG5cdCAgICAgICAgc3VjY2VzczogJ2J0bi1zdWNjZXNzJyxcblx0ICAgICAgICB3YXJuaW5nOiAnYnRuLXdhcm5pbmcnXG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZWQnLCB2YWwpO1xuXHQgICAgICAgIHRoaXMuJGVtaXQodmFsID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJyk7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuYWN0aXZlID0gX3V0aWxzLmNvZXJjZS5ib29sZWFuKHRoaXMudmFsdWUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYm9vbERpc2FibGVkOiBmdW5jdGlvbiBib29sRGlzYWJsZWQoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5kaXNhYmxlZCk7XG5cdCAgICB9LFxuXHQgICAgYm9vbFJlYWRvbmx5OiBmdW5jdGlvbiBib29sUmVhZG9ubHkoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5yZWFkb25seSk7XG5cdCAgICB9LFxuXHQgICAgdHlwZTogZnVuY3Rpb24gdHlwZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZXNbdGhpcy52YWx1ZSA/IHRoaXMudHJ1ZVR5cGUgOiB0aGlzLmZhbHNlVHlwZV0gfHwgJ2J0bi1kZWZhdWx0Jztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAodGhpcy5ib29sRGlzYWJsZWQgfHwgdGhpcy5ib29sUmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5hY3RpdmUgPSAhdGhpcy5hY3RpdmU7XG5cdCAgICB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTgxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2EnLCB7XG5cdCAgICBjbGFzczogWydidG4nLCBfdm0udHlwZSwge1xuXHQgICAgICByZWFkb25seTogX3ZtLmJvb2xSZWFkb25seVxuXHQgICAgfV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImhyZWZcIjogXCJqYXZhc2NyaXB0OnZvaWQoMClcIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uYm9vbERpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2dseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsdWUgPyAnb2snIDogJ3JlbW92ZScpXVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLm5hbWUpID8gX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImhpZGRlblwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5hY3RpdmUgPyAxIDogMFxuXHQgICAgfVxuXHQgIH0pIDogX3ZtLl9lKCldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1mMDM0YTVmMlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE4MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxODMpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODUpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTg2KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvb2x0aXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTQ4ZmI1MWIyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi00OGZiNTFiMlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFRvb2x0aXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTgzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODQpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQ4ZmI1MWIyIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Ub29sdGlwLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNDhmYjUxYjIhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1Rvb2x0aXAudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXG59XFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXG59XFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXG59XFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcbjAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG59XFxuQGtleWZyYW1lcyBmYWRlaW4tb3V0IHtcXG4wJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVG9vbHRpcC52dWU/MzdkMTgzZWNcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJCQTs7OztFQUlBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtBQUNBO0lBQ0EsV0FBQTtDQUNBO0NBQ0FcIixcImZpbGVcIjpcIlRvb2x0aXAudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxzcGFuIHJlZj1cXFwidHJpZ2dlclxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPHRyYW5zaXRpb24gOm5hbWU9XFxcImVmZmVjdFxcXCI+XFxyXFxuICAgICAgPGRpdiByZWY9XFxcInBvcG92ZXJcXFwiIHYtaWY9XFxcInNob3dcXFwiIDpjbGFzcz1cXFwiWyd0b29sdGlwJyxwbGFjZW1lbnRdXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInRvb2x0aXAtYXJyb3dcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwidG9vbHRpcC1pbm5lclxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImNvbnRlbnRcXFwiPjxkaXYgdi1odG1sPVxcXCJjb250ZW50XFxcIj48L2Rpdj48L3Nsb3Q+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC90cmFuc2l0aW9uPlxcclxcbiAgPC9zcGFuPlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQgUG9wb3Zlck1peGluIGZyb20gJy4vdXRpbHMvcG9wb3Zlck1peGlucy5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBtaXhpbnM6IFtQb3BvdmVyTWl4aW5dLFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgZWZmZWN0OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnfSxcXHJcXG4gICAgdHJpZ2dlcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJ31cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXHJcXG59XFxyXFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXHJcXG59XFxyXFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIGZhZGVpbi1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAuOTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTg1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGlucyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQzKTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3BvdmVyTWl4aW5zKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgbWl4aW5zOiBbX3BvcG92ZXJNaXhpbnMyLmRlZmF1bHRdLFxuXHQgIHByb3BzOiB7XG5cdCAgICBlZmZlY3Q6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnIH0sXG5cdCAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJyB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTg2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICByZWY6IFwidHJpZ2dlclwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0uZWZmZWN0XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwb3BvdmVyXCIsXG5cdCAgICBjbGFzczogWyd0b29sdGlwJywgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWFycm93XCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWlubmVyXCJcblx0ICB9LCBbX3ZtLl90KFwiY29udGVudFwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcImlubmVySFRNTFwiOiBfdm0uX3MoX3ZtLmNvbnRlbnQpXG5cdCAgICB9XG5cdCAgfSldKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDhmYjUxYjJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxODcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTg4KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwNilcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUeXBlYWhlYWQudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTViNWY1ZTk0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi01YjVmNWU5NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFR5cGVhaGVhZC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxODggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4OSk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNWI1ZjVlOTQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1R5cGVhaGVhZC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTViNWY1ZTk0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UeXBlYWhlYWQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9UeXBlYWhlYWQudnVlPzZhMDM5OTdmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFvSUE7RUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJUeXBlYWhlYWQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgc3R5bGU9XFxcInBvc2l0aW9uOiByZWxhdGl2ZVxcXCIgOmNsYXNzPVxcXCJ7J29wZW4nOnNob3dEcm9wZG93bn1cXFwiPlxcclxcbiAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiXFxyXFxuICAgICAgdi1tb2RlbD1cXFwidmFsXFxcIlxcclxcbiAgICAgIDpwbGFjZWhvbGRlcj1cXFwicGxhY2Vob2xkZXJcXFwiXFxyXFxuICAgICAgQGJsdXI9XFxcInNob3dEcm9wZG93biA9IGZhbHNlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmRvd249XFxcImRvd25cXFwiXFxyXFxuICAgICAgQGtleWRvd24uZW50ZXI9IFxcXCJoaXRcXFwiXFxyXFxuICAgICAgQGtleWRvd24uZXNjPVxcXCJyZXNldFxcXCJcXHJcXG4gICAgICBAa2V5ZG93bi51cD1cXFwidXBcXFwiXFxyXFxuICAgIC8+XFxyXFxuICAgIDx1bCBjbGFzcz1cXFwiZHJvcGRvd24tbWVudVxcXCIgcmVmPVxcXCJkcm9wZG93blxcXCI+XFxyXFxuICAgICAgPGxpIHYtZm9yPVxcXCIoaXRlbSwgaSkgaW4gaXRlbXNcXFwiIDpjbGFzcz1cXFwieydhY3RpdmUnOiBpc0FjdGl2ZShpKX1cXFwiPlxcclxcbiAgICAgICAgPGEgQG1vdXNlZG93bi5wcmV2ZW50PVxcXCJoaXRcXFwiIEBtb3VzZW1vdmU9XFxcInNldEFjdGl2ZShpKVxcXCI+XFxyXFxuICAgICAgICAgIDxjb21wb25lbnQgOmlzPVxcXCJ0bXBsXFxcIiA6aXRlbT1cXFwiaXRlbVxcXCI+PC9jb21wb25lbnQ+XFxyXFxuICAgICAgICA8L2E+XFxyXFxuICAgICAgPC9saT5cXHJcXG4gICAgPC91bD5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2RlbGF5ZXIsIGdldEpTT059IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxudmFyIERFTEFZID0gMzAwXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgYXN5bmM6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBkYXRhOiB7dHlwZTogQXJyYXl9LFxcclxcbiAgICBkZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogREVMQVl9LFxcclxcbiAgICBhc3luY0tleToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxpbWl0OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiA4fSxcXHJcXG4gICAgbWF0Y2hDYXNlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBtYXRjaFN0YXJ0OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBvbkhpdDoge1xcclxcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxcclxcbiAgICAgIGRlZmF1bHQgKGl0ZW0pIHtcXHJcXG4gICAgICAgIHRoaXMucmVzZXQoKVxcclxcbiAgICAgICAgdGhpcy52YWx1ZSA9IGl0ZW1cXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHBsYWNlaG9sZGVyOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgdGVtcGxhdGU6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICB2YWx1ZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgc2hvd0Ryb3Bkb3duOiBmYWxzZSxcXHJcXG4gICAgICBub1Jlc3VsdHM6IHRydWUsXFxyXFxuICAgICAgY3VycmVudDogMCxcXHJcXG4gICAgICBpdGVtczogW10sXFxyXFxuICAgICAgdmFsOiAnJ1xcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgdGVtcGxhdGVIdG1sICgpIHsgcmV0dXJuIHR5cGVvZiB0aGlzLnRlbXBsYXRlID09PSAnc3RyaW5nJyA/ICc8c3Bhbj4nICsgdGhpcy50ZW1wbGF0ZSArICc8L3NwYW4+JyA6IG51bGwgfSxcXHJcXG4gICAgdG1wbCAoKSB7IHJldHVybiB0aGlzLl90bXBsfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuX3VwZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIHNldEl0ZW1zIChkYXRhKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcXHJcXG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmFzeW5jS2V5ID8gZGF0YVt0aGlzLmFzeW5jS2V5XSA6IGRhdGFcXHJcXG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHRoaXMubGltaXQpXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIHRoaXMuaXRlbXMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKHZhbHVlID0+IHtcXHJcXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHsgcmV0dXJuIHRydWUgfVxcclxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMubWF0Y2hDYXNlID8gdmFsdWUgOiB2YWx1ZS50b0xvd2VyQ2FzZSgpXFxyXFxuICAgICAgICAgIHZhciBxdWVyeSA9IHRoaXMubWF0Y2hDYXNlID8gdGhpcy52YWwgOiB0aGlzLnZhbC50b0xvd2VyQ2FzZSgpXFxyXFxuICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoU3RhcnQgPyB2YWx1ZS5pbmRleE9mKHF1ZXJ5KSA9PT0gMCA6IHZhbHVlLmluZGV4T2YocXVlcnkpICE9PSAtMVxcclxcbiAgICAgICAgfSkuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICB9XFxyXFxuICAgICAgdGhpcy5zaG93RHJvcGRvd24gPSB0aGlzLml0ZW1zLmxlbmd0aCA+IDBcXHJcXG4gICAgfSxcXHJcXG4gICAgcmVzZXQgKCkge1xcclxcbiAgICAgIHRoaXMuaXRlbXMgPSBbXVxcclxcbiAgICAgIHRoaXMudmFsID0gJydcXHJcXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgc2V0QWN0aXZlIChpbmRleCkge1xcclxcbiAgICAgIHRoaXMuY3VycmVudCA9IGluZGV4XFxyXFxuICAgIH0sXFxyXFxuICAgIGlzQWN0aXZlIChpbmRleCkge1xcclxcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQgPT09IGluZGV4XFxyXFxuICAgIH0sXFxyXFxuICAgIGhpdCAoZSkge1xcclxcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxcclxcbiAgICAgIHRoaXMub25IaXQodGhpcy5pdGVtc1t0aGlzLmN1cnJlbnRdLCB0aGlzKVxcclxcbiAgICB9LFxcclxcbiAgICB1cCAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuY3VycmVudCA+IDApIHRoaXMuY3VycmVudC0tXFxyXFxuICAgIH0sXFxyXFxuICAgIGRvd24gKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmN1cnJlbnQgPCB0aGlzLml0ZW1zLmxlbmd0aCAtIDEpIHRoaXMuY3VycmVudCsrXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHRoaXMuX3RtcGwgPSB7XFxyXFxuICAgICAgdGVtcGxhdGU6IHRoaXMudGVtcGxhdGVIdG1sIHx8ICc8c3Ryb25nIHYtaHRtbD1cXFwiaXRlbVxcXCI+PC9zdHJvbmc+JyxcXHJcXG4gICAgICBwcm9wczoge1xcclxcbiAgICAgICAgaXRlbToge2RlZmF1bHQ6IG51bGx9XFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICAgIHRoaXMuX3VwZGF0ZSA9IGRlbGF5ZXIoZnVuY3Rpb24gKCkge1xcclxcbiAgICAgIGlmICghdGhpcy52YWwpIHtcXHJcXG4gICAgICAgIHRoaXMucmVzZXQoKVxcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfVxcclxcbiAgICAgIGlmICh0aGlzLmFzeW5jKSB7XFxyXFxuICAgICAgICBnZXRKU09OKHRoaXMuYXN5bmMgKyB0aGlzLnZhbCkudGhlbihkYXRhID0+IHtcXHJcXG4gICAgICAgICAgdGhpcy5zZXRJdGVtcyhkYXRhKVxcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YSkge1xcclxcbiAgICAgICAgdGhpcy5zZXRJdGVtcyh0aGlzLmRhdGEpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LCAnZGVsYXknLCBERUxBWSlcXHJcXG4gICAgdGhpcy5fdXBkYXRlKClcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuPC9zdHlsZT5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE5MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3R5cGVvZjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5MSk7XG5cdFxuXHR2YXIgX3R5cGVvZjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90eXBlb2YyKTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHR2YXIgREVMQVkgPSAzMDA7IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGFzeW5jOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgZGF0YTogeyB0eXBlOiBBcnJheSB9LFxuXHQgICAgZGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBERUxBWSB9LFxuXHQgICAgYXN5bmNLZXk6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBsaW1pdDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDggfSxcblx0ICAgIG1hdGNoQ2FzZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbWF0Y2hTdGFydDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgb25IaXQ6IHtcblx0ICAgICAgdHlwZTogRnVuY3Rpb24sXG5cdCAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KGl0ZW0pIHtcblx0ICAgICAgICB0aGlzLnJlc2V0KCk7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IGl0ZW07XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHRlbXBsYXRlOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgc2hvd0Ryb3Bkb3duOiBmYWxzZSxcblx0ICAgICAgbm9SZXN1bHRzOiB0cnVlLFxuXHQgICAgICBjdXJyZW50OiAwLFxuXHQgICAgICBpdGVtczogW10sXG5cdCAgICAgIHZhbDogJydcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHRlbXBsYXRlSHRtbDogZnVuY3Rpb24gdGVtcGxhdGVIdG1sKCkge1xuXHQgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudGVtcGxhdGUgPT09ICdzdHJpbmcnID8gJzxzcGFuPicgKyB0aGlzLnRlbXBsYXRlICsgJzwvc3Bhbj4nIDogbnVsbDtcblx0ICAgIH0sXG5cdCAgICB0bXBsOiBmdW5jdGlvbiB0bXBsKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fdG1wbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgaWYgKF92YWwgIT09IG9sZCkgdGhpcy5fdXBkYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZXRJdGVtczogZnVuY3Rpb24gc2V0SXRlbXMoZGF0YSkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcblx0ICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5hc3luY0tleSA/IGRhdGFbdGhpcy5hc3luY0tleV0gOiBkYXRhO1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgICAgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkodmFsdWUpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB2YWx1ZSA9IF90aGlzLm1hdGNoQ2FzZSA/IHZhbHVlIDogdmFsdWUudG9Mb3dlckNhc2UoKTtcblx0ICAgICAgICAgIHZhciBxdWVyeSA9IF90aGlzLm1hdGNoQ2FzZSA/IF90aGlzLnZhbCA6IF90aGlzLnZhbC50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzLm1hdGNoU3RhcnQgPyB2YWx1ZS5pbmRleE9mKHF1ZXJ5KSA9PT0gMCA6IHZhbHVlLmluZGV4T2YocXVlcnkpICE9PSAtMTtcblx0ICAgICAgICB9KS5zbGljZSgwLCB0aGlzLmxpbWl0KTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnNob3dEcm9wZG93biA9IHRoaXMuaXRlbXMubGVuZ3RoID4gMDtcblx0ICAgIH0sXG5cdCAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG5cdCAgICAgIHRoaXMuaXRlbXMgPSBbXTtcblx0ICAgICAgdGhpcy52YWwgPSAnJztcblx0ICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2V0QWN0aXZlOiBmdW5jdGlvbiBzZXRBY3RpdmUoaW5kZXgpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50ID0gaW5kZXg7XG5cdCAgICB9LFxuXHQgICAgaXNBY3RpdmU6IGZ1bmN0aW9uIGlzQWN0aXZlKGluZGV4KSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQgPT09IGluZGV4O1xuXHQgICAgfSxcblx0ICAgIGhpdDogZnVuY3Rpb24gaGl0KGUpIHtcblx0ICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLm9uSGl0KHRoaXMuaXRlbXNbdGhpcy5jdXJyZW50XSwgdGhpcyk7XG5cdCAgICB9LFxuXHQgICAgdXA6IGZ1bmN0aW9uIHVwKCkge1xuXHQgICAgICBpZiAodGhpcy5jdXJyZW50ID4gMCkgdGhpcy5jdXJyZW50LS07XG5cdCAgICB9LFxuXHQgICAgZG93bjogZnVuY3Rpb24gZG93bigpIHtcblx0ICAgICAgaWYgKHRoaXMuY3VycmVudCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkgdGhpcy5jdXJyZW50Kys7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgdGhpcy5fdG1wbCA9IHtcblx0ICAgICAgdGVtcGxhdGU6IHRoaXMudGVtcGxhdGVIdG1sIHx8ICc8c3Ryb25nIHYtaHRtbD1cIml0ZW1cIj48L3N0cm9uZz4nLFxuXHQgICAgICBwcm9wczoge1xuXHQgICAgICAgIGl0ZW06IHsgZGVmYXVsdDogbnVsbCB9XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICB0aGlzLl91cGRhdGUgPSAoMCwgX3V0aWxzLmRlbGF5ZXIpKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoIXRoaXMudmFsKSB7XG5cdCAgICAgICAgdGhpcy5yZXNldCgpO1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5hc3luYykge1xuXHQgICAgICAgICgwLCBfdXRpbHMuZ2V0SlNPTikodGhpcy5hc3luYyArIHRoaXMudmFsKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICBfdGhpczIuc2V0SXRlbXMoZGF0YSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhKSB7XG5cdCAgICAgICAgdGhpcy5zZXRJdGVtcyh0aGlzLmRhdGEpO1xuXHQgICAgICB9XG5cdCAgICB9LCAnZGVsYXknLCBERUxBWSk7XG5cdCAgICB0aGlzLl91cGRhdGUoKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0XG5cdHZhciBfaXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcblx0XG5cdHZhciBfaXRlcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXRlcmF0b3IpO1xuXHRcblx0dmFyIF9zeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5Mik7XG5cdFxuXHR2YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXHRcblx0dmFyIF90eXBlb2YgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBfaXRlcmF0b3IyLmRlZmF1bHQgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBfc3ltYm9sMi5kZWZhdWx0ICYmIG9iaiAhPT0gX3N5bWJvbDIuZGVmYXVsdC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YoX2l0ZXJhdG9yMi5kZWZhdWx0KSA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcblx0ICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKG9iaik7XG5cdH0gOiBmdW5jdGlvbiAob2JqKSB7XG5cdCAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTkyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oMTkzKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogMTkzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE5NCk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMjAzKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMDQpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIwNSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KS5TeW1ib2w7XG5cbi8qKiovIH0sXG4vKiAxOTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0Ly8gRUNNQVNjcmlwdCA2IHN5bWJvbHMgc2hpbVxuXHR2YXIgZ2xvYmFsICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBoYXMgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBERVNDUklQVE9SUyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpXG5cdCAgLCAkZXhwb3J0ICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNSlcblx0ICAsIHJlZGVmaW5lICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOClcblx0ICAsIE1FVEEgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTUpLktFWVxuXHQgICwgJGZhaWxzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KVxuXHQgICwgc2hhcmVkICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzKVxuXHQgICwgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KVxuXHQgICwgdWlkICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KVxuXHQgICwgd2tzICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KVxuXHQgICwgd2tzRXh0ICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1KVxuXHQgICwgd2tzRGVmaW5lICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5Nilcblx0ICAsIGtleU9mICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTcpXG5cdCAgLCBlbnVtS2V5cyAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk4KVxuXHQgICwgaXNBcnJheSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMSlcblx0ICAsIGFuT2JqZWN0ICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcblx0ICAsIHRvSU9iamVjdCAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIHRvUHJpbWl0aXZlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0ICAsIGNyZWF0ZURlc2MgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSlcblx0ICAsIF9jcmVhdGUgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMilcblx0ICAsIGdPUE5FeHQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MClcblx0ICAsICRHT1BEICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDIpXG5cdCAgLCAkRFAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG5cdCAgLCAka2V5cyAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpXG5cdCAgLCBnT1BEICAgICAgICAgICA9ICRHT1BELmZcblx0ICAsIGRQICAgICAgICAgICAgID0gJERQLmZcblx0ICAsIGdPUE4gICAgICAgICAgID0gZ09QTkV4dC5mXG5cdCAgLCAkU3ltYm9sICAgICAgICA9IGdsb2JhbC5TeW1ib2xcblx0ICAsICRKU09OICAgICAgICAgID0gZ2xvYmFsLkpTT05cblx0ICAsIF9zdHJpbmdpZnkgICAgID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5XG5cdCAgLCBQUk9UT1RZUEUgICAgICA9ICdwcm90b3R5cGUnXG5cdCAgLCBISURERU4gICAgICAgICA9IHdrcygnX2hpZGRlbicpXG5cdCAgLCBUT19QUklNSVRJVkUgICA9IHdrcygndG9QcmltaXRpdmUnKVxuXHQgICwgaXNFbnVtICAgICAgICAgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZVxuXHQgICwgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpXG5cdCAgLCBBbGxTeW1ib2xzICAgICA9IHNoYXJlZCgnc3ltYm9scycpXG5cdCAgLCBPUFN5bWJvbHMgICAgICA9IHNoYXJlZCgnb3Atc3ltYm9scycpXG5cdCAgLCBPYmplY3RQcm90byAgICA9IE9iamVjdFtQUk9UT1RZUEVdXG5cdCAgLCBVU0VfTkFUSVZFICAgICA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbidcblx0ICAsIFFPYmplY3QgICAgICAgID0gZ2xvYmFsLlFPYmplY3Q7XG5cdC8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xuXHR2YXIgc2V0dGVyID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblx0XG5cdC8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xuXHR2YXIgc2V0U3ltYm9sRGVzYyA9IERFU0NSSVBUT1JTICYmICRmYWlscyhmdW5jdGlvbigpe1xuXHQgIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcblx0ICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIGRQKHRoaXMsICdhJywge3ZhbHVlOiA3fSkuYTsgfVxuXHQgIH0pKS5hICE9IDc7XG5cdH0pID8gZnVuY3Rpb24oaXQsIGtleSwgRCl7XG5cdCAgdmFyIHByb3RvRGVzYyA9IGdPUEQoT2JqZWN0UHJvdG8sIGtleSk7XG5cdCAgaWYocHJvdG9EZXNjKWRlbGV0ZSBPYmplY3RQcm90b1trZXldO1xuXHQgIGRQKGl0LCBrZXksIEQpO1xuXHQgIGlmKHByb3RvRGVzYyAmJiBpdCAhPT0gT2JqZWN0UHJvdG8pZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcblx0fSA6IGRQO1xuXHRcblx0dmFyIHdyYXAgPSBmdW5jdGlvbih0YWcpe1xuXHQgIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG5cdCAgc3ltLl9rID0gdGFnO1xuXHQgIHJldHVybiBzeW07XG5cdH07XG5cdFxuXHR2YXIgaXNTeW1ib2wgPSBVU0VfTkFUSVZFICYmIHR5cGVvZiAkU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnID8gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG5cdH0gOiBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcblx0fTtcblx0XG5cdHZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKXtcblx0ICBpZihpdCA9PT0gT2JqZWN0UHJvdG8pJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKTtcblx0ICBhbk9iamVjdChpdCk7XG5cdCAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcblx0ICBhbk9iamVjdChEKTtcblx0ICBpZihoYXMoQWxsU3ltYm9scywga2V5KSl7XG5cdCAgICBpZighRC5lbnVtZXJhYmxlKXtcblx0ICAgICAgaWYoIWhhcyhpdCwgSElEREVOKSlkUChpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG5cdCAgICAgIGl0W0hJRERFTl1ba2V5XSA9IHRydWU7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBpZihoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKWl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuXHQgICAgICBEID0gX2NyZWF0ZShELCB7ZW51bWVyYWJsZTogY3JlYXRlRGVzYygwLCBmYWxzZSl9KTtcblx0ICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG5cdCAgfSByZXR1cm4gZFAoaXQsIGtleSwgRCk7XG5cdH07XG5cdHZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApe1xuXHQgIGFuT2JqZWN0KGl0KTtcblx0ICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpXG5cdCAgICAsIGkgICAgPSAwXG5cdCAgICAsIGwgPSBrZXlzLmxlbmd0aFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobCA+IGkpJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG5cdCAgcmV0dXJuIGl0O1xuXHR9O1xuXHR2YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCl7XG5cdCAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xuXHR9O1xuXHR2YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KXtcblx0ICB2YXIgRSA9IGlzRW51bS5jYWxsKHRoaXMsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpO1xuXHQgIGlmKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKXJldHVybiBmYWxzZTtcblx0ICByZXR1cm4gRSB8fCAhaGFzKHRoaXMsIGtleSkgfHwgIWhhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IGhhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtrZXldID8gRSA6IHRydWU7XG5cdH07XG5cdHZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuXHQgIGl0ICA9IHRvSU9iamVjdChpdCk7XG5cdCAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcblx0ICBpZihpdCA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpcmV0dXJuO1xuXHQgIHZhciBEID0gZ09QRChpdCwga2V5KTtcblx0ICBpZihEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpRC5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0ICByZXR1cm4gRDtcblx0fTtcblx0dmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG5cdCAgdmFyIG5hbWVzICA9IGdPUE4odG9JT2JqZWN0KGl0KSlcblx0ICAgICwgcmVzdWx0ID0gW11cblx0ICAgICwgaSAgICAgID0gMFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSl7XG5cdCAgICBpZighaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIGtleSAhPSBISURERU4gJiYga2V5ICE9IE1FVEEpcmVzdWx0LnB1c2goa2V5KTtcblx0ICB9IHJldHVybiByZXN1bHQ7XG5cdH07XG5cdHZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KXtcblx0ICB2YXIgSVNfT1AgID0gaXQgPT09IE9iamVjdFByb3RvXG5cdCAgICAsIG5hbWVzICA9IGdPUE4oSVNfT1AgPyBPUFN5bWJvbHMgOiB0b0lPYmplY3QoaXQpKVxuXHQgICAgLCByZXN1bHQgPSBbXVxuXHQgICAgLCBpICAgICAgPSAwXG5cdCAgICAsIGtleTtcblx0ICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKXtcblx0ICAgIGlmKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAoSVNfT1AgPyBoYXMoT2JqZWN0UHJvdG8sIGtleSkgOiB0cnVlKSlyZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuXHQgIH0gcmV0dXJuIHJlc3VsdDtcblx0fTtcblx0XG5cdC8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuXHRpZighVVNFX05BVElWRSl7XG5cdCAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpe1xuXHQgICAgaWYodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG5cdCAgICB2YXIgdGFnID0gdWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcblx0ICAgIHZhciAkc2V0ID0gZnVuY3Rpb24odmFsdWUpe1xuXHQgICAgICBpZih0aGlzID09PSBPYmplY3RQcm90bykkc2V0LmNhbGwoT1BTeW1ib2xzLCB2YWx1ZSk7XG5cdCAgICAgIGlmKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcblx0ICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcblx0ICAgIH07XG5cdCAgICBpZihERVNDUklQVE9SUyAmJiBzZXR0ZXIpc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7Y29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6ICRzZXR9KTtcblx0ICAgIHJldHVybiB3cmFwKHRhZyk7XG5cdCAgfTtcblx0ICByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG5cdCAgICByZXR1cm4gdGhpcy5faztcblx0ICB9KTtcblx0XG5cdCAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdCAgJERQLmYgICA9ICRkZWZpbmVQcm9wZXJ0eTtcblx0ICBfX3dlYnBhY2tfcmVxdWlyZV9fKDYxKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG5cdCAgX193ZWJwYWNrX3JlcXVpcmVfXygyMDApLmYgID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXHQgIF9fd2VicGFja19yZXF1aXJlX18oMTk5KS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblx0XG5cdCAgaWYoREVTQ1JJUFRPUlMgJiYgIV9fd2VicGFja19yZXF1aXJlX18oMjcpKXtcblx0ICAgIHJlZGVmaW5lKE9iamVjdFByb3RvLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHRydWUpO1xuXHQgIH1cblx0XG5cdCAgd2tzRXh0LmYgPSBmdW5jdGlvbihuYW1lKXtcblx0ICAgIHJldHVybiB3cmFwKHdrcyhuYW1lKSk7XG5cdCAgfVxuXHR9XG5cdFxuXHQkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7U3ltYm9sOiAkU3ltYm9sfSk7XG5cdFxuXHRmb3IodmFyIHN5bWJvbHMgPSAoXG5cdCAgLy8gMTkuNC4yLjIsIDE5LjQuMi4zLCAxOS40LjIuNCwgMTkuNC4yLjYsIDE5LjQuMi44LCAxOS40LjIuOSwgMTkuNC4yLjEwLCAxOS40LjIuMTEsIDE5LjQuMi4xMiwgMTkuNC4yLjEzLCAxOS40LjIuMTRcblx0ICAnaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLHNwZWNpZXMsc3BsaXQsdG9QcmltaXRpdmUsdG9TdHJpbmdUYWcsdW5zY29wYWJsZXMnXG5cdCkuc3BsaXQoJywnKSwgaSA9IDA7IHN5bWJvbHMubGVuZ3RoID4gaTsgKXdrcyhzeW1ib2xzW2krK10pO1xuXHRcblx0Zm9yKHZhciBzeW1ib2xzID0gJGtleXMod2tzLnN0b3JlKSwgaSA9IDA7IHN5bWJvbHMubGVuZ3RoID4gaTsgKXdrc0RlZmluZShzeW1ib2xzW2krK10pO1xuXHRcblx0JGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ1N5bWJvbCcsIHtcblx0ICAvLyAxOS40LjIuMSBTeW1ib2wuZm9yKGtleSlcblx0ICAnZm9yJzogZnVuY3Rpb24oa2V5KXtcblx0ICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcblx0ICAgICAgPyBTeW1ib2xSZWdpc3RyeVtrZXldXG5cdCAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcblx0ICB9LFxuXHQgIC8vIDE5LjQuMi41IFN5bWJvbC5rZXlGb3Ioc3ltKVxuXHQgIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKGtleSl7XG5cdCAgICBpZihpc1N5bWJvbChrZXkpKXJldHVybiBrZXlPZihTeW1ib2xSZWdpc3RyeSwga2V5KTtcblx0ICAgIHRocm93IFR5cGVFcnJvcihrZXkgKyAnIGlzIG5vdCBhIHN5bWJvbCEnKTtcblx0ICB9LFxuXHQgIHVzZVNldHRlcjogZnVuY3Rpb24oKXsgc2V0dGVyID0gdHJ1ZTsgfSxcblx0ICB1c2VTaW1wbGU6IGZ1bmN0aW9uKCl7IHNldHRlciA9IGZhbHNlOyB9XG5cdH0pO1xuXHRcblx0JGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcblx0ICAvLyAxOS4xLjIuMiBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG5cdCAgY3JlYXRlOiAkY3JlYXRlLFxuXHQgIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuXHQgIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG5cdCAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcblx0ICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcblx0ICAvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG5cdCAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuXHQgIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG5cdCAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG5cdCAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuXHQgIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xuXHR9KTtcblx0XG5cdC8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuXHQkSlNPTiAmJiAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCAkZmFpbHMoZnVuY3Rpb24oKXtcblx0ICB2YXIgUyA9ICRTeW1ib2woKTtcblx0ICAvLyBNUyBFZGdlIGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyB7fVxuXHQgIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuXHQgIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG5cdCAgcmV0dXJuIF9zdHJpbmdpZnkoW1NdKSAhPSAnW251bGxdJyB8fCBfc3RyaW5naWZ5KHthOiBTfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcblx0fSkpLCAnSlNPTicsIHtcblx0ICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCl7XG5cdCAgICBpZihpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSlyZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcblx0ICAgIHZhciBhcmdzID0gW2l0XVxuXHQgICAgICAsIGkgICAgPSAxXG5cdCAgICAgICwgcmVwbGFjZXIsICRyZXBsYWNlcjtcblx0ICAgIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG5cdCAgICByZXBsYWNlciA9IGFyZ3NbMV07XG5cdCAgICBpZih0eXBlb2YgcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykkcmVwbGFjZXIgPSByZXBsYWNlcjtcblx0ICAgIGlmKCRyZXBsYWNlciB8fCAhaXNBcnJheShyZXBsYWNlcikpcmVwbGFjZXIgPSBmdW5jdGlvbihrZXksIHZhbHVlKXtcblx0ICAgICAgaWYoJHJlcGxhY2VyKXZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG5cdCAgICAgIGlmKCFpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIHZhbHVlO1xuXHQgICAgfTtcblx0ICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcblx0ICAgIHJldHVybiBfc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmdzKTtcblx0ICB9XG5cdH0pO1xuXHRcblx0Ly8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuXHQkU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSB8fCBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpO1xuXHQvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5cdHNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcblx0Ly8gMjAuMi4xLjkgTWF0aFtAQHRvU3RyaW5nVGFnXVxuXHRzZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuXHQvLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuXHRzZXRUb1N0cmluZ1RhZyhnbG9iYWwuSlNPTiwgJ0pTT04nLCB0cnVlKTtcblxuLyoqKi8gfSxcbi8qIDE5NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIE1FVEEgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NCkoJ21ldGEnKVxuXHQgICwgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKVxuXHQgICwgaGFzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgc2V0RGVzYyAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKS5mXG5cdCAgLCBpZCAgICAgICA9IDA7XG5cdHZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uKCl7XG5cdCAgcmV0dXJuIHRydWU7XG5cdH07XG5cdHZhciBGUkVFWkUgPSAhX193ZWJwYWNrX3JlcXVpcmVfXygxNikoZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xuXHR9KTtcblx0dmFyIHNldE1ldGEgPSBmdW5jdGlvbihpdCl7XG5cdCAgc2V0RGVzYyhpdCwgTUVUQSwge3ZhbHVlOiB7XG5cdCAgICBpOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSURcblx0ICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG5cdCAgfX0pO1xuXHR9O1xuXHR2YXIgZmFzdEtleSA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuXHQgIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcblx0ICBpZighaXNPYmplY3QoaXQpKXJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG5cdCAgaWYoIWhhcyhpdCwgTUVUQSkpe1xuXHQgICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3Rcblx0ICAgIGlmKCFpc0V4dGVuc2libGUoaXQpKXJldHVybiAnRic7XG5cdCAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuXHQgICAgaWYoIWNyZWF0ZSlyZXR1cm4gJ0UnO1xuXHQgICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcblx0ICAgIHNldE1ldGEoaXQpO1xuXHQgIC8vIHJldHVybiBvYmplY3QgSURcblx0ICB9IHJldHVybiBpdFtNRVRBXS5pO1xuXHR9O1xuXHR2YXIgZ2V0V2VhayA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuXHQgIGlmKCFoYXMoaXQsIE1FVEEpKXtcblx0ICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG5cdCAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gdHJ1ZTtcblx0ICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG5cdCAgICBpZighY3JlYXRlKXJldHVybiBmYWxzZTtcblx0ICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG5cdCAgICBzZXRNZXRhKGl0KTtcblx0ICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuXHQgIH0gcmV0dXJuIGl0W01FVEFdLnc7XG5cdH07XG5cdC8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xuXHR2YXIgb25GcmVlemUgPSBmdW5jdGlvbihpdCl7XG5cdCAgaWYoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKXNldE1ldGEoaXQpO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblx0dmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcblx0ICBLRVk6ICAgICAgTUVUQSxcblx0ICBORUVEOiAgICAgZmFsc2UsXG5cdCAgZmFzdEtleTogIGZhc3RLZXksXG5cdCAgZ2V0V2VhazogIGdldFdlYWssXG5cdCAgb25GcmVlemU6IG9uRnJlZXplXG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnbG9iYWwgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0ICAsIGNvcmUgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuXHQgICwgTElCUkFSWSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KVxuXHQgICwgd2tzRXh0ICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1KVxuXHQgICwgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKS5mO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuXHQgIHZhciAkU3ltYm9sID0gY29yZS5TeW1ib2wgfHwgKGNvcmUuU3ltYm9sID0gTElCUkFSWSA/IHt9IDogZ2xvYmFsLlN5bWJvbCB8fCB7fSk7XG5cdCAgaWYobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSlkZWZpbmVQcm9wZXJ0eSgkU3ltYm9sLCBuYW1lLCB7dmFsdWU6IHdrc0V4dC5mKG5hbWUpfSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnZXRLZXlzICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KVxuXHQgICwgdG9JT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNik7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBlbCl7XG5cdCAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG5cdCAgICAsIGtleXMgICA9IGdldEtleXMoTylcblx0ICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcblx0ICAgICwgaW5kZXggID0gMFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobGVuZ3RoID4gaW5kZXgpaWYoT1trZXkgPSBrZXlzW2luZGV4KytdXSA9PT0gZWwpcmV0dXJuIGtleTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gYWxsIGVudW1lcmFibGUgb2JqZWN0IGtleXMsIGluY2x1ZGVzIHN5bWJvbHNcblx0dmFyIGdldEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KVxuXHQgICwgZ09QUyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk5KVxuXHQgICwgcElFICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjAwKTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgdmFyIHJlc3VsdCAgICAgPSBnZXRLZXlzKGl0KVxuXHQgICAgLCBnZXRTeW1ib2xzID0gZ09QUy5mO1xuXHQgIGlmKGdldFN5bWJvbHMpe1xuXHQgICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KVxuXHQgICAgICAsIGlzRW51bSAgPSBwSUUuZlxuXHQgICAgICAsIGkgICAgICAgPSAwXG5cdCAgICAgICwga2V5O1xuXHQgICAgd2hpbGUoc3ltYm9scy5sZW5ndGggPiBpKWlmKGlzRW51bS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pKXJlc3VsdC5wdXNoKGtleSk7XG5cdCAgfSByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTk5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKioqLyB9LFxuLyogMjAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRleHBvcnRzLmYgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqKi8gfSxcbi8qIDIwMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcblx0dmFyIGNvZiA9IF9fd2VicGFja19yZXF1aXJlX18oMzgpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpe1xuXHQgIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjAyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgcElFICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMClcblx0ICAsIGNyZWF0ZURlc2MgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSlcblx0ICAsIHRvSU9iamVjdCAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIHRvUHJpbWl0aXZlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0ICAsIGhhcyAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNClcblx0ICAsIGdPUEQgICAgICAgICAgID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblx0XG5cdGV4cG9ydHMuZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpID8gZ09QRCA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKXtcblx0ICBPID0gdG9JT2JqZWN0KE8pO1xuXHQgIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcblx0ICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuXHQgICAgcmV0dXJuIGdPUEQoTywgUCk7XG5cdCAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuXHQgIGlmKGhhcyhPLCBQKSlyZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyMDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cblxuLyoqKi8gfSxcbi8qIDIwNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxOTYpKCdhc3luY0l0ZXJhdG9yJyk7XG5cbi8qKiovIH0sXG4vKiAyMDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTk2KSgnb2JzZXJ2YWJsZScpO1xuXG4vKioqLyB9LFxuLyogMjA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGNsYXNzOiB7XG5cdCAgICAgICdvcGVuJzogX3ZtLnNob3dEcm9wZG93blxuXHQgICAgfSxcblx0ICAgIHN0YXRpY1N0eWxlOiB7XG5cdCAgICAgIFwicG9zaXRpb25cIjogXCJyZWxhdGl2ZVwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImZvcm0tY29udHJvbFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwidGV4dFwiLFxuXHQgICAgICBcImF1dG9jb21wbGV0ZVwiOiBcIm9mZlwiLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlclxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5zaG93RHJvcGRvd24gPSBmYWxzZVxuXHQgICAgICB9LFxuXHQgICAgICBcImtleWRvd25cIjogW2Z1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZG93blwiLCA0MCkpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLmRvd24oJGV2ZW50KVxuXHQgICAgICB9LCBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzKSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0uaGl0KCRldmVudClcblx0ICAgICAgfSwgZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS5yZXNldCgkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwidXBcIiwgMzgpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS51cCgkZXZlbnQpXG5cdCAgICAgIH1dLFxuXHQgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmICgkZXZlbnQudGFyZ2V0LmNvbXBvc2luZykgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0udmFsID0gJGV2ZW50LnRhcmdldC52YWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygndWwnLCB7XG5cdCAgICByZWY6IFwiZHJvcGRvd25cIixcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRyb3Bkb3duLW1lbnVcIlxuXHQgIH0sIF92bS5fbCgoX3ZtLml0ZW1zKSwgZnVuY3Rpb24oaXRlbSwgaSkge1xuXHQgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgIGNsYXNzOiB7XG5cdCAgICAgICAgJ2FjdGl2ZSc6IF92bS5pc0FjdGl2ZShpKVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uaGl0KCRldmVudClcblx0ICAgICAgICB9LFxuXHQgICAgICAgIFwibW91c2Vtb3ZlXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLnNldEFjdGl2ZShpKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fYyhfdm0udG1wbCwge1xuXHQgICAgICB0YWc6IFwiY29tcG9uZW50XCIsXG5cdCAgICAgIGF0dHJzOiB7XG5cdCAgICAgICAgXCJpdGVtXCI6IGl0ZW1cblx0ICAgICAgfVxuXHQgICAgfSldLCAxKV0pXG5cdCAgfSkpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNWI1ZjVlOTRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH1cbi8qKioqKiovIF0pXG59KTtcbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZ1ZS1zdHJhcC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdnVlLXN0cmFwL2Rpc3QvdnVlLXN0cmFwLmpzXG4vLyBtb2R1bGUgaWQgPSA0OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); /***/ }, /* 50 */ /***/ function(module, exports, __webpack_require__) { -eval("// style-loader: Adds some css to the DOM by adding a \\\\n\\\\n\\\\n\\\\n\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\n// exports\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQXV0aG9yaXplZENsaWVudHMudnVlPzcwYzEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWN0aW9uLWxpbmtbZGF0YS12LTQwYzk2YjQ5XSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLm0tYi1ub25lW2RhdGEtdi00MGM5NmI0OV0ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL3Bhc3Nwb3J0L0F1dGhvcml6ZWRDbGllbnRzLnZ1ZT9hOTkwNzZjMFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJBdXRob3JpemVkQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWhlYWRpbmdcXFwiPkF1dGhvcml6ZWQgQXBwbGljYXRpb25zPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBdXRob3JpemVkIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+U2NvcGVzPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcInRva2VuIGluIHRva2Vuc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENsaWVudCBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uY2xpZW50Lm5hbWUgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNjb3BlcyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XFxcInRva2VuLnNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uc2NvcGVzLmpvaW4oJywgJykgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZXZva2UgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZva2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICB0b2tlbnM6IFtdXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBwcmVwYXJlQ29tcG9uZW50KCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogR2V0IGFsbCBvZiB0aGUgYXV0aG9yaXplZCB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC90b2tlbnMnKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2tlbnMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUmV2b2tlIHRoZSBnaXZlbiB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICByZXZva2UodG9rZW4pIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5kZWxldGUoJy9vYXV0aC90b2tlbnMvJyArIHRva2VuLmlkKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbnMoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG48L3NjcmlwdD5cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQwYzk2YjQ5JnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL3Bhc3Nwb3J0L0F1dGhvcml6ZWRDbGllbnRzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\n// imports\\n\\n\\n// module\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"importer.vue\\\",\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\n// exports\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXIudnVlP2FlN2UiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwiZmlsZVwiOlwiaW1wb3J0ZXIudnVlXCIsXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTc4YjIzMWM2JnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2ltcG9ydGVyL2ltcG9ydGVyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\n// imports\\n\\n\\n// module\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"alert.vue\\\",\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\n// exports\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvYWxlcnQudnVlPzlmZTIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwiZmlsZVwiOlwiYWxlcnQudnVlXCIsXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTdiNmZlZGIzJnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2FsZXJ0LnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\n// imports\\n\\n\\n// module\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"importer-errors.vue\\\",\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\n// exports\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZT9jMmZiIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLy4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJcIixcImZpbGVcIjpcImltcG9ydGVyLWVycm9ycy52dWVcIixcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtYmQxY2RjZmMmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\n// imports\\n\\n\\n// module\\nexports.push([module.i, \\\"\\\\n.action-link[data-v-cb459f5c] {\\\\n cursor: pointer;\\\\n}\\\\n.m-b-none[data-v-cb459f5c] {\\\\n margin-bottom: 0;\\\\n}\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[\\\"/./resources/assets/js/components/passport/PersonalAccessTokens.vue?5734f4e4\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\\\",\\\"file\\\":\\\"PersonalAccessTokens.vue\\\",\\\"sourcesContent\\\":[\\\"\\\\n\\\\n\\\\n\\\\n\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\n// exports\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvUGVyc29uYWxBY2Nlc3NUb2tlbnMudnVlP2RiZTQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWN0aW9uLWxpbmtbZGF0YS12LWNiNDU5ZjVjXSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLm0tYi1ub25lW2RhdGEtdi1jYjQ1OWY1Y10ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL3Bhc3Nwb3J0L1BlcnNvbmFsQWNjZXNzVG9rZW5zLnZ1ZT81NzM0ZjRlNFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJQZXJzb25hbEFjY2Vzc1Rva2Vucy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbCBwYW5lbC1kZWZhdWx0XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVxcXCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2Vuc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cXFwiYWN0aW9uLWxpbmtcXFwiIEBjbGljaz1cXFwic2hvd0NyZWF0ZVRva2VuRm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBOZXcgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBUb2tlbnMgTm90aWNlIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XFxcIm0tYi1ub25lXFxcIiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID09PSAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBZb3UgaGF2ZSBub3QgY3JlYXRlZCBhbnkgcGVyc29uYWwgYWNjZXNzIHRva2Vucy5cXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUGVyc29uYWwgQWNjZXNzIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCIgdi1pZj1cXFwidG9rZW5zLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPk5hbWU8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB2LWZvcj1cXFwidG9rZW4gaW4gdG9rZW5zXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2xpZW50IE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0b2tlbi5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZWxldGUgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gTW9kYWwgLS0+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbCBmYWRlXFxcIiBpZD1cXFwibW9kYWwtY3JlYXRlLXRva2VuXFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZm9ybS5lcnJvcnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxzdHJvbmc+V2hvb3BzITwvc3Ryb25nPiBTb21ldGhpbmcgd2VudCB3cm9uZyE8L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIHYtZm9yPVxcXCJlcnJvciBpbiBmb3JtLmVycm9yc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXJyb3IgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gRm9ybSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cXFwiZm9ybS1ob3Jpem9udGFsXFxcIiByb2xlPVxcXCJmb3JtXFxcIiBAc3VibWl0LnByZXZlbnQ9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+TmFtZTwvbGFiZWw+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtNlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJjcmVhdGUtdG9rZW4tbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwibmFtZVxcXCIgdi1tb2RlbD1cXFwiZm9ybS5uYW1lXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTY29wZXMgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIHYtaWY9XFxcInNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+U2NvcGVzPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC02XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtZm9yPVxcXCJzY29wZSBpbiBzY29wZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjaGVja2JveFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9XFxcInRvZ2dsZVNjb3BlKHNjb3BlLmlkKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNoZWNrZWQ9XFxcInNjb3BlSXNBc3NpZ25lZChzY29wZS5pZClcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzY29wZS5pZCB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQWNjZXNzIFRva2VuIE1vZGFsIC0tPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwgZmFkZVxcXCIgaWQ9XFxcIm1vZGFsLWFjY2Vzcy10b2tlblxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2VuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgeW91ciBuZXcgcGVyc29uYWwgYWNjZXNzIHRva2VuLiBUaGlzIGlzIHRoZSBvbmx5IHRpbWUgaXQgd2lsbCBiZSBzaG93biBzbyBkb24ndCBsb3NlIGl0IVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IG5vdyB1c2UgdGhpcyB0b2tlbiB0byBtYWtlIEFQSSByZXF1ZXN0cy5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZT57eyBhY2Nlc3NUb2tlbiB9fTwvY29kZT48L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNb2RhbCBBY3Rpb25zIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdFxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCI+Q2xvc2U8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogbnVsbCxcXG5cXG4gICAgICAgICAgICAgICAgdG9rZW5zOiBbXSxcXG4gICAgICAgICAgICAgICAgc2NvcGVzOiBbXSxcXG5cXG4gICAgICAgICAgICAgICAgZm9ybToge1xcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICBzY29wZXM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW5zKCk7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2NvcGVzKCk7XFxuXFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5vbignc2hvd24uYnMubW9kYWwnLCAoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAkKCcjY3JlYXRlLXRva2VuLW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIHBlcnNvbmFsIGFjY2VzcyB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zID0gcmVzcG9uc2UuZGF0YTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIGF2YWlsYWJsZSBzY29wZXMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgZ2V0U2NvcGVzKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmdldCgnL29hdXRoL3Njb3BlcycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjb3BlcyA9IHJlc3BvbnNlLmRhdGE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBTaG93IHRoZSBmb3JtIGZvciBjcmVhdGluZyBuZXcgdG9rZW5zLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dDcmVhdGVUb2tlbkZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5tb2RhbCgnc2hvdycpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogQ3JlYXRlIGEgbmV3IHBlcnNvbmFsIGFjY2VzcyB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBzdG9yZSgpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IG51bGw7XFxuXFxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2VucycsIHRoaXMuZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5uYW1lID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMgPSBbXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmVycm9ycyA9IFtdO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHJlc3BvbnNlLmRhdGEudG9rZW4pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBY2Nlc3NUb2tlbihyZXNwb25zZS5kYXRhLmFjY2Vzc1Rva2VuKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBfLmZsYXR0ZW4oXy50b0FycmF5KHJlc3BvbnNlLmRhdGEpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kaXIodGhpcy5mb3JtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbJ1NvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluLiddO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBUb2dnbGUgdGhlIGdpdmVuIHNjb3BlIGluIHRoZSBsaXN0IG9mIGFzc2lnbmVkIHNjb3Blcy5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB0b2dnbGVTY29wZShzY29wZSkge1xcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY29wZUlzQXNzaWduZWQoc2NvcGUpKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uc2NvcGVzID0gXy5yZWplY3QodGhpcy5mb3JtLnNjb3BlcywgcyA9PiBzID09IHNjb3BlKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMucHVzaChzY29wZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gc2NvcGUgaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIHRva2VuLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNjb3BlSXNBc3NpZ25lZChzY29wZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXy5pbmRleE9mKHRoaXMuZm9ybS5zY29wZXMsIHNjb3BlKSA+PSAwO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZ2l2ZW4gYWNjZXNzIHRva2VuIHRvIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikge1xcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLXRva2VuJykubW9kYWwoJ2hpZGUnKTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtYWNjZXNzLXRva2VuJykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFJldm9rZSB0aGUgZ2l2ZW4gdG9rZW4uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcmV2b2tlKHRva2VuKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZGVsZXRlKCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2Vucy8nICsgdG9rZW4uaWQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtY2I0NTlmNWMmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvUGVyc29uYWxBY2Nlc3NUb2tlbnMudnVlXG4vLyBtb2R1bGUgaWQgPSAyNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\n// imports\\n\\n\\n// module\\nexports.push([module.i, \\\"\\\\n.action-link[data-v-e7598638] {\\\\n cursor: pointer;\\\\n}\\\\n.m-b-none[data-v-e7598638] {\\\\n margin-bottom: 0;\\\\n}\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[\\\"/./resources/assets/js/components/passport/Clients.vue?35867ce4\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\\\",\\\"file\\\":\\\"Clients.vue\\\",\\\"sourcesContent\\\":[\\\"\\\\n\\\\n\\\\n\\\\n\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\n// exports\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWU/YzY2MCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5hY3Rpb24tbGlua1tkYXRhLXYtZTc1OTg2MzhdIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4ubS1iLW5vbmVbZGF0YS12LWU3NTk4NjM4XSB7XFxuICAgIG1hcmdpbi1ib3R0b206IDA7XFxufVxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWU/MzU4NjdjZTRcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQUNBO0lBQ0EsZ0JBQUE7Q0FDQTtBQUVBO0lBQ0EsaUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XFxcImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgT0F1dGggQ2xpZW50c1xcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcInNob3dDcmVhdGVDbGllbnRGb3JtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgTmV3IENsaWVudFxcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBDdXJyZW50IENsaWVudHMgLS0+XFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVxcXCJtLWItbm9uZVxcXCIgdi1pZj1cXFwiY2xpZW50cy5sZW5ndGggPT09IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgWW91IGhhdmUgbm90IGNyZWF0ZWQgYW55IE9BdXRoIGNsaWVudHMuXFxuICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVxcXCJ0YWJsZSB0YWJsZS1ib3JkZXJsZXNzIG0tYi1ub25lXFxcIiB2LWlmPVxcXCJjbGllbnRzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkNsaWVudCBJRDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlNlY3JldDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcImNsaWVudCBpbiBjbGllbnRzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJRCAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjbGllbnQuaWQgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNsaWVudC5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VjcmV0IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnt7IGNsaWVudC5zZWNyZXQgfX08L2NvZGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRWRpdCBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcImVkaXQoY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERlbGV0ZSBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcImRlc3Ryb3koY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgIDwvdGFibGU+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1jcmVhdGUtY2xpZW50XFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgQ2xpZW50XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtIEVycm9ycyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhbGVydCBhbGVydC1kYW5nZXJcXFwiIHYtaWY9XFxcImNyZWF0ZUZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gY3JlYXRlRm9ybS5lcnJvcnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVycm9yIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBGb3JtIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVxcXCJmb3JtLWhvcml6b250YWxcXFwiIHJvbGU9XFxcImZvcm1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5OYW1lPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XFxcImNyZWF0ZS1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJzdG9yZVxcXCIgdi1tb2RlbD1cXFwiY3JlYXRlRm9ybS5uYW1lXFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWV0aGluZyB5b3VyIHVzZXJzIHdpbGwgcmVjb2duaXplIGFuZCB0cnVzdC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVkaXJlY3QgVVJMIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTMgY29udHJvbC1sYWJlbFxcXCI+UmVkaXJlY3QgVVJMPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwicmVkaXJlY3RcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBrZXl1cC5lbnRlcj1cXFwic3RvcmVcXFwiIHYtbW9kZWw9XFxcImNyZWF0ZUZvcm0ucmVkaXJlY3RcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91ciBhcHBsaWNhdGlvbidzIGF1dGhvcml6YXRpb24gY2FsbGJhY2sgVVJMLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTW9kYWwgQWN0aW9ucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHRcXFwiIGRhdGEtZGlzbWlzcz1cXFwibW9kYWxcXFwiPkNsb3NlPC9idXR0b24+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwic3RvcmVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBFZGl0IENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1lZGl0LWNsaWVudFxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCBDbGllbnRcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZWRpdEZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gZWRpdEZvcm0uZXJyb3JzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBlcnJvciB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVkaXQgQ2xpZW50IEZvcm0gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XFxcImZvcm0taG9yaXpvbnRhbFxcXCIgcm9sZT1cXFwiZm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTmFtZSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XFxcImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcXFwiPk5hbWU8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwiZWRpdC1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLm5hbWVcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZXRoaW5nIHlvdXIgdXNlcnMgd2lsbCByZWNvZ25pemUgYW5kIHRydXN0LlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZWRpcmVjdCBVUkwgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5SZWRpcmVjdCBVUkw8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBuYW1lPVxcXCJyZWRpcmVjdFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLnJlZGlyZWN0XFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdXIgYXBwbGljYXRpb24ncyBhdXRob3JpemF0aW9uIGNhbGxiYWNrIFVSTC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInVwZGF0ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgQ2hhbmdlc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvdGVtcGxhdGU+XFxuXFxuPHNjcmlwdD5cXG4gICAgZXhwb3J0IGRlZmF1bHQge1xcbiAgICAgICAgLypcXG4gICAgICAgICAqIFRoZSBjb21wb25lbnQncyBkYXRhLlxcbiAgICAgICAgICovXFxuICAgICAgICBkYXRhKCkge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGNsaWVudHM6IFtdLFxcblxcbiAgICAgICAgICAgICAgICBjcmVhdGVGb3JtOiB7XFxuICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDogJydcXG4gICAgICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAgICAgZWRpdEZvcm06IHtcXG4gICAgICAgICAgICAgICAgICAgIGVycm9yczogW10sXFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyxcXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnJ1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLWNsaWVudCcpLm9uKCdzaG93bi5icy5tb2RhbCcsICgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICQoJyNjcmVhdGUtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50Jykub24oJ3Nob3duLmJzLm1vZGFsJywgKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgJCgnI2VkaXQtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIE9BdXRoIGNsaWVudHMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldENsaWVudHMoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZ2V0KCcvb2F1dGgvY2xpZW50cycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudHMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZm9ybSBmb3IgY3JlYXRpbmcgbmV3IGNsaWVudHMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgc2hvd0NyZWF0ZUNsaWVudEZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIENyZWF0ZSBhIG5ldyBPQXV0aCBjbGllbnQgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHN0b3JlKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLnBlcnNpc3RDbGllbnQoXFxuICAgICAgICAgICAgICAgICAgICAncG9zdCcsICcvb2F1dGgvY2xpZW50cycsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm0sICcjbW9kYWwtY3JlYXRlLWNsaWVudCdcXG4gICAgICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEVkaXQgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBlZGl0KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLmlkID0gY2xpZW50LmlkO1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLm5hbWUgPSBjbGllbnQubmFtZTtcXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybS5yZWRpcmVjdCA9IGNsaWVudC5yZWRpcmVjdDtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgY2xpZW50IGJlaW5nIGVkaXRlZC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB1cGRhdGUoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdENsaWVudChcXG4gICAgICAgICAgICAgICAgICAgICdwdXQnLCAnL29hdXRoL2NsaWVudHMvJyArIHRoaXMuZWRpdEZvcm0uaWQsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLCAnI21vZGFsLWVkaXQtY2xpZW50J1xcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUGVyc2lzdCB0aGUgY2xpZW50IHRvIHN0b3JhZ2UgdXNpbmcgdGhlIGdpdmVuIGZvcm0uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcGVyc2lzdENsaWVudChtZXRob2QsIHVyaSwgZm9ybSwgbW9kYWwpIHtcXG4gICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cFttZXRob2RdKHVyaSwgZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsaWVudHMoKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLm5hbWUgPSAnJztcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlZGlyZWN0ID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAkKG1vZGFsKS5tb2RhbCgnaGlkZScpO1xcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5kYXRhID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmVycm9ycyA9IF8uZmxhdHRlbihfLnRvQXJyYXkocmVzcG9uc2UuZGF0YSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uZXJyb3JzID0gWydTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERlc3Ryb3kgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBkZXN0cm95KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmRlbGV0ZSgnL29hdXRoL2NsaWVudHMvJyArIGNsaWVudC5pZClcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtZTc1OTg2Mzgmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWVcbi8vIG1vZHVsZSBpZCA9IDI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;( function( factory ) {\\n\\tif ( true ) {\\n\\n\\t\\t// AMD. Register as an anonymous module.\\n\\t\\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(3) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\t} else {\\n\\n\\t\\t// Browser globals\\n\\t\\tfactory( jQuery );\\n\\t}\\n} ( function( $ ) {\\n\\n$.ui = $.ui || {};\\n\\nreturn $.ui.version = \\\"1.12.1\\\";\\n\\n} ) );\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2pxdWVyeS11aS91aS92ZXJzaW9uLmpzP2JkNDEiXSwic291cmNlc0NvbnRlbnQiOlsiKCBmdW5jdGlvbiggZmFjdG9yeSApIHtcblx0aWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblxuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoIFsgXCJqcXVlcnlcIiBdLCBmYWN0b3J5ICk7XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBCcm93c2VyIGdsb2JhbHNcblx0XHRmYWN0b3J5KCBqUXVlcnkgKTtcblx0fVxufSAoIGZ1bmN0aW9uKCAkICkge1xuXG4kLnVpID0gJC51aSB8fCB7fTtcblxucmV0dXJuICQudWkudmVyc2lvbiA9IFwiMS4xMi4xXCI7XG5cbn0gKSApO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2pxdWVyeS11aS91aS92ZXJzaW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\\n * jQuery UI Widget 1.12.1\\n * http://jqueryui.com\\n *\\n * Copyright jQuery Foundation and other contributors\\n * Released under the MIT license.\\n * http://jquery.org/license\\n */\\n\\n//>>label: Widget\\n//>>group: Core\\n//>>description: Provides a factory for creating stateful widgets with a common API.\\n//>>docs: http://api.jqueryui.com/jQuery.widget/\\n//>>demos: http://jqueryui.com/widget/\\n\\n( function( factory ) {\\n\\tif ( true ) {\\n\\n\\t\\t// AMD. Register as an anonymous module.\\n\\t\\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(3), __webpack_require__(26) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\t} else {\\n\\n\\t\\t// Browser globals\\n\\t\\tfactory( jQuery );\\n\\t}\\n}( function( $ ) {\\n\\nvar widgetUuid = 0;\\nvar widgetSlice = Array.prototype.slice;\\n\\n$.cleanData = ( function( orig ) {\\n\\treturn function( elems ) {\\n\\t\\tvar events, elem, i;\\n\\t\\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\\n\\t\\t\\ttry {\\n\\n\\t\\t\\t\\t// Only trigger remove when necessary to save time\\n\\t\\t\\t\\tevents = $._data( elem, \\\"events\\\" );\\n\\t\\t\\t\\tif ( events && events.remove ) {\\n\\t\\t\\t\\t\\t$( elem ).triggerHandler( \\\"remove\\\" );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t// Http://bugs.jquery.com/ticket/8235\\n\\t\\t\\t} catch ( e ) {}\\n\\t\\t}\\n\\t\\torig( elems );\\n\\t};\\n} )( $.cleanData );\\n\\n$.widget = function( name, base, prototype ) {\\n\\tvar existingConstructor, constructor, basePrototype;\\n\\n\\t// ProxiedPrototype allows the provided prototype to remain unmodified\\n\\t// so that it can be used as a mixin for multiple widgets (#8876)\\n\\tvar proxiedPrototype = {};\\n\\n\\tvar namespace = name.split( \\\".\\\" )[ 0 ];\\n\\tname = name.split( \\\".\\\" )[ 1 ];\\n\\tvar fullName = namespace + \\\"-\\\" + name;\\n\\n\\tif ( !prototype ) {\\n\\t\\tprototype = base;\\n\\t\\tbase = $.Widget;\\n\\t}\\n\\n\\tif ( $.isArray( prototype ) ) {\\n\\t\\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\\n\\t}\\n\\n\\t// Create selector for plugin\\n\\t$.expr[ \\\":\\\" ][ fullName.toLowerCase() ] = function( elem ) {\\n\\t\\treturn !!$.data( elem, fullName );\\n\\t};\\n\\n\\t$[ namespace ] = $[ namespace ] || {};\\n\\texistingConstructor = $[ namespace ][ name ];\\n\\tconstructor = $[ namespace ][ name ] = function( options, element ) {\\n\\n\\t\\t// Allow instantiation without \\\"new\\\" keyword\\n\\t\\tif ( !this._createWidget ) {\\n\\t\\t\\treturn new constructor( options, element );\\n\\t\\t}\\n\\n\\t\\t// Allow instantiation without initializing for simple inheritance\\n\\t\\t// must use \\\"new\\\" keyword (the code above always passes args)\\n\\t\\tif ( arguments.length ) {\\n\\t\\t\\tthis._createWidget( options, element );\\n\\t\\t}\\n\\t};\\n\\n\\t// Extend with the existing constructor to carry over any static properties\\n\\t$.extend( constructor, existingConstructor, {\\n\\t\\tversion: prototype.version,\\n\\n\\t\\t// Copy the object used to create the prototype in case we need to\\n\\t\\t// redefine the widget later\\n\\t\\t_proto: $.extend( {}, prototype ),\\n\\n\\t\\t// Track widgets that inherit from this widget in case this widget is\\n\\t\\t// redefined after a widget inherits from it\\n\\t\\t_childConstructors: []\\n\\t} );\\n\\n\\tbasePrototype = new base();\\n\\n\\t// We need to make the options hash a property directly on the new instance\\n\\t// otherwise we'll modify the options hash on the prototype that we're\\n\\t// inheriting from\\n\\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\\n\\t$.each( prototype, function( prop, value ) {\\n\\t\\tif ( !$.isFunction( value ) ) {\\n\\t\\t\\tproxiedPrototype[ prop ] = value;\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\tproxiedPrototype[ prop ] = ( function() {\\n\\t\\t\\tfunction _super() {\\n\\t\\t\\t\\treturn base.prototype[ prop ].apply( this, arguments );\\n\\t\\t\\t}\\n\\n\\t\\t\\tfunction _superApply( args ) {\\n\\t\\t\\t\\treturn base.prototype[ prop ].apply( this, args );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn function() {\\n\\t\\t\\t\\tvar __super = this._super;\\n\\t\\t\\t\\tvar __superApply = this._superApply;\\n\\t\\t\\t\\tvar returnValue;\\n\\n\\t\\t\\t\\tthis._super = _super;\\n\\t\\t\\t\\tthis._superApply = _superApply;\\n\\n\\t\\t\\t\\treturnValue = value.apply( this, arguments );\\n\\n\\t\\t\\t\\tthis._super = __super;\\n\\t\\t\\t\\tthis._superApply = __superApply;\\n\\n\\t\\t\\t\\treturn returnValue;\\n\\t\\t\\t};\\n\\t\\t} )();\\n\\t} );\\n\\tconstructor.prototype = $.widget.extend( basePrototype, {\\n\\n\\t\\t// TODO: remove support for widgetEventPrefix\\n\\t\\t// always use the name + a colon as the prefix, e.g., draggable:start\\n\\t\\t// don't prefix for widgets that aren't DOM-based\\n\\t\\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\\n\\t}, proxiedPrototype, {\\n\\t\\tconstructor: constructor,\\n\\t\\tnamespace: namespace,\\n\\t\\twidgetName: name,\\n\\t\\twidgetFullName: fullName\\n\\t} );\\n\\n\\t// If this widget is being redefined then we need to find all widgets that\\n\\t// are inheriting from it and redefine all of them so that they inherit from\\n\\t// the new version of this widget. We're essentially trying to replace one\\n\\t// level in the prototype chain.\\n\\tif ( existingConstructor ) {\\n\\t\\t$.each( existingConstructor._childConstructors, function( i, child ) {\\n\\t\\t\\tvar childPrototype = child.prototype;\\n\\n\\t\\t\\t// Redefine the child widget using the same prototype that was\\n\\t\\t\\t// originally used, but inherit from the new version of the base\\n\\t\\t\\t$.widget( childPrototype.namespace + \\\".\\\" + childPrototype.widgetName, constructor,\\n\\t\\t\\t\\tchild._proto );\\n\\t\\t} );\\n\\n\\t\\t// Remove the list of existing child constructors from the old constructor\\n\\t\\t// so the old child constructors can be garbage collected\\n\\t\\tdelete existingConstructor._childConstructors;\\n\\t} else {\\n\\t\\tbase._childConstructors.push( constructor );\\n\\t}\\n\\n\\t$.widget.bridge( name, constructor );\\n\\n\\treturn constructor;\\n};\\n\\n$.widget.extend = function( target ) {\\n\\tvar input = widgetSlice.call( arguments, 1 );\\n\\tvar inputIndex = 0;\\n\\tvar inputLength = input.length;\\n\\tvar key;\\n\\tvar value;\\n\\n\\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\\n\\t\\tfor ( key in input[ inputIndex ] ) {\\n\\t\\t\\tvalue = input[ inputIndex ][ key ];\\n\\t\\t\\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\\n\\n\\t\\t\\t\\t// Clone objects\\n\\t\\t\\t\\tif ( $.isPlainObject( value ) ) {\\n\\t\\t\\t\\t\\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\\n\\t\\t\\t\\t\\t\\t$.widget.extend( {}, target[ key ], value ) :\\n\\n\\t\\t\\t\\t\\t\\t// Don't extend strings, arrays, etc. with objects\\n\\t\\t\\t\\t\\t\\t$.widget.extend( {}, value );\\n\\n\\t\\t\\t\\t// Copy everything else by reference\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ttarget[ key ] = value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn target;\\n};\\n\\n$.widget.bridge = function( name, object ) {\\n\\tvar fullName = object.prototype.widgetFullName || name;\\n\\t$.fn[ name ] = function( options ) {\\n\\t\\tvar isMethodCall = typeof options === \\\"string\\\";\\n\\t\\tvar args = widgetSlice.call( arguments, 1 );\\n\\t\\tvar returnValue = this;\\n\\n\\t\\tif ( isMethodCall ) {\\n\\n\\t\\t\\t// If this is an empty collection, we need to have the instance method\\n\\t\\t\\t// return undefined instead of the jQuery instance\\n\\t\\t\\tif ( !this.length && options === \\\"instance\\\" ) {\\n\\t\\t\\t\\treturnValue = undefined;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthis.each( function() {\\n\\t\\t\\t\\t\\tvar methodValue;\\n\\t\\t\\t\\t\\tvar instance = $.data( this, fullName );\\n\\n\\t\\t\\t\\t\\tif ( options === \\\"instance\\\" ) {\\n\\t\\t\\t\\t\\t\\treturnValue = instance;\\n\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tif ( !instance ) {\\n\\t\\t\\t\\t\\t\\treturn $.error( \\\"cannot call methods on \\\" + name +\\n\\t\\t\\t\\t\\t\\t\\t\\\" prior to initialization; \\\" +\\n\\t\\t\\t\\t\\t\\t\\t\\\"attempted to call method '\\\" + options + \\\"'\\\" );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tif ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === \\\"_\\\" ) {\\n\\t\\t\\t\\t\\t\\treturn $.error( \\\"no such method '\\\" + options + \\\"' for \\\" + name +\\n\\t\\t\\t\\t\\t\\t\\t\\\" widget instance\\\" );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tmethodValue = instance[ options ].apply( instance, args );\\n\\n\\t\\t\\t\\t\\tif ( methodValue !== instance && methodValue !== undefined ) {\\n\\t\\t\\t\\t\\t\\treturnValue = methodValue && methodValue.jquery ?\\n\\t\\t\\t\\t\\t\\t\\treturnValue.pushStack( methodValue.get() ) :\\n\\t\\t\\t\\t\\t\\t\\tmethodValue;\\n\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\n\\t\\t\\t// Allow multiple hashes to be passed on init\\n\\t\\t\\tif ( args.length ) {\\n\\t\\t\\t\\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\\n\\t\\t\\t}\\n\\n\\t\\t\\tthis.each( function() {\\n\\t\\t\\t\\tvar instance = $.data( this, fullName );\\n\\t\\t\\t\\tif ( instance ) {\\n\\t\\t\\t\\t\\tinstance.option( options || {} );\\n\\t\\t\\t\\t\\tif ( instance._init ) {\\n\\t\\t\\t\\t\\t\\tinstance._init();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t$.data( this, fullName, new object( options, this ) );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn returnValue;\\n\\t};\\n};\\n\\n$.Widget = function( /* options, element */ ) {};\\n$.Widget._childConstructors = [];\\n\\n$.Widget.prototype = {\\n\\twidgetName: \\\"widget\\\",\\n\\twidgetEventPrefix: \\\"\\\",\\n\\tdefaultElement: \\\"
\\\",\\n\\n\\toptions: {\\n\\t\\tclasses: {},\\n\\t\\tdisabled: false,\\n\\n\\t\\t// Callbacks\\n\\t\\tcreate: null\\n\\t},\\n\\n\\t_createWidget: function( options, element ) {\\n\\t\\telement = $( element || this.defaultElement || this )[ 0 ];\\n\\t\\tthis.element = $( element );\\n\\t\\tthis.uuid = widgetUuid++;\\n\\t\\tthis.eventNamespace = \\\".\\\" + this.widgetName + this.uuid;\\n\\n\\t\\tthis.bindings = $();\\n\\t\\tthis.hoverable = $();\\n\\t\\tthis.focusable = $();\\n\\t\\tthis.classesElementLookup = {};\\n\\n\\t\\tif ( element !== this ) {\\n\\t\\t\\t$.data( element, this.widgetFullName, this );\\n\\t\\t\\tthis._on( true, this.element, {\\n\\t\\t\\t\\tremove: function( event ) {\\n\\t\\t\\t\\t\\tif ( event.target === element ) {\\n\\t\\t\\t\\t\\t\\tthis.destroy();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t\\tthis.document = $( element.style ?\\n\\n\\t\\t\\t\\t// Element within the document\\n\\t\\t\\t\\telement.ownerDocument :\\n\\n\\t\\t\\t\\t// Element is window or document\\n\\t\\t\\t\\telement.document || element );\\n\\t\\t\\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\\n\\t\\t}\\n\\n\\t\\tthis.options = $.widget.extend( {},\\n\\t\\t\\tthis.options,\\n\\t\\t\\tthis._getCreateOptions(),\\n\\t\\t\\toptions );\\n\\n\\t\\tthis._create();\\n\\n\\t\\tif ( this.options.disabled ) {\\n\\t\\t\\tthis._setOptionDisabled( this.options.disabled );\\n\\t\\t}\\n\\n\\t\\tthis._trigger( \\\"create\\\", null, this._getCreateEventData() );\\n\\t\\tthis._init();\\n\\t},\\n\\n\\t_getCreateOptions: function() {\\n\\t\\treturn {};\\n\\t},\\n\\n\\t_getCreateEventData: $.noop,\\n\\n\\t_create: $.noop,\\n\\n\\t_init: $.noop,\\n\\n\\tdestroy: function() {\\n\\t\\tvar that = this;\\n\\n\\t\\tthis._destroy();\\n\\t\\t$.each( this.classesElementLookup, function( key, value ) {\\n\\t\\t\\tthat._removeClass( value, key );\\n\\t\\t} );\\n\\n\\t\\t// We can probably remove the unbind calls in 2.0\\n\\t\\t// all event bindings should go through this._on()\\n\\t\\tthis.element\\n\\t\\t\\t.off( this.eventNamespace )\\n\\t\\t\\t.removeData( this.widgetFullName );\\n\\t\\tthis.widget()\\n\\t\\t\\t.off( this.eventNamespace )\\n\\t\\t\\t.removeAttr( \\\"aria-disabled\\\" );\\n\\n\\t\\t// Clean up events and states\\n\\t\\tthis.bindings.off( this.eventNamespace );\\n\\t},\\n\\n\\t_destroy: $.noop,\\n\\n\\twidget: function() {\\n\\t\\treturn this.element;\\n\\t},\\n\\n\\toption: function( key, value ) {\\n\\t\\tvar options = key;\\n\\t\\tvar parts;\\n\\t\\tvar curOption;\\n\\t\\tvar i;\\n\\n\\t\\tif ( arguments.length === 0 ) {\\n\\n\\t\\t\\t// Don't return a reference to the internal hash\\n\\t\\t\\treturn $.widget.extend( {}, this.options );\\n\\t\\t}\\n\\n\\t\\tif ( typeof key === \\\"string\\\" ) {\\n\\n\\t\\t\\t// Handle nested keys, e.g., \\\"foo.bar\\\" => { foo: { bar: ___ } }\\n\\t\\t\\toptions = {};\\n\\t\\t\\tparts = key.split( \\\".\\\" );\\n\\t\\t\\tkey = parts.shift();\\n\\t\\t\\tif ( parts.length ) {\\n\\t\\t\\t\\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\\n\\t\\t\\t\\tfor ( i = 0; i < parts.length - 1; i++ ) {\\n\\t\\t\\t\\t\\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\\n\\t\\t\\t\\t\\tcurOption = curOption[ parts[ i ] ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tkey = parts.pop();\\n\\t\\t\\t\\tif ( arguments.length === 1 ) {\\n\\t\\t\\t\\t\\treturn curOption[ key ] === undefined ? null : curOption[ key ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcurOption[ key ] = value;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif ( arguments.length === 1 ) {\\n\\t\\t\\t\\t\\treturn this.options[ key ] === undefined ? null : this.options[ key ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\toptions[ key ] = value;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis._setOptions( options );\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOptions: function( options ) {\\n\\t\\tvar key;\\n\\n\\t\\tfor ( key in options ) {\\n\\t\\t\\tthis._setOption( key, options[ key ] );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOption: function( key, value ) {\\n\\t\\tif ( key === \\\"classes\\\" ) {\\n\\t\\t\\tthis._setOptionClasses( value );\\n\\t\\t}\\n\\n\\t\\tthis.options[ key ] = value;\\n\\n\\t\\tif ( key === \\\"disabled\\\" ) {\\n\\t\\t\\tthis._setOptionDisabled( value );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOptionClasses: function( value ) {\\n\\t\\tvar classKey, elements, currentElements;\\n\\n\\t\\tfor ( classKey in value ) {\\n\\t\\t\\tcurrentElements = this.classesElementLookup[ classKey ];\\n\\t\\t\\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\\n\\t\\t\\t\\t\\t!currentElements ||\\n\\t\\t\\t\\t\\t!currentElements.length ) {\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// We are doing this to create a new jQuery object because the _removeClass() call\\n\\t\\t\\t// on the next line is going to destroy the reference to the current elements being\\n\\t\\t\\t// tracked. We need to save a copy of this collection so that we can add the new classes\\n\\t\\t\\t// below.\\n\\t\\t\\telements = $( currentElements.get() );\\n\\t\\t\\tthis._removeClass( currentElements, classKey );\\n\\n\\t\\t\\t// We don't use _addClass() here, because that uses this.options.classes\\n\\t\\t\\t// for generating the string of classes. We want to use the value passed in from\\n\\t\\t\\t// _setOption(), this is the new value of the classes option which was passed to\\n\\t\\t\\t// _setOption(). We pass this value directly to _classes().\\n\\t\\t\\telements.addClass( this._classes( {\\n\\t\\t\\t\\telement: elements,\\n\\t\\t\\t\\tkeys: classKey,\\n\\t\\t\\t\\tclasses: value,\\n\\t\\t\\t\\tadd: true\\n\\t\\t\\t} ) );\\n\\t\\t}\\n\\t},\\n\\n\\t_setOptionDisabled: function( value ) {\\n\\t\\tthis._toggleClass( this.widget(), this.widgetFullName + \\\"-disabled\\\", null, !!value );\\n\\n\\t\\t// If the widget is becoming disabled, then nothing is interactive\\n\\t\\tif ( value ) {\\n\\t\\t\\tthis._removeClass( this.hoverable, null, \\\"ui-state-hover\\\" );\\n\\t\\t\\tthis._removeClass( this.focusable, null, \\\"ui-state-focus\\\" );\\n\\t\\t}\\n\\t},\\n\\n\\tenable: function() {\\n\\t\\treturn this._setOptions( { disabled: false } );\\n\\t},\\n\\n\\tdisable: function() {\\n\\t\\treturn this._setOptions( { disabled: true } );\\n\\t},\\n\\n\\t_classes: function( options ) {\\n\\t\\tvar full = [];\\n\\t\\tvar that = this;\\n\\n\\t\\toptions = $.extend( {\\n\\t\\t\\telement: this.element,\\n\\t\\t\\tclasses: this.options.classes || {}\\n\\t\\t}, options );\\n\\n\\t\\tfunction processClassString( classes, checkOption ) {\\n\\t\\t\\tvar current, i;\\n\\t\\t\\tfor ( i = 0; i < classes.length; i++ ) {\\n\\t\\t\\t\\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\\n\\t\\t\\t\\tif ( options.add ) {\\n\\t\\t\\t\\t\\tcurrent = $( $.unique( current.get().concat( options.element.get() ) ) );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcurrent = $( current.not( options.element ).get() );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tthat.classesElementLookup[ classes[ i ] ] = current;\\n\\t\\t\\t\\tfull.push( classes[ i ] );\\n\\t\\t\\t\\tif ( checkOption && options.classes[ classes[ i ] ] ) {\\n\\t\\t\\t\\t\\tfull.push( options.classes[ classes[ i ] ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis._on( options.element, {\\n\\t\\t\\t\\\"remove\\\": \\\"_untrackClassesElement\\\"\\n\\t\\t} );\\n\\n\\t\\tif ( options.keys ) {\\n\\t\\t\\tprocessClassString( options.keys.match( /\\\\S+/g ) || [], true );\\n\\t\\t}\\n\\t\\tif ( options.extra ) {\\n\\t\\t\\tprocessClassString( options.extra.match( /\\\\S+/g ) || [] );\\n\\t\\t}\\n\\n\\t\\treturn full.join( \\\" \\\" );\\n\\t},\\n\\n\\t_untrackClassesElement: function( event ) {\\n\\t\\tvar that = this;\\n\\t\\t$.each( that.classesElementLookup, function( key, value ) {\\n\\t\\t\\tif ( $.inArray( event.target, value ) !== -1 ) {\\n\\t\\t\\t\\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_removeClass: function( element, keys, extra ) {\\n\\t\\treturn this._toggleClass( element, keys, extra, false );\\n\\t},\\n\\n\\t_addClass: function( element, keys, extra ) {\\n\\t\\treturn this._toggleClass( element, keys, extra, true );\\n\\t},\\n\\n\\t_toggleClass: function( element, keys, extra, add ) {\\n\\t\\tadd = ( typeof add === \\\"boolean\\\" ) ? add : extra;\\n\\t\\tvar shift = ( typeof element === \\\"string\\\" || element === null ),\\n\\t\\t\\toptions = {\\n\\t\\t\\t\\textra: shift ? keys : extra,\\n\\t\\t\\t\\tkeys: shift ? element : keys,\\n\\t\\t\\t\\telement: shift ? this.element : element,\\n\\t\\t\\t\\tadd: add\\n\\t\\t\\t};\\n\\t\\toptions.element.toggleClass( this._classes( options ), add );\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_on: function( suppressDisabledCheck, element, handlers ) {\\n\\t\\tvar delegateElement;\\n\\t\\tvar instance = this;\\n\\n\\t\\t// No suppressDisabledCheck flag, shuffle arguments\\n\\t\\tif ( typeof suppressDisabledCheck !== \\\"boolean\\\" ) {\\n\\t\\t\\thandlers = element;\\n\\t\\t\\telement = suppressDisabledCheck;\\n\\t\\t\\tsuppressDisabledCheck = false;\\n\\t\\t}\\n\\n\\t\\t// No element argument, shuffle and use this.element\\n\\t\\tif ( !handlers ) {\\n\\t\\t\\thandlers = element;\\n\\t\\t\\telement = this.element;\\n\\t\\t\\tdelegateElement = this.widget();\\n\\t\\t} else {\\n\\t\\t\\telement = delegateElement = $( element );\\n\\t\\t\\tthis.bindings = this.bindings.add( element );\\n\\t\\t}\\n\\n\\t\\t$.each( handlers, function( event, handler ) {\\n\\t\\t\\tfunction handlerProxy() {\\n\\n\\t\\t\\t\\t// Allow widgets to customize the disabled handling\\n\\t\\t\\t\\t// - disabled as an array instead of boolean\\n\\t\\t\\t\\t// - disabled class as method for disabling individual parts\\n\\t\\t\\t\\tif ( !suppressDisabledCheck &&\\n\\t\\t\\t\\t\\t\\t( instance.options.disabled === true ||\\n\\t\\t\\t\\t\\t\\t$( this ).hasClass( \\\"ui-state-disabled\\\" ) ) ) {\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn ( typeof handler === \\\"string\\\" ? instance[ handler ] : handler )\\n\\t\\t\\t\\t\\t.apply( instance, arguments );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Copy the guid so direct unbinding works\\n\\t\\t\\tif ( typeof handler !== \\\"string\\\" ) {\\n\\t\\t\\t\\thandlerProxy.guid = handler.guid =\\n\\t\\t\\t\\t\\thandler.guid || handlerProxy.guid || $.guid++;\\n\\t\\t\\t}\\n\\n\\t\\t\\tvar match = event.match( /^([\\\\w:-]*)\\\\s*(.*)$/ );\\n\\t\\t\\tvar eventName = match[ 1 ] + instance.eventNamespace;\\n\\t\\t\\tvar selector = match[ 2 ];\\n\\n\\t\\t\\tif ( selector ) {\\n\\t\\t\\t\\tdelegateElement.on( eventName, selector, handlerProxy );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\telement.on( eventName, handlerProxy );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_off: function( element, eventName ) {\\n\\t\\teventName = ( eventName || \\\"\\\" ).split( \\\" \\\" ).join( this.eventNamespace + \\\" \\\" ) +\\n\\t\\t\\tthis.eventNamespace;\\n\\t\\telement.off( eventName ).off( eventName );\\n\\n\\t\\t// Clear the stack to avoid memory leaks (#10056)\\n\\t\\tthis.bindings = $( this.bindings.not( element ).get() );\\n\\t\\tthis.focusable = $( this.focusable.not( element ).get() );\\n\\t\\tthis.hoverable = $( this.hoverable.not( element ).get() );\\n\\t},\\n\\n\\t_delay: function( handler, delay ) {\\n\\t\\tfunction handlerProxy() {\\n\\t\\t\\treturn ( typeof handler === \\\"string\\\" ? instance[ handler ] : handler )\\n\\t\\t\\t\\t.apply( instance, arguments );\\n\\t\\t}\\n\\t\\tvar instance = this;\\n\\t\\treturn setTimeout( handlerProxy, delay || 0 );\\n\\t},\\n\\n\\t_hoverable: function( element ) {\\n\\t\\tthis.hoverable = this.hoverable.add( element );\\n\\t\\tthis._on( element, {\\n\\t\\t\\tmouseenter: function( event ) {\\n\\t\\t\\t\\tthis._addClass( $( event.currentTarget ), null, \\\"ui-state-hover\\\" );\\n\\t\\t\\t},\\n\\t\\t\\tmouseleave: function( event ) {\\n\\t\\t\\t\\tthis._removeClass( $( event.currentTarget ), null, \\\"ui-state-hover\\\" );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_focusable: function( element ) {\\n\\t\\tthis.focusable = this.focusable.add( element );\\n\\t\\tthis._on( element, {\\n\\t\\t\\tfocusin: function( event ) {\\n\\t\\t\\t\\tthis._addClass( $( event.currentTarget ), null, \\\"ui-state-focus\\\" );\\n\\t\\t\\t},\\n\\t\\t\\tfocusout: function( event ) {\\n\\t\\t\\t\\tthis._removeClass( $( event.currentTarget ), null, \\\"ui-state-focus\\\" );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_trigger: function( type, event, data ) {\\n\\t\\tvar prop, orig;\\n\\t\\tvar callback = this.options[ type ];\\n\\n\\t\\tdata = data || {};\\n\\t\\tevent = $.Event( event );\\n\\t\\tevent.type = ( type === this.widgetEventPrefix ?\\n\\t\\t\\ttype :\\n\\t\\t\\tthis.widgetEventPrefix + type ).toLowerCase();\\n\\n\\t\\t// The original event may come from any element\\n\\t\\t// so we need to reset the target on the new event\\n\\t\\tevent.target = this.element[ 0 ];\\n\\n\\t\\t// Copy original event properties over to the new event\\n\\t\\torig = event.originalEvent;\\n\\t\\tif ( orig ) {\\n\\t\\t\\tfor ( prop in orig ) {\\n\\t\\t\\t\\tif ( !( prop in event ) ) {\\n\\t\\t\\t\\t\\tevent[ prop ] = orig[ prop ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis.element.trigger( event, data );\\n\\t\\treturn !( $.isFunction( callback ) &&\\n\\t\\t\\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\\n\\t\\t\\tevent.isDefaultPrevented() );\\n\\t}\\n};\\n\\n$.each( { show: \\\"fadeIn\\\", hide: \\\"fadeOut\\\" }, function( method, defaultEffect ) {\\n\\t$.Widget.prototype[ \\\"_\\\" + method ] = function( element, options, callback ) {\\n\\t\\tif ( typeof options === \\\"string\\\" ) {\\n\\t\\t\\toptions = { effect: options };\\n\\t\\t}\\n\\n\\t\\tvar hasOptions;\\n\\t\\tvar effectName = !options ?\\n\\t\\t\\tmethod :\\n\\t\\t\\toptions === true || typeof options === \\\"number\\\" ?\\n\\t\\t\\t\\tdefaultEffect :\\n\\t\\t\\t\\toptions.effect || defaultEffect;\\n\\n\\t\\toptions = options || {};\\n\\t\\tif ( typeof options === \\\"number\\\" ) {\\n\\t\\t\\toptions = { duration: options };\\n\\t\\t}\\n\\n\\t\\thasOptions = !$.isEmptyObject( options );\\n\\t\\toptions.complete = callback;\\n\\n\\t\\tif ( options.delay ) {\\n\\t\\t\\telement.delay( options.delay );\\n\\t\\t}\\n\\n\\t\\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\\n\\t\\t\\telement[ method ]( options );\\n\\t\\t} else if ( effectName !== method && element[ effectName ] ) {\\n\\t\\t\\telement[ effectName ]( options.duration, options.easing, callback );\\n\\t\\t} else {\\n\\t\\t\\telement.queue( function( next ) {\\n\\t\\t\\t\\t$( this )[ method ]();\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback.call( element[ 0 ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnext();\\n\\t\\t\\t} );\\n\\t\\t}\\n\\t};\\n} );\\n\\nreturn $.widget;\\n\\n} ) );\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2pxdWVyeS11aS91aS93aWRnZXQuanM/NDliZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMi4xXG4gKiBodHRwOi8vanF1ZXJ5dWkuY29tXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqL1xuXG4vLz4+bGFiZWw6IFdpZGdldFxuLy8+Pmdyb3VwOiBDb3JlXG4vLz4+ZGVzY3JpcHRpb246IFByb3ZpZGVzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgc3RhdGVmdWwgd2lkZ2V0cyB3aXRoIGEgY29tbW9uIEFQSS5cbi8vPj5kb2NzOiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9qUXVlcnkud2lkZ2V0L1xuLy8+PmRlbW9zOiBodHRwOi8vanF1ZXJ5dWkuY29tL3dpZGdldC9cblxuKCBmdW5jdGlvbiggZmFjdG9yeSApIHtcblx0aWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblxuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoIFsgXCJqcXVlcnlcIiwgXCIuL3ZlcnNpb25cIiBdLCBmYWN0b3J5ICk7XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBCcm93c2VyIGdsb2JhbHNcblx0XHRmYWN0b3J5KCBqUXVlcnkgKTtcblx0fVxufSggZnVuY3Rpb24oICQgKSB7XG5cbnZhciB3aWRnZXRVdWlkID0gMDtcbnZhciB3aWRnZXRTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuJC5jbGVhbkRhdGEgPSAoIGZ1bmN0aW9uKCBvcmlnICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBldmVudHMsIGVsZW0sIGk7XG5cdFx0Zm9yICggaSA9IDA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdC8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lXG5cdFx0XHRcdGV2ZW50cyA9ICQuX2RhdGEoIGVsZW0sIFwiZXZlbnRzXCIgKTtcblx0XHRcdFx0aWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHtcblx0XHRcdFx0XHQkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoIFwicmVtb3ZlXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIdHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0fVxuXHRcdG9yaWcoIGVsZW1zICk7XG5cdH07XG59ICkoICQuY2xlYW5EYXRhICk7XG5cbiQud2lkZ2V0ID0gZnVuY3Rpb24oIG5hbWUsIGJhc2UsIHByb3RvdHlwZSApIHtcblx0dmFyIGV4aXN0aW5nQ29uc3RydWN0b3IsIGNvbnN0cnVjdG9yLCBiYXNlUHJvdG90eXBlO1xuXG5cdC8vIFByb3hpZWRQcm90b3R5cGUgYWxsb3dzIHRoZSBwcm92aWRlZCBwcm90b3R5cGUgdG8gcmVtYWluIHVubW9kaWZpZWRcblx0Ly8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3Nilcblx0dmFyIHByb3hpZWRQcm90b3R5cGUgPSB7fTtcblxuXHR2YXIgbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggXCIuXCIgKVsgMCBdO1xuXHRuYW1lID0gbmFtZS5zcGxpdCggXCIuXCIgKVsgMSBdO1xuXHR2YXIgZnVsbE5hbWUgPSBuYW1lc3BhY2UgKyBcIi1cIiArIG5hbWU7XG5cblx0aWYgKCAhcHJvdG90eXBlICkge1xuXHRcdHByb3RvdHlwZSA9IGJhc2U7XG5cdFx0YmFzZSA9ICQuV2lkZ2V0O1xuXHR9XG5cblx0aWYgKCAkLmlzQXJyYXkoIHByb3RvdHlwZSApICkge1xuXHRcdHByb3RvdHlwZSA9ICQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIHt9IF0uY29uY2F0KCBwcm90b3R5cGUgKSApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW5cblx0JC5leHByWyBcIjpcIiBdWyBmdWxsTmFtZS50b0xvd2VyQ2FzZSgpIF0gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gISEkLmRhdGEoIGVsZW0sIGZ1bGxOYW1lICk7XG5cdH07XG5cblx0JFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTtcblx0ZXhpc3RpbmdDb25zdHJ1Y3RvciA9ICRbIG5hbWVzcGFjZSBdWyBuYW1lIF07XG5cdGNvbnN0cnVjdG9yID0gJFsgbmFtZXNwYWNlIF1bIG5hbWUgXSA9IGZ1bmN0aW9uKCBvcHRpb25zLCBlbGVtZW50ICkge1xuXG5cdFx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IFwibmV3XCIga2V5d29yZFxuXHRcdGlmICggIXRoaXMuX2NyZWF0ZVdpZGdldCApIHtcblx0XHRcdHJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGZvciBzaW1wbGUgaW5oZXJpdGFuY2Vcblx0XHQvLyBtdXN0IHVzZSBcIm5ld1wiIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncylcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHR0aGlzLl9jcmVhdGVXaWRnZXQoIG9wdGlvbnMsIGVsZW1lbnQgKTtcblx0XHR9XG5cdH07XG5cblx0Ly8gRXh0ZW5kIHdpdGggdGhlIGV4aXN0aW5nIGNvbnN0cnVjdG9yIHRvIGNhcnJ5IG92ZXIgYW55IHN0YXRpYyBwcm9wZXJ0aWVzXG5cdCQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3Rvciwge1xuXHRcdHZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLFxuXG5cdFx0Ly8gQ29weSB0aGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBwcm90b3R5cGUgaW4gY2FzZSB3ZSBuZWVkIHRvXG5cdFx0Ly8gcmVkZWZpbmUgdGhlIHdpZGdldCBsYXRlclxuXHRcdF9wcm90bzogJC5leHRlbmQoIHt9LCBwcm90b3R5cGUgKSxcblxuXHRcdC8vIFRyYWNrIHdpZGdldHMgdGhhdCBpbmhlcml0IGZyb20gdGhpcyB3aWRnZXQgaW4gY2FzZSB0aGlzIHdpZGdldCBpc1xuXHRcdC8vIHJlZGVmaW5lZCBhZnRlciBhIHdpZGdldCBpbmhlcml0cyBmcm9tIGl0XG5cdFx0X2NoaWxkQ29uc3RydWN0b3JzOiBbXVxuXHR9ICk7XG5cblx0YmFzZVByb3RvdHlwZSA9IG5ldyBiYXNlKCk7XG5cblx0Ly8gV2UgbmVlZCB0byBtYWtlIHRoZSBvcHRpb25zIGhhc2ggYSBwcm9wZXJ0eSBkaXJlY3RseSBvbiB0aGUgbmV3IGluc3RhbmNlXG5cdC8vIG90aGVyd2lzZSB3ZSdsbCBtb2RpZnkgdGhlIG9wdGlvbnMgaGFzaCBvbiB0aGUgcHJvdG90eXBlIHRoYXQgd2UncmVcblx0Ly8gaW5oZXJpdGluZyBmcm9tXG5cdGJhc2VQcm90b3R5cGUub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sIGJhc2VQcm90b3R5cGUub3B0aW9ucyApO1xuXHQkLmVhY2goIHByb3RvdHlwZSwgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdGlmICggISQuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHByb3hpZWRQcm90b3R5cGVbIHByb3AgXSA9IHZhbHVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZnVuY3Rpb24gX3N1cGVyKCkge1xuXHRcdFx0XHRyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIF9zdXBlckFwcGx5KCBhcmdzICkge1xuXHRcdFx0XHRyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBfX3N1cGVyID0gdGhpcy5fc3VwZXI7XG5cdFx0XHRcdHZhciBfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5O1xuXHRcdFx0XHR2YXIgcmV0dXJuVmFsdWU7XG5cblx0XHRcdFx0dGhpcy5fc3VwZXIgPSBfc3VwZXI7XG5cdFx0XHRcdHRoaXMuX3N1cGVyQXBwbHkgPSBfc3VwZXJBcHBseTtcblxuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHZhbHVlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHRcdFx0XHR0aGlzLl9zdXBlciA9IF9fc3VwZXI7XG5cdFx0XHRcdHRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7XG5cblx0XHRcdFx0cmV0dXJuIHJldHVyblZhbHVlO1xuXHRcdFx0fTtcblx0XHR9ICkoKTtcblx0fSApO1xuXHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSAkLndpZGdldC5leHRlbmQoIGJhc2VQcm90b3R5cGUsIHtcblxuXHRcdC8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeFxuXHRcdC8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydFxuXHRcdC8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWRcblx0XHR3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/ICggYmFzZVByb3RvdHlwZS53aWRnZXRFdmVudFByZWZpeCB8fCBuYW1lICkgOiBuYW1lXG5cdH0sIHByb3hpZWRQcm90b3R5cGUsIHtcblx0XHRjb25zdHJ1Y3RvcjogY29uc3RydWN0b3IsXG5cdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2UsXG5cdFx0d2lkZ2V0TmFtZTogbmFtZSxcblx0XHR3aWRnZXRGdWxsTmFtZTogZnVsbE5hbWVcblx0fSApO1xuXG5cdC8vIElmIHRoaXMgd2lkZ2V0IGlzIGJlaW5nIHJlZGVmaW5lZCB0aGVuIHdlIG5lZWQgdG8gZmluZCBhbGwgd2lkZ2V0cyB0aGF0XG5cdC8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb21cblx0Ly8gdGhlIG5ldyB2ZXJzaW9uIG9mIHRoaXMgd2lkZ2V0LiBXZSdyZSBlc3NlbnRpYWxseSB0cnlpbmcgdG8gcmVwbGFjZSBvbmVcblx0Ly8gbGV2ZWwgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi5cblx0aWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkge1xuXHRcdCQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHtcblx0XHRcdHZhciBjaGlsZFByb3RvdHlwZSA9IGNoaWxkLnByb3RvdHlwZTtcblxuXHRcdFx0Ly8gUmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXNcblx0XHRcdC8vIG9yaWdpbmFsbHkgdXNlZCwgYnV0IGluaGVyaXQgZnJvbSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGJhc2Vcblx0XHRcdCQud2lkZ2V0KCBjaGlsZFByb3RvdHlwZS5uYW1lc3BhY2UgKyBcIi5cIiArIGNoaWxkUHJvdG90eXBlLndpZGdldE5hbWUsIGNvbnN0cnVjdG9yLFxuXHRcdFx0XHRjaGlsZC5fcHJvdG8gKTtcblx0XHR9ICk7XG5cblx0XHQvLyBSZW1vdmUgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgY2hpbGQgY29uc3RydWN0b3JzIGZyb20gdGhlIG9sZCBjb25zdHJ1Y3RvclxuXHRcdC8vIHNvIHRoZSBvbGQgY2hpbGQgY29uc3RydWN0b3JzIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZFxuXHRcdGRlbGV0ZSBleGlzdGluZ0NvbnN0cnVjdG9yLl9jaGlsZENvbnN0cnVjdG9ycztcblx0fSBlbHNlIHtcblx0XHRiYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApO1xuXHR9XG5cblx0JC53aWRnZXQuYnJpZGdlKCBuYW1lLCBjb25zdHJ1Y3RvciApO1xuXG5cdHJldHVybiBjb25zdHJ1Y3Rvcjtcbn07XG5cbiQud2lkZ2V0LmV4dGVuZCA9IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdHZhciBpbnB1dCA9IHdpZGdldFNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApO1xuXHR2YXIgaW5wdXRJbmRleCA9IDA7XG5cdHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblx0dmFyIGtleTtcblx0dmFyIHZhbHVlO1xuXG5cdGZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7XG5cdFx0Zm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7XG5cdFx0XHR2YWx1ZSA9IGlucHV0WyBpbnB1dEluZGV4IF1bIGtleSBdO1xuXHRcdFx0aWYgKCBpbnB1dFsgaW5wdXRJbmRleCBdLmhhc093blByb3BlcnR5KCBrZXkgKSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIENsb25lIG9iamVjdHNcblx0XHRcdFx0aWYgKCAkLmlzUGxhaW5PYmplY3QoIHZhbHVlICkgKSB7XG5cdFx0XHRcdFx0dGFyZ2V0WyBrZXkgXSA9ICQuaXNQbGFpbk9iamVjdCggdGFyZ2V0WyBrZXkgXSApID9cblx0XHRcdFx0XHRcdCQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0c1xuXHRcdFx0XHRcdFx0JC53aWRnZXQuZXh0ZW5kKCB7fSwgdmFsdWUgKTtcblxuXHRcdFx0XHQvLyBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBieSByZWZlcmVuY2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0YXJnZXRbIGtleSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHRhcmdldDtcbn07XG5cbiQud2lkZ2V0LmJyaWRnZSA9IGZ1bmN0aW9uKCBuYW1lLCBvYmplY3QgKSB7XG5cdHZhciBmdWxsTmFtZSA9IG9iamVjdC5wcm90b3R5cGUud2lkZ2V0RnVsbE5hbWUgfHwgbmFtZTtcblx0JC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiO1xuXHRcdHZhciBhcmdzID0gd2lkZ2V0U2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICk7XG5cdFx0dmFyIHJldHVyblZhbHVlID0gdGhpcztcblxuXHRcdGlmICggaXNNZXRob2RDYWxsICkge1xuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGFuIGVtcHR5IGNvbGxlY3Rpb24sIHdlIG5lZWQgdG8gaGF2ZSB0aGUgaW5zdGFuY2UgbWV0aG9kXG5cdFx0XHQvLyByZXR1cm4gdW5kZWZpbmVkIGluc3RlYWQgb2YgdGhlIGpRdWVyeSBpbnN0YW5jZVxuXHRcdFx0aWYgKCAhdGhpcy5sZW5ndGggJiYgb3B0aW9ucyA9PT0gXCJpbnN0YW5jZVwiICkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dmFyIG1ldGhvZFZhbHVlO1xuXHRcdFx0XHRcdHZhciBpbnN0YW5jZSA9ICQuZGF0YSggdGhpcywgZnVsbE5hbWUgKTtcblxuXHRcdFx0XHRcdGlmICggb3B0aW9ucyA9PT0gXCJpbnN0YW5jZVwiICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBpbnN0YW5jZTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoICFpbnN0YW5jZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiAkLmVycm9yKCBcImNhbm5vdCBjYWxsIG1ldGhvZHMgb24gXCIgKyBuYW1lICtcblx0XHRcdFx0XHRcdFx0XCIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247IFwiICtcblx0XHRcdFx0XHRcdFx0XCJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJ1wiICsgb3B0aW9ucyArIFwiJ1wiICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhJC5pc0Z1bmN0aW9uKCBpbnN0YW5jZVsgb3B0aW9ucyBdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gXCJfXCIgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJC5lcnJvciggXCJubyBzdWNoIG1ldGhvZCAnXCIgKyBvcHRpb25zICsgXCInIGZvciBcIiArIG5hbWUgK1xuXHRcdFx0XHRcdFx0XHRcIiB3aWRnZXQgaW5zdGFuY2VcIiApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1ldGhvZFZhbHVlID0gaW5zdGFuY2VbIG9wdGlvbnMgXS5hcHBseSggaW5zdGFuY2UsIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggbWV0aG9kVmFsdWUgIT09IGluc3RhbmNlICYmIG1ldGhvZFZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IG1ldGhvZFZhbHVlICYmIG1ldGhvZFZhbHVlLmpxdWVyeSA/XG5cdFx0XHRcdFx0XHRcdHJldHVyblZhbHVlLnB1c2hTdGFjayggbWV0aG9kVmFsdWUuZ2V0KCkgKSA6XG5cdFx0XHRcdFx0XHRcdG1ldGhvZFZhbHVlO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEFsbG93IG11bHRpcGxlIGhhc2hlcyB0byBiZSBwYXNzZWQgb24gaW5pdFxuXHRcdFx0aWYgKCBhcmdzLmxlbmd0aCApIHtcblx0XHRcdFx0b3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZC5hcHBseSggbnVsbCwgWyBvcHRpb25zIF0uY29uY2F0KCBhcmdzICkgKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApO1xuXHRcdFx0XHRpZiAoIGluc3RhbmNlICkge1xuXHRcdFx0XHRcdGluc3RhbmNlLm9wdGlvbiggb3B0aW9ucyB8fCB7fSApO1xuXHRcdFx0XHRcdGlmICggaW5zdGFuY2UuX2luaXQgKSB7XG5cdFx0XHRcdFx0XHRpbnN0YW5jZS5faW5pdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lLCBuZXcgb2JqZWN0KCBvcHRpb25zLCB0aGlzICkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0fTtcbn07XG5cbiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTtcbiQuV2lkZ2V0Ll9jaGlsZENvbnN0cnVjdG9ycyA9IFtdO1xuXG4kLldpZGdldC5wcm90b3R5cGUgPSB7XG5cdHdpZGdldE5hbWU6IFwid2lkZ2V0XCIsXG5cdHdpZGdldEV2ZW50UHJlZml4OiBcIlwiLFxuXHRkZWZhdWx0RWxlbWVudDogXCI8ZGl2PlwiLFxuXG5cdG9wdGlvbnM6IHtcblx0XHRjbGFzc2VzOiB7fSxcblx0XHRkaXNhYmxlZDogZmFsc2UsXG5cblx0XHQvLyBDYWxsYmFja3Ncblx0XHRjcmVhdGU6IG51bGxcblx0fSxcblxuXHRfY3JlYXRlV2lkZ2V0OiBmdW5jdGlvbiggb3B0aW9ucywgZWxlbWVudCApIHtcblx0XHRlbGVtZW50ID0gJCggZWxlbWVudCB8fCB0aGlzLmRlZmF1bHRFbGVtZW50IHx8IHRoaXMgKVsgMCBdO1xuXHRcdHRoaXMuZWxlbWVudCA9ICQoIGVsZW1lbnQgKTtcblx0XHR0aGlzLnV1aWQgPSB3aWRnZXRVdWlkKys7XG5cdFx0dGhpcy5ldmVudE5hbWVzcGFjZSA9IFwiLlwiICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkO1xuXG5cdFx0dGhpcy5iaW5kaW5ncyA9ICQoKTtcblx0XHR0aGlzLmhvdmVyYWJsZSA9ICQoKTtcblx0XHR0aGlzLmZvY3VzYWJsZSA9ICQoKTtcblx0XHR0aGlzLmNsYXNzZXNFbGVtZW50TG9va3VwID0ge307XG5cblx0XHRpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7XG5cdFx0XHQkLmRhdGEoIGVsZW1lbnQsIHRoaXMud2lkZ2V0RnVsbE5hbWUsIHRoaXMgKTtcblx0XHRcdHRoaXMuX29uKCB0cnVlLCB0aGlzLmVsZW1lbnQsIHtcblx0XHRcdFx0cmVtb3ZlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdFx0aWYgKCBldmVudC50YXJnZXQgPT09IGVsZW1lbnQgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHRcdHRoaXMuZG9jdW1lbnQgPSAkKCBlbGVtZW50LnN0eWxlID9cblxuXHRcdFx0XHQvLyBFbGVtZW50IHdpdGhpbiB0aGUgZG9jdW1lbnRcblx0XHRcdFx0ZWxlbWVudC5vd25lckRvY3VtZW50IDpcblxuXHRcdFx0XHQvLyBFbGVtZW50IGlzIHdpbmRvdyBvciBkb2N1bWVudFxuXHRcdFx0XHRlbGVtZW50LmRvY3VtZW50IHx8IGVsZW1lbnQgKTtcblx0XHRcdHRoaXMud2luZG93ID0gJCggdGhpcy5kb2N1bWVudFsgMCBdLmRlZmF1bHRWaWV3IHx8IHRoaXMuZG9jdW1lbnRbIDAgXS5wYXJlbnRXaW5kb3cgKTtcblx0XHR9XG5cblx0XHR0aGlzLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LFxuXHRcdFx0dGhpcy5vcHRpb25zLFxuXHRcdFx0dGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLFxuXHRcdFx0b3B0aW9ucyApO1xuXG5cdFx0dGhpcy5fY3JlYXRlKCk7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApIHtcblx0XHRcdHRoaXMuX3NldE9wdGlvbkRpc2FibGVkKCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKTtcblx0XHR9XG5cblx0XHR0aGlzLl90cmlnZ2VyKCBcImNyZWF0ZVwiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApO1xuXHRcdHRoaXMuX2luaXQoKTtcblx0fSxcblxuXHRfZ2V0Q3JlYXRlT3B0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9LFxuXG5cdF9nZXRDcmVhdGVFdmVudERhdGE6ICQubm9vcCxcblxuXHRfY3JlYXRlOiAkLm5vb3AsXG5cblx0X2luaXQ6ICQubm9vcCxcblxuXHRkZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdGhhdCA9IHRoaXM7XG5cblx0XHR0aGlzLl9kZXN0cm95KCk7XG5cdFx0JC5lYWNoKCB0aGlzLmNsYXNzZXNFbGVtZW50TG9va3VwLCBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRcdHRoYXQuX3JlbW92ZUNsYXNzKCB2YWx1ZSwga2V5ICk7XG5cdFx0fSApO1xuXG5cdFx0Ly8gV2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMFxuXHRcdC8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpXG5cdFx0dGhpcy5lbGVtZW50XG5cdFx0XHQub2ZmKCB0aGlzLmV2ZW50TmFtZXNwYWNlIClcblx0XHRcdC5yZW1vdmVEYXRhKCB0aGlzLndpZGdldEZ1bGxOYW1lICk7XG5cdFx0dGhpcy53aWRnZXQoKVxuXHRcdFx0Lm9mZiggdGhpcy5ldmVudE5hbWVzcGFjZSApXG5cdFx0XHQucmVtb3ZlQXR0ciggXCJhcmlhLWRpc2FibGVkXCIgKTtcblxuXHRcdC8vIENsZWFuIHVwIGV2ZW50cyBhbmQgc3RhdGVzXG5cdFx0dGhpcy5iaW5kaW5ncy5vZmYoIHRoaXMuZXZlbnROYW1lc3BhY2UgKTtcblx0fSxcblxuXHRfZGVzdHJveTogJC5ub29wLFxuXG5cdHdpZGdldDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWxlbWVudDtcblx0fSxcblxuXHRvcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBvcHRpb25zID0ga2V5O1xuXHRcdHZhciBwYXJ0cztcblx0XHR2YXIgY3VyT3B0aW9uO1xuXHRcdHZhciBpO1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHQvLyBEb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2hcblx0XHRcdHJldHVybiAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnMgKTtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vIEhhbmRsZSBuZXN0ZWQga2V5cywgZS5nLiwgXCJmb28uYmFyXCIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9XG5cdFx0XHRvcHRpb25zID0ge307XG5cdFx0XHRwYXJ0cyA9IGtleS5zcGxpdCggXCIuXCIgKTtcblx0XHRcdGtleSA9IHBhcnRzLnNoaWZ0KCk7XG5cdFx0XHRpZiAoIHBhcnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y3VyT3B0aW9uID0gb3B0aW9uc1sga2V5IF0gPSAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnNbIGtleSBdICk7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrICkge1xuXHRcdFx0XHRcdGN1ck9wdGlvblsgcGFydHNbIGkgXSBdID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gfHwge307XG5cdFx0XHRcdFx0Y3VyT3B0aW9uID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF07XG5cdFx0XHRcdH1cblx0XHRcdFx0a2V5ID0gcGFydHMucG9wKCk7XG5cdFx0XHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdFx0XHRyZXR1cm4gY3VyT3B0aW9uWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN1ck9wdGlvblsga2V5IF07XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3VyT3B0aW9uWyBrZXkgXSA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLm9wdGlvbnNbIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5vcHRpb25zWyBrZXkgXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvcHRpb25zWyBrZXkgXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuX3NldE9wdGlvbnMoIG9wdGlvbnMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdF9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR2YXIga2V5O1xuXG5cdFx0Zm9yICgga2V5IGluIG9wdGlvbnMgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb24oIGtleSwgb3B0aW9uc1sga2V5IF0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRpZiAoIGtleSA9PT0gXCJjbGFzc2VzXCIgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb25DbGFzc2VzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdHRoaXMub3B0aW9uc1sga2V5IF0gPSB2YWx1ZTtcblxuXHRcdGlmICgga2V5ID09PSBcImRpc2FibGVkXCIgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb25EaXNhYmxlZCggdmFsdWUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRfc2V0T3B0aW9uQ2xhc3NlczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc0tleSwgZWxlbWVudHMsIGN1cnJlbnRFbGVtZW50cztcblxuXHRcdGZvciAoIGNsYXNzS2V5IGluIHZhbHVlICkge1xuXHRcdFx0Y3VycmVudEVsZW1lbnRzID0gdGhpcy5jbGFzc2VzRWxlbWVudExvb2t1cFsgY2xhc3NLZXkgXTtcblx0XHRcdGlmICggdmFsdWVbIGNsYXNzS2V5IF0gPT09IHRoaXMub3B0aW9ucy5jbGFzc2VzWyBjbGFzc0tleSBdIHx8XG5cdFx0XHRcdFx0IWN1cnJlbnRFbGVtZW50cyB8fFxuXHRcdFx0XHRcdCFjdXJyZW50RWxlbWVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2UgYXJlIGRvaW5nIHRoaXMgdG8gY3JlYXRlIGEgbmV3IGpRdWVyeSBvYmplY3QgYmVjYXVzZSB0aGUgX3JlbW92ZUNsYXNzKCkgY2FsbFxuXHRcdFx0Ly8gb24gdGhlIG5leHQgbGluZSBpcyBnb2luZyB0byBkZXN0cm95IHRoZSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZWxlbWVudHMgYmVpbmdcblx0XHRcdC8vIHRyYWNrZWQuIFdlIG5lZWQgdG8gc2F2ZSBhIGNvcHkgb2YgdGhpcyBjb2xsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGFkZCB0aGUgbmV3IGNsYXNzZXNcblx0XHRcdC8vIGJlbG93LlxuXHRcdFx0ZWxlbWVudHMgPSAkKCBjdXJyZW50RWxlbWVudHMuZ2V0KCkgKTtcblx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKCBjdXJyZW50RWxlbWVudHMsIGNsYXNzS2V5ICk7XG5cblx0XHRcdC8vIFdlIGRvbid0IHVzZSBfYWRkQ2xhc3MoKSBoZXJlLCBiZWNhdXNlIHRoYXQgdXNlcyB0aGlzLm9wdGlvbnMuY2xhc3Nlc1xuXHRcdFx0Ly8gZm9yIGdlbmVyYXRpbmcgdGhlIHN0cmluZyBvZiBjbGFzc2VzLiBXZSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgcGFzc2VkIGluIGZyb21cblx0XHRcdC8vIF9zZXRPcHRpb24oKSwgdGhpcyBpcyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBjbGFzc2VzIG9wdGlvbiB3aGljaCB3YXMgcGFzc2VkIHRvXG5cdFx0XHQvLyBfc2V0T3B0aW9uKCkuIFdlIHBhc3MgdGhpcyB2YWx1ZSBkaXJlY3RseSB0byBfY2xhc3NlcygpLlxuXHRcdFx0ZWxlbWVudHMuYWRkQ2xhc3MoIHRoaXMuX2NsYXNzZXMoIHtcblx0XHRcdFx0ZWxlbWVudDogZWxlbWVudHMsXG5cdFx0XHRcdGtleXM6IGNsYXNzS2V5LFxuXHRcdFx0XHRjbGFzc2VzOiB2YWx1ZSxcblx0XHRcdFx0YWRkOiB0cnVlXG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cdH0sXG5cblx0X3NldE9wdGlvbkRpc2FibGVkOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dGhpcy5fdG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0KCksIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyBcIi1kaXNhYmxlZFwiLCBudWxsLCAhIXZhbHVlICk7XG5cblx0XHQvLyBJZiB0aGUgd2lkZ2V0IGlzIGJlY29taW5nIGRpc2FibGVkLCB0aGVuIG5vdGhpbmcgaXMgaW50ZXJhY3RpdmVcblx0XHRpZiAoIHZhbHVlICkge1xuXHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoIHRoaXMuaG92ZXJhYmxlLCBudWxsLCBcInVpLXN0YXRlLWhvdmVyXCIgKTtcblx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKCB0aGlzLmZvY3VzYWJsZSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdGVuYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoIHsgZGlzYWJsZWQ6IGZhbHNlIH0gKTtcblx0fSxcblxuXHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyggeyBkaXNhYmxlZDogdHJ1ZSB9ICk7XG5cdH0sXG5cblx0X2NsYXNzZXM6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdHZhciBmdWxsID0gW107XG5cdFx0dmFyIHRoYXQgPSB0aGlzO1xuXG5cdFx0b3B0aW9ucyA9ICQuZXh0ZW5kKCB7XG5cdFx0XHRlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG5cdFx0XHRjbGFzc2VzOiB0aGlzLm9wdGlvbnMuY2xhc3NlcyB8fCB7fVxuXHRcdH0sIG9wdGlvbnMgKTtcblxuXHRcdGZ1bmN0aW9uIHByb2Nlc3NDbGFzc1N0cmluZyggY2xhc3NlcywgY2hlY2tPcHRpb24gKSB7XG5cdFx0XHR2YXIgY3VycmVudCwgaTtcblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0Y3VycmVudCA9IHRoYXQuY2xhc3Nlc0VsZW1lbnRMb29rdXBbIGNsYXNzZXNbIGkgXSBdIHx8ICQoKTtcblx0XHRcdFx0aWYgKCBvcHRpb25zLmFkZCApIHtcblx0XHRcdFx0XHRjdXJyZW50ID0gJCggJC51bmlxdWUoIGN1cnJlbnQuZ2V0KCkuY29uY2F0KCBvcHRpb25zLmVsZW1lbnQuZ2V0KCkgKSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3VycmVudCA9ICQoIGN1cnJlbnQubm90KCBvcHRpb25zLmVsZW1lbnQgKS5nZXQoKSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoYXQuY2xhc3Nlc0VsZW1lbnRMb29rdXBbIGNsYXNzZXNbIGkgXSBdID0gY3VycmVudDtcblx0XHRcdFx0ZnVsbC5wdXNoKCBjbGFzc2VzWyBpIF0gKTtcblx0XHRcdFx0aWYgKCBjaGVja09wdGlvbiAmJiBvcHRpb25zLmNsYXNzZXNbIGNsYXNzZXNbIGkgXSBdICkge1xuXHRcdFx0XHRcdGZ1bGwucHVzaCggb3B0aW9ucy5jbGFzc2VzWyBjbGFzc2VzWyBpIF0gXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5fb24oIG9wdGlvbnMuZWxlbWVudCwge1xuXHRcdFx0XCJyZW1vdmVcIjogXCJfdW50cmFja0NsYXNzZXNFbGVtZW50XCJcblx0XHR9ICk7XG5cblx0XHRpZiAoIG9wdGlvbnMua2V5cyApIHtcblx0XHRcdHByb2Nlc3NDbGFzc1N0cmluZyggb3B0aW9ucy5rZXlzLm1hdGNoKCAvXFxTKy9nICkgfHwgW10sIHRydWUgKTtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmV4dHJhICkge1xuXHRcdFx0cHJvY2Vzc0NsYXNzU3RyaW5nKCBvcHRpb25zLmV4dHJhLm1hdGNoKCAvXFxTKy9nICkgfHwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZnVsbC5qb2luKCBcIiBcIiApO1xuXHR9LFxuXG5cdF91bnRyYWNrQ2xhc3Nlc0VsZW1lbnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgdGhhdCA9IHRoaXM7XG5cdFx0JC5lYWNoKCB0aGF0LmNsYXNzZXNFbGVtZW50TG9va3VwLCBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRcdGlmICggJC5pbkFycmF5KCBldmVudC50YXJnZXQsIHZhbHVlICkgIT09IC0xICkge1xuXHRcdFx0XHR0aGF0LmNsYXNzZXNFbGVtZW50TG9va3VwWyBrZXkgXSA9ICQoIHZhbHVlLm5vdCggZXZlbnQudGFyZ2V0ICkuZ2V0KCkgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0X3JlbW92ZUNsYXNzOiBmdW5jdGlvbiggZWxlbWVudCwga2V5cywgZXh0cmEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3RvZ2dsZUNsYXNzKCBlbGVtZW50LCBrZXlzLCBleHRyYSwgZmFsc2UgKTtcblx0fSxcblxuXHRfYWRkQ2xhc3M6IGZ1bmN0aW9uKCBlbGVtZW50LCBrZXlzLCBleHRyYSApIHtcblx0XHRyZXR1cm4gdGhpcy5fdG9nZ2xlQ2xhc3MoIGVsZW1lbnQsIGtleXMsIGV4dHJhLCB0cnVlICk7XG5cdH0sXG5cblx0X3RvZ2dsZUNsYXNzOiBmdW5jdGlvbiggZWxlbWVudCwga2V5cywgZXh0cmEsIGFkZCApIHtcblx0XHRhZGQgPSAoIHR5cGVvZiBhZGQgPT09IFwiYm9vbGVhblwiICkgPyBhZGQgOiBleHRyYTtcblx0XHR2YXIgc2hpZnQgPSAoIHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiIHx8IGVsZW1lbnQgPT09IG51bGwgKSxcblx0XHRcdG9wdGlvbnMgPSB7XG5cdFx0XHRcdGV4dHJhOiBzaGlmdCA/IGtleXMgOiBleHRyYSxcblx0XHRcdFx0a2V5czogc2hpZnQgPyBlbGVtZW50IDoga2V5cyxcblx0XHRcdFx0ZWxlbWVudDogc2hpZnQgPyB0aGlzLmVsZW1lbnQgOiBlbGVtZW50LFxuXHRcdFx0XHRhZGQ6IGFkZFxuXHRcdFx0fTtcblx0XHRvcHRpb25zLmVsZW1lbnQudG9nZ2xlQ2xhc3MoIHRoaXMuX2NsYXNzZXMoIG9wdGlvbnMgKSwgYWRkICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0X29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgZGVsZWdhdGVFbGVtZW50O1xuXHRcdHZhciBpbnN0YW5jZSA9IHRoaXM7XG5cblx0XHQvLyBObyBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgZmxhZywgc2h1ZmZsZSBhcmd1bWVudHNcblx0XHRpZiAoIHR5cGVvZiBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgIT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0aGFuZGxlcnMgPSBlbGVtZW50O1xuXHRcdFx0ZWxlbWVudCA9IHN1cHByZXNzRGlzYWJsZWRDaGVjaztcblx0XHRcdHN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIE5vIGVsZW1lbnQgYXJndW1lbnQsIHNodWZmbGUgYW5kIHVzZSB0aGlzLmVsZW1lbnRcblx0XHRpZiAoICFoYW5kbGVycyApIHtcblx0XHRcdGhhbmRsZXJzID0gZWxlbWVudDtcblx0XHRcdGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7XG5cdFx0XHRkZWxlZ2F0ZUVsZW1lbnQgPSB0aGlzLndpZGdldCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtZW50ID0gZGVsZWdhdGVFbGVtZW50ID0gJCggZWxlbWVudCApO1xuXHRcdFx0dGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7XG5cdFx0fVxuXG5cdFx0JC5lYWNoKCBoYW5kbGVycywgZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVyICkge1xuXHRcdFx0ZnVuY3Rpb24gaGFuZGxlclByb3h5KCkge1xuXG5cdFx0XHRcdC8vIEFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZ1xuXHRcdFx0XHQvLyAtIGRpc2FibGVkIGFzIGFuIGFycmF5IGluc3RlYWQgb2YgYm9vbGVhblxuXHRcdFx0XHQvLyAtIGRpc2FibGVkIGNsYXNzIGFzIG1ldGhvZCBmb3IgZGlzYWJsaW5nIGluZGl2aWR1YWwgcGFydHNcblx0XHRcdFx0aWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmXG5cdFx0XHRcdFx0XHQoIGluc3RhbmNlLm9wdGlvbnMuZGlzYWJsZWQgPT09IHRydWUgfHxcblx0XHRcdFx0XHRcdCQoIHRoaXMgKS5oYXNDbGFzcyggXCJ1aS1zdGF0ZS1kaXNhYmxlZFwiICkgKSApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFwic3RyaW5nXCIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApXG5cdFx0XHRcdFx0LmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3Jrc1xuXHRcdFx0aWYgKCB0eXBlb2YgaGFuZGxlciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0aGFuZGxlclByb3h5Lmd1aWQgPSBoYW5kbGVyLmd1aWQgPVxuXHRcdFx0XHRcdGhhbmRsZXIuZ3VpZCB8fCBoYW5kbGVyUHJveHkuZ3VpZCB8fCAkLmd1aWQrKztcblx0XHRcdH1cblxuXHRcdFx0dmFyIG1hdGNoID0gZXZlbnQubWF0Y2goIC9eKFtcXHc6LV0qKVxccyooLiopJC8gKTtcblx0XHRcdHZhciBldmVudE5hbWUgPSBtYXRjaFsgMSBdICsgaW5zdGFuY2UuZXZlbnROYW1lc3BhY2U7XG5cdFx0XHR2YXIgc2VsZWN0b3IgPSBtYXRjaFsgMiBdO1xuXG5cdFx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0XHRkZWxlZ2F0ZUVsZW1lbnQub24oIGV2ZW50TmFtZSwgc2VsZWN0b3IsIGhhbmRsZXJQcm94eSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudC5vbiggZXZlbnROYW1lLCBoYW5kbGVyUHJveHkgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0X29mZjogZnVuY3Rpb24oIGVsZW1lbnQsIGV2ZW50TmFtZSApIHtcblx0XHRldmVudE5hbWUgPSAoIGV2ZW50TmFtZSB8fCBcIlwiICkuc3BsaXQoIFwiIFwiICkuam9pbiggdGhpcy5ldmVudE5hbWVzcGFjZSArIFwiIFwiICkgK1xuXHRcdFx0dGhpcy5ldmVudE5hbWVzcGFjZTtcblx0XHRlbGVtZW50Lm9mZiggZXZlbnROYW1lICkub2ZmKCBldmVudE5hbWUgKTtcblxuXHRcdC8vIENsZWFyIHRoZSBzdGFjayB0byBhdm9pZCBtZW1vcnkgbGVha3MgKCMxMDA1Nilcblx0XHR0aGlzLmJpbmRpbmdzID0gJCggdGhpcy5iaW5kaW5ncy5ub3QoIGVsZW1lbnQgKS5nZXQoKSApO1xuXHRcdHRoaXMuZm9jdXNhYmxlID0gJCggdGhpcy5mb2N1c2FibGUubm90KCBlbGVtZW50ICkuZ2V0KCkgKTtcblx0XHR0aGlzLmhvdmVyYWJsZSA9ICQoIHRoaXMuaG92ZXJhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7XG5cdH0sXG5cblx0X2RlbGF5OiBmdW5jdGlvbiggaGFuZGxlciwgZGVsYXkgKSB7XG5cdFx0ZnVuY3Rpb24gaGFuZGxlclByb3h5KCkge1xuXHRcdFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFwic3RyaW5nXCIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApXG5cdFx0XHRcdC5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0XHR2YXIgaW5zdGFuY2UgPSB0aGlzO1xuXHRcdHJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTtcblx0fSxcblxuXHRfaG92ZXJhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHtcblx0XHR0aGlzLmhvdmVyYWJsZSA9IHRoaXMuaG92ZXJhYmxlLmFkZCggZWxlbWVudCApO1xuXHRcdHRoaXMuX29uKCBlbGVtZW50LCB7XG5cdFx0XHRtb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHRoaXMuX2FkZENsYXNzKCAkKCBldmVudC5jdXJyZW50VGFyZ2V0ICksIG51bGwsIFwidWktc3RhdGUtaG92ZXJcIiApO1xuXHRcdFx0fSxcblx0XHRcdG1vdXNlbGVhdmU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1ob3ZlclwiICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdF9mb2N1c2FibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkge1xuXHRcdHRoaXMuZm9jdXNhYmxlID0gdGhpcy5mb2N1c2FibGUuYWRkKCBlbGVtZW50ICk7XG5cdFx0dGhpcy5fb24oIGVsZW1lbnQsIHtcblx0XHRcdGZvY3VzaW46IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fYWRkQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0XHR9LFxuXHRcdFx0Zm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdF90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7XG5cdFx0dmFyIHByb3AsIG9yaWc7XG5cdFx0dmFyIGNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07XG5cblx0XHRkYXRhID0gZGF0YSB8fCB7fTtcblx0XHRldmVudCA9ICQuRXZlbnQoIGV2ZW50ICk7XG5cdFx0ZXZlbnQudHlwZSA9ICggdHlwZSA9PT0gdGhpcy53aWRnZXRFdmVudFByZWZpeCA/XG5cdFx0XHR0eXBlIDpcblx0XHRcdHRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTtcblxuXHRcdC8vIFRoZSBvcmlnaW5hbCBldmVudCBtYXkgY29tZSBmcm9tIGFueSBlbGVtZW50XG5cdFx0Ly8gc28gd2UgbmVlZCB0byByZXNldCB0aGUgdGFyZ2V0IG9uIHRoZSBuZXcgZXZlbnRcblx0XHRldmVudC50YXJnZXQgPSB0aGlzLmVsZW1lbnRbIDAgXTtcblxuXHRcdC8vIENvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnRcblx0XHRvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDtcblx0XHRpZiAoIG9yaWcgKSB7XG5cdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdGlmICggISggcHJvcCBpbiBldmVudCApICkge1xuXHRcdFx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmVsZW1lbnQudHJpZ2dlciggZXZlbnQsIGRhdGEgKTtcblx0XHRyZXR1cm4gISggJC5pc0Z1bmN0aW9uKCBjYWxsYmFjayApICYmXG5cdFx0XHRjYWxsYmFjay5hcHBseSggdGhpcy5lbGVtZW50WyAwIF0sIFsgZXZlbnQgXS5jb25jYXQoIGRhdGEgKSApID09PSBmYWxzZSB8fFxuXHRcdFx0ZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKTtcblx0fVxufTtcblxuJC5lYWNoKCB7IHNob3c6IFwiZmFkZUluXCIsIGhpZGU6IFwiZmFkZU91dFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIGRlZmF1bHRFZmZlY3QgKSB7XG5cdCQuV2lkZ2V0LnByb3RvdHlwZVsgXCJfXCIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07XG5cdFx0fVxuXG5cdFx0dmFyIGhhc09wdGlvbnM7XG5cdFx0dmFyIGVmZmVjdE5hbWUgPSAhb3B0aW9ucyA/XG5cdFx0XHRtZXRob2QgOlxuXHRcdFx0b3B0aW9ucyA9PT0gdHJ1ZSB8fCB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJudW1iZXJcIiA/XG5cdFx0XHRcdGRlZmF1bHRFZmZlY3QgOlxuXHRcdFx0XHRvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0O1xuXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0aWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB7IGR1cmF0aW9uOiBvcHRpb25zIH07XG5cdFx0fVxuXG5cdFx0aGFzT3B0aW9ucyA9ICEkLmlzRW1wdHlPYmplY3QoIG9wdGlvbnMgKTtcblx0XHRvcHRpb25zLmNvbXBsZXRlID0gY2FsbGJhY2s7XG5cblx0XHRpZiAoIG9wdGlvbnMuZGVsYXkgKSB7XG5cdFx0XHRlbGVtZW50LmRlbGF5KCBvcHRpb25zLmRlbGF5ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7XG5cdFx0XHRlbGVtZW50WyBtZXRob2QgXSggb3B0aW9ucyApO1xuXHRcdH0gZWxzZSBpZiAoIGVmZmVjdE5hbWUgIT09IG1ldGhvZCAmJiBlbGVtZW50WyBlZmZlY3ROYW1lIF0gKSB7XG5cdFx0XHRlbGVtZW50WyBlZmZlY3ROYW1lIF0oIG9wdGlvbnMuZHVyYXRpb24sIG9wdGlvbnMuZWFzaW5nLCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtZW50LnF1ZXVlKCBmdW5jdGlvbiggbmV4dCApIHtcblx0XHRcdFx0JCggdGhpcyApWyBtZXRob2QgXSgpO1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrLmNhbGwoIGVsZW1lbnRbIDAgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5leHQoKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbnJldHVybiAkLndpZGdldDtcblxufSApICk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vanF1ZXJ5LXVpL3VpL3dpZGdldC5qc1xuLy8gbW9kdWxlIGlkID0gMjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 28 */\n/***/ function(module, exports) {\n\neval(\"module.exports = function(module) {\\r\\n\\tif(!module.webpackPolyfill) {\\r\\n\\t\\tmodule.deprecate = function() {};\\r\\n\\t\\tmodule.paths = [];\\r\\n\\t\\t// module.parent = undefined by default\\r\\n\\t\\tif(!module.children) module.children = [];\\r\\n\\t\\tObject.defineProperty(module, \\\"loaded\\\", {\\r\\n\\t\\t\\tenumerable: true,\\r\\n\\t\\t\\tconfigurable: false,\\r\\n\\t\\t\\tget: function() { return module.l; }\\r\\n\\t\\t});\\r\\n\\t\\tObject.defineProperty(module, \\\"id\\\", {\\r\\n\\t\\t\\tenumerable: true,\\r\\n\\t\\t\\tconfigurable: false,\\r\\n\\t\\t\\tget: function() { return module.i; }\\r\\n\\t\\t});\\r\\n\\t\\tmodule.webpackPolyfill = 1;\\r\\n\\t}\\r\\n\\treturn module;\\r\\n}\\r\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzP2MzYzIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRpZighbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xyXG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XHJcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxyXG5cdFx0aWYoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGUubDsgfVxyXG5cdFx0fSk7XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcclxuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1vZHVsZS5pOyB9XHJcblx0XHR9KTtcclxuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xyXG5cdH1cclxuXHRyZXR1cm4gbW9kdWxlO1xyXG59XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qc1xuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;/**\\n * @license\\n * Lodash \\n * Copyright JS Foundation and other contributors \\n * Released under MIT license \\n * Based on Underscore.js 1.8.3 \\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\\n */\\n;(function() {\\n\\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\\n var undefined;\\n\\n /** Used as the semantic version number. */\\n var VERSION = '4.17.4';\\n\\n /** Used as the size to enable large array optimizations. */\\n var LARGE_ARRAY_SIZE = 200;\\n\\n /** Error message constants. */\\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\\n FUNC_ERROR_TEXT = 'Expected a function';\\n\\n /** Used to stand-in for `undefined` hash values. */\\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\\n\\n /** Used as the maximum memoize cache size. */\\n var MAX_MEMOIZE_SIZE = 500;\\n\\n /** Used as the internal argument placeholder. */\\n var PLACEHOLDER = '__lodash_placeholder__';\\n\\n /** Used to compose bitmasks for cloning. */\\n var CLONE_DEEP_FLAG = 1,\\n CLONE_FLAT_FLAG = 2,\\n CLONE_SYMBOLS_FLAG = 4;\\n\\n /** Used to compose bitmasks for value comparisons. */\\n var COMPARE_PARTIAL_FLAG = 1,\\n COMPARE_UNORDERED_FLAG = 2;\\n\\n /** Used to compose bitmasks for function metadata. */\\n var WRAP_BIND_FLAG = 1,\\n WRAP_BIND_KEY_FLAG = 2,\\n WRAP_CURRY_BOUND_FLAG = 4,\\n WRAP_CURRY_FLAG = 8,\\n WRAP_CURRY_RIGHT_FLAG = 16,\\n WRAP_PARTIAL_FLAG = 32,\\n WRAP_PARTIAL_RIGHT_FLAG = 64,\\n WRAP_ARY_FLAG = 128,\\n WRAP_REARG_FLAG = 256,\\n WRAP_FLIP_FLAG = 512;\\n\\n /** Used as default options for `_.truncate`. */\\n var DEFAULT_TRUNC_LENGTH = 30,\\n DEFAULT_TRUNC_OMISSION = '...';\\n\\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\\n var HOT_COUNT = 800,\\n HOT_SPAN = 16;\\n\\n /** Used to indicate the type of lazy iteratees. */\\n var LAZY_FILTER_FLAG = 1,\\n LAZY_MAP_FLAG = 2,\\n LAZY_WHILE_FLAG = 3;\\n\\n /** Used as references for various `Number` constants. */\\n var INFINITY = 1 / 0,\\n MAX_SAFE_INTEGER = 9007199254740991,\\n MAX_INTEGER = 1.7976931348623157e+308,\\n NAN = 0 / 0;\\n\\n /** Used as references for the maximum length and index of an array. */\\n var MAX_ARRAY_LENGTH = 4294967295,\\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\\n\\n /** Used to associate wrap methods with their bit flags. */\\n var wrapFlags = [\\n ['ary', WRAP_ARY_FLAG],\\n ['bind', WRAP_BIND_FLAG],\\n ['bindKey', WRAP_BIND_KEY_FLAG],\\n ['curry', WRAP_CURRY_FLAG],\\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\\n ['flip', WRAP_FLIP_FLAG],\\n ['partial', WRAP_PARTIAL_FLAG],\\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\\n ['rearg', WRAP_REARG_FLAG]\\n ];\\n\\n /** `Object#toString` result references. */\\n var argsTag = '[object Arguments]',\\n arrayTag = '[object Array]',\\n asyncTag = '[object AsyncFunction]',\\n boolTag = '[object Boolean]',\\n dateTag = '[object Date]',\\n domExcTag = '[object DOMException]',\\n errorTag = '[object Error]',\\n funcTag = '[object Function]',\\n genTag = '[object GeneratorFunction]',\\n mapTag = '[object Map]',\\n numberTag = '[object Number]',\\n nullTag = '[object Null]',\\n objectTag = '[object Object]',\\n promiseTag = '[object Promise]',\\n proxyTag = '[object Proxy]',\\n regexpTag = '[object RegExp]',\\n setTag = '[object Set]',\\n stringTag = '[object String]',\\n symbolTag = '[object Symbol]',\\n undefinedTag = '[object Undefined]',\\n weakMapTag = '[object WeakMap]',\\n weakSetTag = '[object WeakSet]';\\n\\n var arrayBufferTag = '[object ArrayBuffer]',\\n dataViewTag = '[object DataView]',\\n float32Tag = '[object Float32Array]',\\n float64Tag = '[object Float64Array]',\\n int8Tag = '[object Int8Array]',\\n int16Tag = '[object Int16Array]',\\n int32Tag = '[object Int32Array]',\\n uint8Tag = '[object Uint8Array]',\\n uint8ClampedTag = '[object Uint8ClampedArray]',\\n uint16Tag = '[object Uint16Array]',\\n uint32Tag = '[object Uint32Array]';\\n\\n /** Used to match empty string literals in compiled template source. */\\n var reEmptyStringLeading = /\\\\b__p \\\\+= '';/g,\\n reEmptyStringMiddle = /\\\\b(__p \\\\+=) '' \\\\+/g,\\n reEmptyStringTrailing = /(__e\\\\(.*?\\\\)|\\\\b__t\\\\)) \\\\+\\\\n'';/g;\\n\\n /** Used to match HTML entities and HTML characters. */\\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\\n reUnescapedHtml = /[&<>\\\"']/g,\\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\\n\\n /** Used to match template delimiters. */\\n var reEscape = /<%-([\\\\s\\\\S]+?)%>/g,\\n reEvaluate = /<%([\\\\s\\\\S]+?)%>/g,\\n reInterpolate = /<%=([\\\\s\\\\S]+?)%>/g;\\n\\n /** Used to match property names within property paths. */\\n var reIsDeepProp = /\\\\.|\\\\[(?:[^[\\\\]]*|([\\\"'])(?:(?!\\\\1)[^\\\\\\\\]|\\\\\\\\.)*?\\\\1)\\\\]/,\\n reIsPlainProp = /^\\\\w*$/,\\n reLeadingDot = /^\\\\./,\\n rePropName = /[^.[\\\\]]+|\\\\[(?:(-?\\\\d+(?:\\\\.\\\\d+)?)|([\\\"'])((?:(?!\\\\2)[^\\\\\\\\]|\\\\\\\\.)*?)\\\\2)\\\\]|(?=(?:\\\\.|\\\\[\\\\])(?:\\\\.|\\\\[\\\\]|$))/g;\\n\\n /**\\n * Used to match `RegExp`\\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\\n */\\n var reRegExpChar = /[\\\\\\\\^$.*+?()[\\\\]{}|]/g,\\n reHasRegExpChar = RegExp(reRegExpChar.source);\\n\\n /** Used to match leading and trailing whitespace. */\\n var reTrim = /^\\\\s+|\\\\s+$/g,\\n reTrimStart = /^\\\\s+/,\\n reTrimEnd = /\\\\s+$/;\\n\\n /** Used to match wrap detail comments. */\\n var reWrapComment = /\\\\{(?:\\\\n\\\\/\\\\* \\\\[wrapped with .+\\\\] \\\\*\\\\/)?\\\\n?/,\\n reWrapDetails = /\\\\{\\\\n\\\\/\\\\* \\\\[wrapped with (.+)\\\\] \\\\*/,\\n reSplitDetails = /,? & /;\\n\\n /** Used to match words composed of alphanumeric characters. */\\n var reAsciiWord = /[^\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\x7f]+/g;\\n\\n /** Used to match backslashes in property paths. */\\n var reEscapeChar = /\\\\\\\\(\\\\\\\\)?/g;\\n\\n /**\\n * Used to match\\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\\n */\\n var reEsTemplate = /\\\\$\\\\{([^\\\\\\\\}]*(?:\\\\\\\\.[^\\\\\\\\}]*)*)\\\\}/g;\\n\\n /** Used to match `RegExp` flags from their coerced string values. */\\n var reFlags = /\\\\w*$/;\\n\\n /** Used to detect bad signed hexadecimal string values. */\\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\\n\\n /** Used to detect binary string values. */\\n var reIsBinary = /^0b[01]+$/i;\\n\\n /** Used to detect host constructors (Safari). */\\n var reIsHostCtor = /^\\\\[object .+?Constructor\\\\]$/;\\n\\n /** Used to detect octal string values. */\\n var reIsOctal = /^0o[0-7]+$/i;\\n\\n /** Used to detect unsigned integer values. */\\n var reIsUint = /^(?:0|[1-9]\\\\d*)$/;\\n\\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\\n var reLatin = /[\\\\xc0-\\\\xd6\\\\xd8-\\\\xf6\\\\xf8-\\\\xff\\\\u0100-\\\\u017f]/g;\\n\\n /** Used to ensure capturing order of template delimiters. */\\n var reNoMatch = /($^)/;\\n\\n /** Used to match unescaped characters in compiled string literals. */\\n var reUnescapedString = /['\\\\n\\\\r\\\\u2028\\\\u2029\\\\\\\\]/g;\\n\\n /** Used to compose unicode character classes. */\\n var rsAstralRange = '\\\\\\\\ud800-\\\\\\\\udfff',\\n rsComboMarksRange = '\\\\\\\\u0300-\\\\\\\\u036f',\\n reComboHalfMarksRange = '\\\\\\\\ufe20-\\\\\\\\ufe2f',\\n rsComboSymbolsRange = '\\\\\\\\u20d0-\\\\\\\\u20ff',\\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\\n rsDingbatRange = '\\\\\\\\u2700-\\\\\\\\u27bf',\\n rsLowerRange = 'a-z\\\\\\\\xdf-\\\\\\\\xf6\\\\\\\\xf8-\\\\\\\\xff',\\n rsMathOpRange = '\\\\\\\\xac\\\\\\\\xb1\\\\\\\\xd7\\\\\\\\xf7',\\n rsNonCharRange = '\\\\\\\\x00-\\\\\\\\x2f\\\\\\\\x3a-\\\\\\\\x40\\\\\\\\x5b-\\\\\\\\x60\\\\\\\\x7b-\\\\\\\\xbf',\\n rsPunctuationRange = '\\\\\\\\u2000-\\\\\\\\u206f',\\n rsSpaceRange = ' \\\\\\\\t\\\\\\\\x0b\\\\\\\\f\\\\\\\\xa0\\\\\\\\ufeff\\\\\\\\n\\\\\\\\r\\\\\\\\u2028\\\\\\\\u2029\\\\\\\\u1680\\\\\\\\u180e\\\\\\\\u2000\\\\\\\\u2001\\\\\\\\u2002\\\\\\\\u2003\\\\\\\\u2004\\\\\\\\u2005\\\\\\\\u2006\\\\\\\\u2007\\\\\\\\u2008\\\\\\\\u2009\\\\\\\\u200a\\\\\\\\u202f\\\\\\\\u205f\\\\\\\\u3000',\\n rsUpperRange = 'A-Z\\\\\\\\xc0-\\\\\\\\xd6\\\\\\\\xd8-\\\\\\\\xde',\\n rsVarRange = '\\\\\\\\ufe0e\\\\\\\\ufe0f',\\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\\n\\n /** Used to compose unicode capture groups. */\\n var rsApos = \\\"['\\\\u2019]\\\",\\n rsAstral = '[' + rsAstralRange + ']',\\n rsBreak = '[' + rsBreakRange + ']',\\n rsCombo = '[' + rsComboRange + ']',\\n rsDigits = '\\\\\\\\d+',\\n rsDingbat = '[' + rsDingbatRange + ']',\\n rsLower = '[' + rsLowerRange + ']',\\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\\n rsFitz = '\\\\\\\\ud83c[\\\\\\\\udffb-\\\\\\\\udfff]',\\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\\n rsNonAstral = '[^' + rsAstralRange + ']',\\n rsRegional = '(?:\\\\\\\\ud83c[\\\\\\\\udde6-\\\\\\\\uddff]){2}',\\n rsSurrPair = '[\\\\\\\\ud800-\\\\\\\\udbff][\\\\\\\\udc00-\\\\\\\\udfff]',\\n rsUpper = '[' + rsUpperRange + ']',\\n rsZWJ = '\\\\\\\\u200d';\\n\\n /** Used to compose unicode regexes. */\\n var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\\n reOptMod = rsModifier + '?',\\n rsOptVar = '[' + rsVarRange + ']?',\\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\\n rsOrdLower = '\\\\\\\\d*(?:(?:1st|2nd|3rd|(?![123])\\\\\\\\dth)\\\\\\\\b)',\\n rsOrdUpper = '\\\\\\\\d*(?:(?:1ST|2ND|3RD|(?![123])\\\\\\\\dTH)\\\\\\\\b)',\\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\\n\\n /** Used to match apostrophes. */\\n var reApos = RegExp(rsApos, 'g');\\n\\n /**\\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\\n */\\n var reComboMark = RegExp(rsCombo, 'g');\\n\\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\\n\\n /** Used to match complex or compound words. */\\n var reUnicodeWord = RegExp([\\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\\n rsUpper + '+' + rsOptContrUpper,\\n rsOrdUpper,\\n rsOrdLower,\\n rsDigits,\\n rsEmoji\\n ].join('|'), 'g');\\n\\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\\n\\n /** Used to detect strings that need a more robust regexp to match words. */\\n var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\\n\\n /** Used to assign default `context` object properties. */\\n var contextProps = [\\n 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\\n 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\\n '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\\n ];\\n\\n /** Used to make template sourceURLs easier to identify. */\\n var templateCounter = -1;\\n\\n /** Used to identify `toStringTag` values of typed arrays. */\\n var typedArrayTags = {};\\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\\n typedArrayTags[uint32Tag] = true;\\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\\n typedArrayTags[weakMapTag] = false;\\n\\n /** Used to identify `toStringTag` values supported by `_.clone`. */\\n var cloneableTags = {};\\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\\n cloneableTags[boolTag] = cloneableTags[dateTag] =\\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\\n cloneableTags[numberTag] = cloneableTags[objectTag] =\\n cloneableTags[regexpTag] = cloneableTags[setTag] =\\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\\n cloneableTags[errorTag] = cloneableTags[funcTag] =\\n cloneableTags[weakMapTag] = false;\\n\\n /** Used to map Latin Unicode letters to basic Latin letters. */\\n var deburredLetters = {\\n // Latin-1 Supplement block.\\n '\\\\xc0': 'A', '\\\\xc1': 'A', '\\\\xc2': 'A', '\\\\xc3': 'A', '\\\\xc4': 'A', '\\\\xc5': 'A',\\n '\\\\xe0': 'a', '\\\\xe1': 'a', '\\\\xe2': 'a', '\\\\xe3': 'a', '\\\\xe4': 'a', '\\\\xe5': 'a',\\n '\\\\xc7': 'C', '\\\\xe7': 'c',\\n '\\\\xd0': 'D', '\\\\xf0': 'd',\\n '\\\\xc8': 'E', '\\\\xc9': 'E', '\\\\xca': 'E', '\\\\xcb': 'E',\\n '\\\\xe8': 'e', '\\\\xe9': 'e', '\\\\xea': 'e', '\\\\xeb': 'e',\\n '\\\\xcc': 'I', '\\\\xcd': 'I', '\\\\xce': 'I', '\\\\xcf': 'I',\\n '\\\\xec': 'i', '\\\\xed': 'i', '\\\\xee': 'i', '\\\\xef': 'i',\\n '\\\\xd1': 'N', '\\\\xf1': 'n',\\n '\\\\xd2': 'O', '\\\\xd3': 'O', '\\\\xd4': 'O', '\\\\xd5': 'O', '\\\\xd6': 'O', '\\\\xd8': 'O',\\n '\\\\xf2': 'o', '\\\\xf3': 'o', '\\\\xf4': 'o', '\\\\xf5': 'o', '\\\\xf6': 'o', '\\\\xf8': 'o',\\n '\\\\xd9': 'U', '\\\\xda': 'U', '\\\\xdb': 'U', '\\\\xdc': 'U',\\n '\\\\xf9': 'u', '\\\\xfa': 'u', '\\\\xfb': 'u', '\\\\xfc': 'u',\\n '\\\\xdd': 'Y', '\\\\xfd': 'y', '\\\\xff': 'y',\\n '\\\\xc6': 'Ae', '\\\\xe6': 'ae',\\n '\\\\xde': 'Th', '\\\\xfe': 'th',\\n '\\\\xdf': 'ss',\\n // Latin Extended-A block.\\n '\\\\u0100': 'A', '\\\\u0102': 'A', '\\\\u0104': 'A',\\n '\\\\u0101': 'a', '\\\\u0103': 'a', '\\\\u0105': 'a',\\n '\\\\u0106': 'C', '\\\\u0108': 'C', '\\\\u010a': 'C', '\\\\u010c': 'C',\\n '\\\\u0107': 'c', '\\\\u0109': 'c', '\\\\u010b': 'c', '\\\\u010d': 'c',\\n '\\\\u010e': 'D', '\\\\u0110': 'D', '\\\\u010f': 'd', '\\\\u0111': 'd',\\n '\\\\u0112': 'E', '\\\\u0114': 'E', '\\\\u0116': 'E', '\\\\u0118': 'E', '\\\\u011a': 'E',\\n '\\\\u0113': 'e', '\\\\u0115': 'e', '\\\\u0117': 'e', '\\\\u0119': 'e', '\\\\u011b': 'e',\\n '\\\\u011c': 'G', '\\\\u011e': 'G', '\\\\u0120': 'G', '\\\\u0122': 'G',\\n '\\\\u011d': 'g', '\\\\u011f': 'g', '\\\\u0121': 'g', '\\\\u0123': 'g',\\n '\\\\u0124': 'H', '\\\\u0126': 'H', '\\\\u0125': 'h', '\\\\u0127': 'h',\\n '\\\\u0128': 'I', '\\\\u012a': 'I', '\\\\u012c': 'I', '\\\\u012e': 'I', '\\\\u0130': 'I',\\n '\\\\u0129': 'i', '\\\\u012b': 'i', '\\\\u012d': 'i', '\\\\u012f': 'i', '\\\\u0131': 'i',\\n '\\\\u0134': 'J', '\\\\u0135': 'j',\\n '\\\\u0136': 'K', '\\\\u0137': 'k', '\\\\u0138': 'k',\\n '\\\\u0139': 'L', '\\\\u013b': 'L', '\\\\u013d': 'L', '\\\\u013f': 'L', '\\\\u0141': 'L',\\n '\\\\u013a': 'l', '\\\\u013c': 'l', '\\\\u013e': 'l', '\\\\u0140': 'l', '\\\\u0142': 'l',\\n '\\\\u0143': 'N', '\\\\u0145': 'N', '\\\\u0147': 'N', '\\\\u014a': 'N',\\n '\\\\u0144': 'n', '\\\\u0146': 'n', '\\\\u0148': 'n', '\\\\u014b': 'n',\\n '\\\\u014c': 'O', '\\\\u014e': 'O', '\\\\u0150': 'O',\\n '\\\\u014d': 'o', '\\\\u014f': 'o', '\\\\u0151': 'o',\\n '\\\\u0154': 'R', '\\\\u0156': 'R', '\\\\u0158': 'R',\\n '\\\\u0155': 'r', '\\\\u0157': 'r', '\\\\u0159': 'r',\\n '\\\\u015a': 'S', '\\\\u015c': 'S', '\\\\u015e': 'S', '\\\\u0160': 'S',\\n '\\\\u015b': 's', '\\\\u015d': 's', '\\\\u015f': 's', '\\\\u0161': 's',\\n '\\\\u0162': 'T', '\\\\u0164': 'T', '\\\\u0166': 'T',\\n '\\\\u0163': 't', '\\\\u0165': 't', '\\\\u0167': 't',\\n '\\\\u0168': 'U', '\\\\u016a': 'U', '\\\\u016c': 'U', '\\\\u016e': 'U', '\\\\u0170': 'U', '\\\\u0172': 'U',\\n '\\\\u0169': 'u', '\\\\u016b': 'u', '\\\\u016d': 'u', '\\\\u016f': 'u', '\\\\u0171': 'u', '\\\\u0173': 'u',\\n '\\\\u0174': 'W', '\\\\u0175': 'w',\\n '\\\\u0176': 'Y', '\\\\u0177': 'y', '\\\\u0178': 'Y',\\n '\\\\u0179': 'Z', '\\\\u017b': 'Z', '\\\\u017d': 'Z',\\n '\\\\u017a': 'z', '\\\\u017c': 'z', '\\\\u017e': 'z',\\n '\\\\u0132': 'IJ', '\\\\u0133': 'ij',\\n '\\\\u0152': 'Oe', '\\\\u0153': 'oe',\\n '\\\\u0149': \\\"'n\\\", '\\\\u017f': 's'\\n };\\n\\n /** Used to map characters to HTML entities. */\\n var htmlEscapes = {\\n '&': '&',\\n '<': '<',\\n '>': '>',\\n '\\\"': '"',\\n \\\"'\\\": '''\\n };\\n\\n /** Used to map HTML entities to characters. */\\n var htmlUnescapes = {\\n '&': '&',\\n '<': '<',\\n '>': '>',\\n '"': '\\\"',\\n ''': \\\"'\\\"\\n };\\n\\n /** Used to escape characters for inclusion in compiled string literals. */\\n var stringEscapes = {\\n '\\\\\\\\': '\\\\\\\\',\\n \\\"'\\\": \\\"'\\\",\\n '\\\\n': 'n',\\n '\\\\r': 'r',\\n '\\\\u2028': 'u2028',\\n '\\\\u2029': 'u2029'\\n };\\n\\n /** Built-in method references without a dependency on `root`. */\\n var freeParseFloat = parseFloat,\\n freeParseInt = parseInt;\\n\\n /** Detect free variable `global` from Node.js. */\\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\\n\\n /** Detect free variable `self`. */\\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\\n\\n /** Used as a reference to the global object. */\\n var root = freeGlobal || freeSelf || Function('return this')();\\n\\n /** Detect free variable `exports`. */\\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\\n\\n /** Detect free variable `module`. */\\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\\n\\n /** Detect the popular CommonJS extension `module.exports`. */\\n var moduleExports = freeModule && freeModule.exports === freeExports;\\n\\n /** Detect free variable `process` from Node.js. */\\n var freeProcess = moduleExports && freeGlobal.process;\\n\\n /** Used to access faster Node.js helpers. */\\n var nodeUtil = (function() {\\n try {\\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\\n } catch (e) {}\\n }());\\n\\n /* Node.js helper references. */\\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\\n nodeIsDate = nodeUtil && nodeUtil.isDate,\\n nodeIsMap = nodeUtil && nodeUtil.isMap,\\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\\n nodeIsSet = nodeUtil && nodeUtil.isSet,\\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\\n\\n /*--------------------------------------------------------------------------*/\\n\\n /**\\n * Adds the key-value `pair` to `map`.\\n *\\n * @private\\n * @param {Object} map The map to modify.\\n * @param {Array} pair The key-value pair to add.\\n * @returns {Object} Returns `map`.\\n */\\n function addMapEntry(map, pair) {\\n // Don't return `map.set` because it's not chainable in IE 11.\\n map.set(pair[0], pair[1]);\\n return map;\\n }\\n\\n /**\\n * Adds `value` to `set`.\\n *\\n * @private\\n * @param {Object} set The set to modify.\\n * @param {*} value The value to add.\\n * @returns {Object} Returns `set`.\\n */\\n function addSetEntry(set, value) {\\n // Don't return `set.add` because it's not chainable in IE 11.\\n set.add(value);\\n return set;\\n }\\n\\n /**\\n * A faster alternative to `Function#apply`, this function invokes `func`\\n * with the `this` binding of `thisArg` and the arguments of `args`.\\n *\\n * @private\\n * @param {Function} func The function to invoke.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {Array} args The arguments to invoke `func` with.\\n * @returns {*} Returns the result of `func`.\\n */\\n function apply(func, thisArg, args) {\\n switch (args.length) {\\n case 0: return func.call(thisArg);\\n case 1: return func.call(thisArg, args[0]);\\n case 2: return func.call(thisArg, args[0], args[1]);\\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\\n }\\n return func.apply(thisArg, args);\\n }\\n\\n /**\\n * A specialized version of `baseAggregator` for arrays.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform keys.\\n * @param {Object} accumulator The initial aggregated object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function arrayAggregator(array, setter, iteratee, accumulator) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n var value = array[index];\\n setter(accumulator, value, iteratee(value), array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.forEach` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayEach(array, iteratee) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (iteratee(array[index], index, array) === false) {\\n break;\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.forEachRight` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayEachRight(array, iteratee) {\\n var length = array == null ? 0 : array.length;\\n\\n while (length--) {\\n if (iteratee(array[length], length, array) === false) {\\n break;\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.every` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`.\\n */\\n function arrayEvery(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (!predicate(array[index], index, array)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * A specialized version of `_.filter` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n */\\n function arrayFilter(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (predicate(value, index, array)) {\\n result[resIndex++] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.includes` for arrays without support for\\n * specifying an index to search from.\\n *\\n * @private\\n * @param {Array} [array] The array to inspect.\\n * @param {*} target The value to search for.\\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\\n */\\n function arrayIncludes(array, value) {\\n var length = array == null ? 0 : array.length;\\n return !!length && baseIndexOf(array, value, 0) > -1;\\n }\\n\\n /**\\n * This function is like `arrayIncludes` except that it accepts a comparator.\\n *\\n * @private\\n * @param {Array} [array] The array to inspect.\\n * @param {*} target The value to search for.\\n * @param {Function} comparator The comparator invoked per element.\\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\\n */\\n function arrayIncludesWith(array, value, comparator) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (comparator(value, array[index])) {\\n return true;\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * A specialized version of `_.map` for arrays without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n */\\n function arrayMap(array, iteratee) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n result = Array(length);\\n\\n while (++index < length) {\\n result[index] = iteratee(array[index], index, array);\\n }\\n return result;\\n }\\n\\n /**\\n * Appends the elements of `values` to `array`.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to append.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayPush(array, values) {\\n var index = -1,\\n length = values.length,\\n offset = array.length;\\n\\n while (++index < length) {\\n array[offset + index] = values[index];\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.reduce` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @param {boolean} [initAccum] Specify using the first element of `array` as\\n * the initial value.\\n * @returns {*} Returns the accumulated value.\\n */\\n function arrayReduce(array, iteratee, accumulator, initAccum) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n if (initAccum && length) {\\n accumulator = array[++index];\\n }\\n while (++index < length) {\\n accumulator = iteratee(accumulator, array[index], index, array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.reduceRight` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @param {boolean} [initAccum] Specify using the last element of `array` as\\n * the initial value.\\n * @returns {*} Returns the accumulated value.\\n */\\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\\n var length = array == null ? 0 : array.length;\\n if (initAccum && length) {\\n accumulator = array[--length];\\n }\\n while (length--) {\\n accumulator = iteratee(accumulator, array[length], length, array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.some` for arrays without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n */\\n function arraySome(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (predicate(array[index], index, array)) {\\n return true;\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * Gets the size of an ASCII `string`.\\n *\\n * @private\\n * @param {string} string The string inspect.\\n * @returns {number} Returns the string size.\\n */\\n var asciiSize = baseProperty('length');\\n\\n /**\\n * Converts an ASCII `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function asciiToArray(string) {\\n return string.split('');\\n }\\n\\n /**\\n * Splits an ASCII `string` into an array of its words.\\n *\\n * @private\\n * @param {string} The string to inspect.\\n * @returns {Array} Returns the words of `string`.\\n */\\n function asciiWords(string) {\\n return string.match(reAsciiWord) || [];\\n }\\n\\n /**\\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\\n * without support for iteratee shorthands, which iterates over `collection`\\n * using `eachFunc`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {Function} eachFunc The function to iterate over `collection`.\\n * @returns {*} Returns the found element or its key, else `undefined`.\\n */\\n function baseFindKey(collection, predicate, eachFunc) {\\n var result;\\n eachFunc(collection, function(value, key, collection) {\\n if (predicate(value, key, collection)) {\\n result = key;\\n return false;\\n }\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\\n * support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {number} fromIndex The index to search from.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\\n var length = array.length,\\n index = fromIndex + (fromRight ? 1 : -1);\\n\\n while ((fromRight ? index-- : ++index < length)) {\\n if (predicate(array[index], index, array)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseIndexOf(array, value, fromIndex) {\\n return value === value\\n ? strictIndexOf(array, value, fromIndex)\\n : baseFindIndex(array, baseIsNaN, fromIndex);\\n }\\n\\n /**\\n * This function is like `baseIndexOf` except that it accepts a comparator.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @param {Function} comparator The comparator invoked per element.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseIndexOfWith(array, value, fromIndex, comparator) {\\n var index = fromIndex - 1,\\n length = array.length;\\n\\n while (++index < length) {\\n if (comparator(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * The base implementation of `_.isNaN` without support for number objects.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\\n */\\n function baseIsNaN(value) {\\n return value !== value;\\n }\\n\\n /**\\n * The base implementation of `_.mean` and `_.meanBy` without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {number} Returns the mean.\\n */\\n function baseMean(array, iteratee) {\\n var length = array == null ? 0 : array.length;\\n return length ? (baseSum(array, iteratee) / length) : NAN;\\n }\\n\\n /**\\n * The base implementation of `_.property` without support for deep paths.\\n *\\n * @private\\n * @param {string} key The key of the property to get.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function baseProperty(key) {\\n return function(object) {\\n return object == null ? undefined : object[key];\\n };\\n }\\n\\n /**\\n * The base implementation of `_.propertyOf` without support for deep paths.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function basePropertyOf(object) {\\n return function(key) {\\n return object == null ? undefined : object[key];\\n };\\n }\\n\\n /**\\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} accumulator The initial value.\\n * @param {boolean} initAccum Specify using the first or last element of\\n * `collection` as the initial value.\\n * @param {Function} eachFunc The function to iterate over `collection`.\\n * @returns {*} Returns the accumulated value.\\n */\\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\\n eachFunc(collection, function(value, index, collection) {\\n accumulator = initAccum\\n ? (initAccum = false, value)\\n : iteratee(accumulator, value, index, collection);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.sortBy` which uses `comparer` to define the\\n * sort order of `array` and replaces criteria objects with their corresponding\\n * values.\\n *\\n * @private\\n * @param {Array} array The array to sort.\\n * @param {Function} comparer The function to define sort order.\\n * @returns {Array} Returns `array`.\\n */\\n function baseSortBy(array, comparer) {\\n var length = array.length;\\n\\n array.sort(comparer);\\n while (length--) {\\n array[length] = array[length].value;\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.sum` and `_.sumBy` without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {number} Returns the sum.\\n */\\n function baseSum(array, iteratee) {\\n var result,\\n index = -1,\\n length = array.length;\\n\\n while (++index < length) {\\n var current = iteratee(array[index]);\\n if (current !== undefined) {\\n result = result === undefined ? current : (result + current);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.times` without support for iteratee shorthands\\n * or max array length checks.\\n *\\n * @private\\n * @param {number} n The number of times to invoke `iteratee`.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the array of results.\\n */\\n function baseTimes(n, iteratee) {\\n var index = -1,\\n result = Array(n);\\n\\n while (++index < n) {\\n result[index] = iteratee(index);\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\\n * of key-value pairs for `object` corresponding to the property names of `props`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} props The property names to get values for.\\n * @returns {Object} Returns the key-value pairs.\\n */\\n function baseToPairs(object, props) {\\n return arrayMap(props, function(key) {\\n return [key, object[key]];\\n });\\n }\\n\\n /**\\n * The base implementation of `_.unary` without support for storing metadata.\\n *\\n * @private\\n * @param {Function} func The function to cap arguments for.\\n * @returns {Function} Returns the new capped function.\\n */\\n function baseUnary(func) {\\n return function(value) {\\n return func(value);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.values` and `_.valuesIn` which creates an\\n * array of `object` property values corresponding to the property names\\n * of `props`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} props The property names to get values for.\\n * @returns {Object} Returns the array of property values.\\n */\\n function baseValues(object, props) {\\n return arrayMap(props, function(key) {\\n return object[key];\\n });\\n }\\n\\n /**\\n * Checks if a `cache` value for `key` exists.\\n *\\n * @private\\n * @param {Object} cache The cache to query.\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function cacheHas(cache, key) {\\n return cache.has(key);\\n }\\n\\n /**\\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\\n * that is not found in the character symbols.\\n *\\n * @private\\n * @param {Array} strSymbols The string symbols to inspect.\\n * @param {Array} chrSymbols The character symbols to find.\\n * @returns {number} Returns the index of the first unmatched string symbol.\\n */\\n function charsStartIndex(strSymbols, chrSymbols) {\\n var index = -1,\\n length = strSymbols.length;\\n\\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\\n return index;\\n }\\n\\n /**\\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\\n * that is not found in the character symbols.\\n *\\n * @private\\n * @param {Array} strSymbols The string symbols to inspect.\\n * @param {Array} chrSymbols The character symbols to find.\\n * @returns {number} Returns the index of the last unmatched string symbol.\\n */\\n function charsEndIndex(strSymbols, chrSymbols) {\\n var index = strSymbols.length;\\n\\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\\n return index;\\n }\\n\\n /**\\n * Gets the number of `placeholder` occurrences in `array`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} placeholder The placeholder to search for.\\n * @returns {number} Returns the placeholder count.\\n */\\n function countHolders(array, placeholder) {\\n var length = array.length,\\n result = 0;\\n\\n while (length--) {\\n if (array[length] === placeholder) {\\n ++result;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\\n * letters to basic Latin letters.\\n *\\n * @private\\n * @param {string} letter The matched letter to deburr.\\n * @returns {string} Returns the deburred letter.\\n */\\n var deburrLetter = basePropertyOf(deburredLetters);\\n\\n /**\\n * Used by `_.escape` to convert characters to HTML entities.\\n *\\n * @private\\n * @param {string} chr The matched character to escape.\\n * @returns {string} Returns the escaped character.\\n */\\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\\n\\n /**\\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\\n *\\n * @private\\n * @param {string} chr The matched character to escape.\\n * @returns {string} Returns the escaped character.\\n */\\n function escapeStringChar(chr) {\\n return '\\\\\\\\' + stringEscapes[chr];\\n }\\n\\n /**\\n * Gets the value at `key` of `object`.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {string} key The key of the property to get.\\n * @returns {*} Returns the property value.\\n */\\n function getValue(object, key) {\\n return object == null ? undefined : object[key];\\n }\\n\\n /**\\n * Checks if `string` contains Unicode symbols.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\\n */\\n function hasUnicode(string) {\\n return reHasUnicode.test(string);\\n }\\n\\n /**\\n * Checks if `string` contains a word composed of Unicode symbols.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {boolean} Returns `true` if a word is found, else `false`.\\n */\\n function hasUnicodeWord(string) {\\n return reHasUnicodeWord.test(string);\\n }\\n\\n /**\\n * Converts `iterator` to an array.\\n *\\n * @private\\n * @param {Object} iterator The iterator to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function iteratorToArray(iterator) {\\n var data,\\n result = [];\\n\\n while (!(data = iterator.next()).done) {\\n result.push(data.value);\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `map` to its key-value pairs.\\n *\\n * @private\\n * @param {Object} map The map to convert.\\n * @returns {Array} Returns the key-value pairs.\\n */\\n function mapToArray(map) {\\n var index = -1,\\n result = Array(map.size);\\n\\n map.forEach(function(value, key) {\\n result[++index] = [key, value];\\n });\\n return result;\\n }\\n\\n /**\\n * Creates a unary function that invokes `func` with its argument transformed.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {Function} transform The argument transform.\\n * @returns {Function} Returns the new function.\\n */\\n function overArg(func, transform) {\\n return function(arg) {\\n return func(transform(arg));\\n };\\n }\\n\\n /**\\n * Replaces all `placeholder` elements in `array` with an internal placeholder\\n * and returns an array of their indexes.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {*} placeholder The placeholder to replace.\\n * @returns {Array} Returns the new array of placeholder indexes.\\n */\\n function replaceHolders(array, placeholder) {\\n var index = -1,\\n length = array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (value === placeholder || value === PLACEHOLDER) {\\n array[index] = PLACEHOLDER;\\n result[resIndex++] = index;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `set` to an array of its values.\\n *\\n * @private\\n * @param {Object} set The set to convert.\\n * @returns {Array} Returns the values.\\n */\\n function setToArray(set) {\\n var index = -1,\\n result = Array(set.size);\\n\\n set.forEach(function(value) {\\n result[++index] = value;\\n });\\n return result;\\n }\\n\\n /**\\n * Converts `set` to its value-value pairs.\\n *\\n * @private\\n * @param {Object} set The set to convert.\\n * @returns {Array} Returns the value-value pairs.\\n */\\n function setToPairs(set) {\\n var index = -1,\\n result = Array(set.size);\\n\\n set.forEach(function(value) {\\n result[++index] = [value, value];\\n });\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.indexOf` which performs strict equality\\n * comparisons of values, i.e. `===`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function strictIndexOf(array, value, fromIndex) {\\n var index = fromIndex - 1,\\n length = array.length;\\n\\n while (++index < length) {\\n if (array[index] === value) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * A specialized version of `_.lastIndexOf` which performs strict equality\\n * comparisons of values, i.e. `===`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function strictLastIndexOf(array, value, fromIndex) {\\n var index = fromIndex + 1;\\n while (index--) {\\n if (array[index] === value) {\\n return index;\\n }\\n }\\n return index;\\n }\\n\\n /**\\n * Gets the number of symbols in `string`.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {number} Returns the string size.\\n */\\n function stringSize(string) {\\n return hasUnicode(string)\\n ? unicodeSize(string)\\n : asciiSize(string);\\n }\\n\\n /**\\n * Converts `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function stringToArray(string) {\\n return hasUnicode(string)\\n ? unicodeToArray(string)\\n : asciiToArray(string);\\n }\\n\\n /**\\n * Used by `_.unescape` to convert HTML entities to characters.\\n *\\n * @private\\n * @param {string} chr The matched character to unescape.\\n * @returns {string} Returns the unescaped character.\\n */\\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\\n\\n /**\\n * Gets the size of a Unicode `string`.\\n *\\n * @private\\n * @param {string} string The string inspect.\\n * @returns {number} Returns the string size.\\n */\\n function unicodeSize(string) {\\n var result = reUnicode.lastIndex = 0;\\n while (reUnicode.test(string)) {\\n ++result;\\n }\\n return result;\\n }\\n\\n /**\\n * Converts a Unicode `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function unicodeToArray(string) {\\n return string.match(reUnicode) || [];\\n }\\n\\n /**\\n * Splits a Unicode `string` into an array of its words.\\n *\\n * @private\\n * @param {string} The string to inspect.\\n * @returns {Array} Returns the words of `string`.\\n */\\n function unicodeWords(string) {\\n return string.match(reUnicodeWord) || [];\\n }\\n\\n /*--------------------------------------------------------------------------*/\\n\\n /**\\n * Create a new pristine `lodash` function using the `context` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Util\\n * @param {Object} [context=root] The context object.\\n * @returns {Function} Returns a new `lodash` function.\\n * @example\\n *\\n * _.mixin({ 'foo': _.constant('foo') });\\n *\\n * var lodash = _.runInContext();\\n * lodash.mixin({ 'bar': lodash.constant('bar') });\\n *\\n * _.isFunction(_.foo);\\n * // => true\\n * _.isFunction(_.bar);\\n * // => false\\n *\\n * lodash.isFunction(lodash.foo);\\n * // => false\\n * lodash.isFunction(lodash.bar);\\n * // => true\\n *\\n * // Create a suped-up `defer` in Node.js.\\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\\n */\\n var runInContext = (function runInContext(context) {\\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\\n\\n /** Built-in constructor references. */\\n var Array = context.Array,\\n Date = context.Date,\\n Error = context.Error,\\n Function = context.Function,\\n Math = context.Math,\\n Object = context.Object,\\n RegExp = context.RegExp,\\n String = context.String,\\n TypeError = context.TypeError;\\n\\n /** Used for built-in method references. */\\n var arrayProto = Array.prototype,\\n funcProto = Function.prototype,\\n objectProto = Object.prototype;\\n\\n /** Used to detect overreaching core-js shims. */\\n var coreJsData = context['__core-js_shared__'];\\n\\n /** Used to resolve the decompiled source of functions. */\\n var funcToString = funcProto.toString;\\n\\n /** Used to check objects for own properties. */\\n var hasOwnProperty = objectProto.hasOwnProperty;\\n\\n /** Used to generate unique IDs. */\\n var idCounter = 0;\\n\\n /** Used to detect methods masquerading as native. */\\n var maskSrcKey = (function() {\\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\\n return uid ? ('Symbol(src)_1.' + uid) : '';\\n }());\\n\\n /**\\n * Used to resolve the\\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\\n * of values.\\n */\\n var nativeObjectToString = objectProto.toString;\\n\\n /** Used to infer the `Object` constructor. */\\n var objectCtorString = funcToString.call(Object);\\n\\n /** Used to restore the original `_` reference in `_.noConflict`. */\\n var oldDash = root._;\\n\\n /** Used to detect if a method is native. */\\n var reIsNative = RegExp('^' +\\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\\\\\$&')\\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\\\\\\\()| for .+?(?=\\\\\\\\\\\\])/g, '$1.*?') + '$'\\n );\\n\\n /** Built-in value references. */\\n var Buffer = moduleExports ? context.Buffer : undefined,\\n Symbol = context.Symbol,\\n Uint8Array = context.Uint8Array,\\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\\n getPrototype = overArg(Object.getPrototypeOf, Object),\\n objectCreate = Object.create,\\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\\n splice = arrayProto.splice,\\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\\n symIterator = Symbol ? Symbol.iterator : undefined,\\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\\n\\n var defineProperty = (function() {\\n try {\\n var func = getNative(Object, 'defineProperty');\\n func({}, '', {});\\n return func;\\n } catch (e) {}\\n }());\\n\\n /** Mocked built-ins. */\\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\\n\\n /* Built-in method references for those with the same name as other `lodash` methods. */\\n var nativeCeil = Math.ceil,\\n nativeFloor = Math.floor,\\n nativeGetSymbols = Object.getOwnPropertySymbols,\\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\\n nativeIsFinite = context.isFinite,\\n nativeJoin = arrayProto.join,\\n nativeKeys = overArg(Object.keys, Object),\\n nativeMax = Math.max,\\n nativeMin = Math.min,\\n nativeNow = Date.now,\\n nativeParseInt = context.parseInt,\\n nativeRandom = Math.random,\\n nativeReverse = arrayProto.reverse;\\n\\n /* Built-in method references that are verified to be native. */\\n var DataView = getNative(context, 'DataView'),\\n Map = getNative(context, 'Map'),\\n Promise = getNative(context, 'Promise'),\\n Set = getNative(context, 'Set'),\\n WeakMap = getNative(context, 'WeakMap'),\\n nativeCreate = getNative(Object, 'create');\\n\\n /** Used to store function metadata. */\\n var metaMap = WeakMap && new WeakMap;\\n\\n /** Used to lookup unminified function names. */\\n var realNames = {};\\n\\n /** Used to detect maps, sets, and weakmaps. */\\n var dataViewCtorString = toSource(DataView),\\n mapCtorString = toSource(Map),\\n promiseCtorString = toSource(Promise),\\n setCtorString = toSource(Set),\\n weakMapCtorString = toSource(WeakMap);\\n\\n /** Used to convert symbols to primitives and strings. */\\n var symbolProto = Symbol ? Symbol.prototype : undefined,\\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\\n symbolToString = symbolProto ? symbolProto.toString : undefined;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a `lodash` object which wraps `value` to enable implicit method\\n * chain sequences. Methods that operate on and return arrays, collections,\\n * and functions can be chained together. Methods that retrieve a single value\\n * or may return a primitive value will automatically end the chain sequence\\n * and return the unwrapped value. Otherwise, the value must be unwrapped\\n * with `_#value`.\\n *\\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\\n * enabled using `_.chain`.\\n *\\n * The execution of chained methods is lazy, that is, it's deferred until\\n * `_#value` is implicitly or explicitly called.\\n *\\n * Lazy evaluation allows several methods to support shortcut fusion.\\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\\n * the creation of intermediate arrays and can greatly reduce the number of\\n * iteratee executions. Sections of a chain sequence qualify for shortcut\\n * fusion if the section is applied to an array and iteratees accept only\\n * one argument. The heuristic for whether a section qualifies for shortcut\\n * fusion is subject to change.\\n *\\n * Chaining is supported in custom builds as long as the `_#value` method is\\n * directly or indirectly included in the build.\\n *\\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\\n *\\n * The wrapper `Array` methods are:\\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\\n *\\n * The wrapper `String` methods are:\\n * `replace` and `split`\\n *\\n * The wrapper methods that support shortcut fusion are:\\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\\n *\\n * The chainable wrapper methods are:\\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\\n * `zipObject`, `zipObjectDeep`, and `zipWith`\\n *\\n * The wrapper methods that are **not** chainable by default are:\\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\\n * `upperFirst`, `value`, and `words`\\n *\\n * @name _\\n * @constructor\\n * @category Seq\\n * @param {*} value The value to wrap in a `lodash` instance.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var wrapped = _([1, 2, 3]);\\n *\\n * // Returns an unwrapped value.\\n * wrapped.reduce(_.add);\\n * // => 6\\n *\\n * // Returns a wrapped value.\\n * var squares = wrapped.map(square);\\n *\\n * _.isArray(squares);\\n * // => false\\n *\\n * _.isArray(squares.value());\\n * // => true\\n */\\n function lodash(value) {\\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\\n if (value instanceof LodashWrapper) {\\n return value;\\n }\\n if (hasOwnProperty.call(value, '__wrapped__')) {\\n return wrapperClone(value);\\n }\\n }\\n return new LodashWrapper(value);\\n }\\n\\n /**\\n * The base implementation of `_.create` without support for assigning\\n * properties to the created object.\\n *\\n * @private\\n * @param {Object} proto The object to inherit from.\\n * @returns {Object} Returns the new object.\\n */\\n var baseCreate = (function() {\\n function object() {}\\n return function(proto) {\\n if (!isObject(proto)) {\\n return {};\\n }\\n if (objectCreate) {\\n return objectCreate(proto);\\n }\\n object.prototype = proto;\\n var result = new object;\\n object.prototype = undefined;\\n return result;\\n };\\n }());\\n\\n /**\\n * The function whose prototype chain sequence wrappers inherit from.\\n *\\n * @private\\n */\\n function baseLodash() {\\n // No operation performed.\\n }\\n\\n /**\\n * The base constructor for creating `lodash` wrapper objects.\\n *\\n * @private\\n * @param {*} value The value to wrap.\\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\\n */\\n function LodashWrapper(value, chainAll) {\\n this.__wrapped__ = value;\\n this.__actions__ = [];\\n this.__chain__ = !!chainAll;\\n this.__index__ = 0;\\n this.__values__ = undefined;\\n }\\n\\n /**\\n * By default, the template delimiters used by lodash are like those in\\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\\n * following template settings to use alternative delimiters.\\n *\\n * @static\\n * @memberOf _\\n * @type {Object}\\n */\\n lodash.templateSettings = {\\n\\n /**\\n * Used to detect `data` property values to be HTML-escaped.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'escape': reEscape,\\n\\n /**\\n * Used to detect code to be evaluated.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'evaluate': reEvaluate,\\n\\n /**\\n * Used to detect `data` property values to inject.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'interpolate': reInterpolate,\\n\\n /**\\n * Used to reference the data object in the template text.\\n *\\n * @memberOf _.templateSettings\\n * @type {string}\\n */\\n 'variable': '',\\n\\n /**\\n * Used to import variables into the compiled template.\\n *\\n * @memberOf _.templateSettings\\n * @type {Object}\\n */\\n 'imports': {\\n\\n /**\\n * A reference to the `lodash` function.\\n *\\n * @memberOf _.templateSettings.imports\\n * @type {Function}\\n */\\n '_': lodash\\n }\\n };\\n\\n // Ensure wrappers are instances of `baseLodash`.\\n lodash.prototype = baseLodash.prototype;\\n lodash.prototype.constructor = lodash;\\n\\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\\n LodashWrapper.prototype.constructor = LodashWrapper;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\\n *\\n * @private\\n * @constructor\\n * @param {*} value The value to wrap.\\n */\\n function LazyWrapper(value) {\\n this.__wrapped__ = value;\\n this.__actions__ = [];\\n this.__dir__ = 1;\\n this.__filtered__ = false;\\n this.__iteratees__ = [];\\n this.__takeCount__ = MAX_ARRAY_LENGTH;\\n this.__views__ = [];\\n }\\n\\n /**\\n * Creates a clone of the lazy wrapper object.\\n *\\n * @private\\n * @name clone\\n * @memberOf LazyWrapper\\n * @returns {Object} Returns the cloned `LazyWrapper` object.\\n */\\n function lazyClone() {\\n var result = new LazyWrapper(this.__wrapped__);\\n result.__actions__ = copyArray(this.__actions__);\\n result.__dir__ = this.__dir__;\\n result.__filtered__ = this.__filtered__;\\n result.__iteratees__ = copyArray(this.__iteratees__);\\n result.__takeCount__ = this.__takeCount__;\\n result.__views__ = copyArray(this.__views__);\\n return result;\\n }\\n\\n /**\\n * Reverses the direction of lazy iteration.\\n *\\n * @private\\n * @name reverse\\n * @memberOf LazyWrapper\\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\\n */\\n function lazyReverse() {\\n if (this.__filtered__) {\\n var result = new LazyWrapper(this);\\n result.__dir__ = -1;\\n result.__filtered__ = true;\\n } else {\\n result = this.clone();\\n result.__dir__ *= -1;\\n }\\n return result;\\n }\\n\\n /**\\n * Extracts the unwrapped value from its lazy wrapper.\\n *\\n * @private\\n * @name value\\n * @memberOf LazyWrapper\\n * @returns {*} Returns the unwrapped value.\\n */\\n function lazyValue() {\\n var array = this.__wrapped__.value(),\\n dir = this.__dir__,\\n isArr = isArray(array),\\n isRight = dir < 0,\\n arrLength = isArr ? array.length : 0,\\n view = getView(0, arrLength, this.__views__),\\n start = view.start,\\n end = view.end,\\n length = end - start,\\n index = isRight ? end : (start - 1),\\n iteratees = this.__iteratees__,\\n iterLength = iteratees.length,\\n resIndex = 0,\\n takeCount = nativeMin(length, this.__takeCount__);\\n\\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\\n return baseWrapperValue(array, this.__actions__);\\n }\\n var result = [];\\n\\n outer:\\n while (length-- && resIndex < takeCount) {\\n index += dir;\\n\\n var iterIndex = -1,\\n value = array[index];\\n\\n while (++iterIndex < iterLength) {\\n var data = iteratees[iterIndex],\\n iteratee = data.iteratee,\\n type = data.type,\\n computed = iteratee(value);\\n\\n if (type == LAZY_MAP_FLAG) {\\n value = computed;\\n } else if (!computed) {\\n if (type == LAZY_FILTER_FLAG) {\\n continue outer;\\n } else {\\n break outer;\\n }\\n }\\n }\\n result[resIndex++] = value;\\n }\\n return result;\\n }\\n\\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\\n LazyWrapper.prototype.constructor = LazyWrapper;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a hash object.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function Hash(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the hash.\\n *\\n * @private\\n * @name clear\\n * @memberOf Hash\\n */\\n function hashClear() {\\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the hash.\\n *\\n * @private\\n * @name delete\\n * @memberOf Hash\\n * @param {Object} hash The hash to modify.\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function hashDelete(key) {\\n var result = this.has(key) && delete this.__data__[key];\\n this.size -= result ? 1 : 0;\\n return result;\\n }\\n\\n /**\\n * Gets the hash value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf Hash\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function hashGet(key) {\\n var data = this.__data__;\\n if (nativeCreate) {\\n var result = data[key];\\n return result === HASH_UNDEFINED ? undefined : result;\\n }\\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\\n }\\n\\n /**\\n * Checks if a hash value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf Hash\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function hashHas(key) {\\n var data = this.__data__;\\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\\n }\\n\\n /**\\n * Sets the hash `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf Hash\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the hash instance.\\n */\\n function hashSet(key, value) {\\n var data = this.__data__;\\n this.size += this.has(key) ? 0 : 1;\\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\\n return this;\\n }\\n\\n // Add methods to `Hash`.\\n Hash.prototype.clear = hashClear;\\n Hash.prototype['delete'] = hashDelete;\\n Hash.prototype.get = hashGet;\\n Hash.prototype.has = hashHas;\\n Hash.prototype.set = hashSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an list cache object.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function ListCache(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the list cache.\\n *\\n * @private\\n * @name clear\\n * @memberOf ListCache\\n */\\n function listCacheClear() {\\n this.__data__ = [];\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the list cache.\\n *\\n * @private\\n * @name delete\\n * @memberOf ListCache\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function listCacheDelete(key) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n if (index < 0) {\\n return false;\\n }\\n var lastIndex = data.length - 1;\\n if (index == lastIndex) {\\n data.pop();\\n } else {\\n splice.call(data, index, 1);\\n }\\n --this.size;\\n return true;\\n }\\n\\n /**\\n * Gets the list cache value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf ListCache\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function listCacheGet(key) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n return index < 0 ? undefined : data[index][1];\\n }\\n\\n /**\\n * Checks if a list cache value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf ListCache\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function listCacheHas(key) {\\n return assocIndexOf(this.__data__, key) > -1;\\n }\\n\\n /**\\n * Sets the list cache `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf ListCache\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the list cache instance.\\n */\\n function listCacheSet(key, value) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n if (index < 0) {\\n ++this.size;\\n data.push([key, value]);\\n } else {\\n data[index][1] = value;\\n }\\n return this;\\n }\\n\\n // Add methods to `ListCache`.\\n ListCache.prototype.clear = listCacheClear;\\n ListCache.prototype['delete'] = listCacheDelete;\\n ListCache.prototype.get = listCacheGet;\\n ListCache.prototype.has = listCacheHas;\\n ListCache.prototype.set = listCacheSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a map cache object to store key-value pairs.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function MapCache(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the map.\\n *\\n * @private\\n * @name clear\\n * @memberOf MapCache\\n */\\n function mapCacheClear() {\\n this.size = 0;\\n this.__data__ = {\\n 'hash': new Hash,\\n 'map': new (Map || ListCache),\\n 'string': new Hash\\n };\\n }\\n\\n /**\\n * Removes `key` and its value from the map.\\n *\\n * @private\\n * @name delete\\n * @memberOf MapCache\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function mapCacheDelete(key) {\\n var result = getMapData(this, key)['delete'](key);\\n this.size -= result ? 1 : 0;\\n return result;\\n }\\n\\n /**\\n * Gets the map value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf MapCache\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function mapCacheGet(key) {\\n return getMapData(this, key).get(key);\\n }\\n\\n /**\\n * Checks if a map value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf MapCache\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function mapCacheHas(key) {\\n return getMapData(this, key).has(key);\\n }\\n\\n /**\\n * Sets the map `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf MapCache\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the map cache instance.\\n */\\n function mapCacheSet(key, value) {\\n var data = getMapData(this, key),\\n size = data.size;\\n\\n data.set(key, value);\\n this.size += data.size == size ? 0 : 1;\\n return this;\\n }\\n\\n // Add methods to `MapCache`.\\n MapCache.prototype.clear = mapCacheClear;\\n MapCache.prototype['delete'] = mapCacheDelete;\\n MapCache.prototype.get = mapCacheGet;\\n MapCache.prototype.has = mapCacheHas;\\n MapCache.prototype.set = mapCacheSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n *\\n * Creates an array cache object to store unique values.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [values] The values to cache.\\n */\\n function SetCache(values) {\\n var index = -1,\\n length = values == null ? 0 : values.length;\\n\\n this.__data__ = new MapCache;\\n while (++index < length) {\\n this.add(values[index]);\\n }\\n }\\n\\n /**\\n * Adds `value` to the array cache.\\n *\\n * @private\\n * @name add\\n * @memberOf SetCache\\n * @alias push\\n * @param {*} value The value to cache.\\n * @returns {Object} Returns the cache instance.\\n */\\n function setCacheAdd(value) {\\n this.__data__.set(value, HASH_UNDEFINED);\\n return this;\\n }\\n\\n /**\\n * Checks if `value` is in the array cache.\\n *\\n * @private\\n * @name has\\n * @memberOf SetCache\\n * @param {*} value The value to search for.\\n * @returns {number} Returns `true` if `value` is found, else `false`.\\n */\\n function setCacheHas(value) {\\n return this.__data__.has(value);\\n }\\n\\n // Add methods to `SetCache`.\\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\\n SetCache.prototype.has = setCacheHas;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a stack cache object to store key-value pairs.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function Stack(entries) {\\n var data = this.__data__ = new ListCache(entries);\\n this.size = data.size;\\n }\\n\\n /**\\n * Removes all key-value entries from the stack.\\n *\\n * @private\\n * @name clear\\n * @memberOf Stack\\n */\\n function stackClear() {\\n this.__data__ = new ListCache;\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the stack.\\n *\\n * @private\\n * @name delete\\n * @memberOf Stack\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function stackDelete(key) {\\n var data = this.__data__,\\n result = data['delete'](key);\\n\\n this.size = data.size;\\n return result;\\n }\\n\\n /**\\n * Gets the stack value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf Stack\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function stackGet(key) {\\n return this.__data__.get(key);\\n }\\n\\n /**\\n * Checks if a stack value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf Stack\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function stackHas(key) {\\n return this.__data__.has(key);\\n }\\n\\n /**\\n * Sets the stack `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf Stack\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the stack cache instance.\\n */\\n function stackSet(key, value) {\\n var data = this.__data__;\\n if (data instanceof ListCache) {\\n var pairs = data.__data__;\\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\\n pairs.push([key, value]);\\n this.size = ++data.size;\\n return this;\\n }\\n data = this.__data__ = new MapCache(pairs);\\n }\\n data.set(key, value);\\n this.size = data.size;\\n return this;\\n }\\n\\n // Add methods to `Stack`.\\n Stack.prototype.clear = stackClear;\\n Stack.prototype['delete'] = stackDelete;\\n Stack.prototype.get = stackGet;\\n Stack.prototype.has = stackHas;\\n Stack.prototype.set = stackSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an array of the enumerable property names of the array-like `value`.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @param {boolean} inherited Specify returning inherited property names.\\n * @returns {Array} Returns the array of property names.\\n */\\n function arrayLikeKeys(value, inherited) {\\n var isArr = isArray(value),\\n isArg = !isArr && isArguments(value),\\n isBuff = !isArr && !isArg && isBuffer(value),\\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\\n skipIndexes = isArr || isArg || isBuff || isType,\\n result = skipIndexes ? baseTimes(value.length, String) : [],\\n length = result.length;\\n\\n for (var key in value) {\\n if ((inherited || hasOwnProperty.call(value, key)) &&\\n !(skipIndexes && (\\n // Safari 9 has enumerable `arguments.length` in strict mode.\\n key == 'length' ||\\n // Node.js 0.10 has enumerable non-index properties on buffers.\\n (isBuff && (key == 'offset' || key == 'parent')) ||\\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\\n // Skip index properties.\\n isIndex(key, length)\\n ))) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.sample` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to sample.\\n * @returns {*} Returns the random element.\\n */\\n function arraySample(array) {\\n var length = array.length;\\n return length ? array[baseRandom(0, length - 1)] : undefined;\\n }\\n\\n /**\\n * A specialized version of `_.sampleSize` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to sample.\\n * @param {number} n The number of elements to sample.\\n * @returns {Array} Returns the random elements.\\n */\\n function arraySampleSize(array, n) {\\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\\n }\\n\\n /**\\n * A specialized version of `_.shuffle` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n */\\n function arrayShuffle(array) {\\n return shuffleSelf(copyArray(array));\\n }\\n\\n /**\\n * This function is like `assignValue` except that it doesn't assign\\n * `undefined` values.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function assignMergeValue(object, key, value) {\\n if ((value !== undefined && !eq(object[key], value)) ||\\n (value === undefined && !(key in object))) {\\n baseAssignValue(object, key, value);\\n }\\n }\\n\\n /**\\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function assignValue(object, key, value) {\\n var objValue = object[key];\\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\\n (value === undefined && !(key in object))) {\\n baseAssignValue(object, key, value);\\n }\\n }\\n\\n /**\\n * Gets the index at which the `key` is found in `array` of key-value pairs.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} key The key to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function assocIndexOf(array, key) {\\n var length = array.length;\\n while (length--) {\\n if (eq(array[length][0], key)) {\\n return length;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * Aggregates elements of `collection` on `accumulator` with keys transformed\\n * by `iteratee` and values set by `setter`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform keys.\\n * @param {Object} accumulator The initial aggregated object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function baseAggregator(collection, setter, iteratee, accumulator) {\\n baseEach(collection, function(value, key, collection) {\\n setter(accumulator, value, iteratee(value), collection);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.assign` without support for multiple sources\\n * or `customizer` functions.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @returns {Object} Returns `object`.\\n */\\n function baseAssign(object, source) {\\n return object && copyObject(source, keys(source), object);\\n }\\n\\n /**\\n * The base implementation of `_.assignIn` without support for multiple sources\\n * or `customizer` functions.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @returns {Object} Returns `object`.\\n */\\n function baseAssignIn(object, source) {\\n return object && copyObject(source, keysIn(source), object);\\n }\\n\\n /**\\n * The base implementation of `assignValue` and `assignMergeValue` without\\n * value checks.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function baseAssignValue(object, key, value) {\\n if (key == '__proto__' && defineProperty) {\\n defineProperty(object, key, {\\n 'configurable': true,\\n 'enumerable': true,\\n 'value': value,\\n 'writable': true\\n });\\n } else {\\n object[key] = value;\\n }\\n }\\n\\n /**\\n * The base implementation of `_.at` without support for individual paths.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {string[]} paths The property paths to pick.\\n * @returns {Array} Returns the picked elements.\\n */\\n function baseAt(object, paths) {\\n var index = -1,\\n length = paths.length,\\n result = Array(length),\\n skip = object == null;\\n\\n while (++index < length) {\\n result[index] = skip ? undefined : get(object, paths[index]);\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.clamp` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {number} number The number to clamp.\\n * @param {number} [lower] The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the clamped number.\\n */\\n function baseClamp(number, lower, upper) {\\n if (number === number) {\\n if (upper !== undefined) {\\n number = number <= upper ? number : upper;\\n }\\n if (lower !== undefined) {\\n number = number >= lower ? number : lower;\\n }\\n }\\n return number;\\n }\\n\\n /**\\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\\n * traversed objects.\\n *\\n * @private\\n * @param {*} value The value to clone.\\n * @param {boolean} bitmask The bitmask flags.\\n * 1 - Deep clone\\n * 2 - Flatten inherited properties\\n * 4 - Clone symbols\\n * @param {Function} [customizer] The function to customize cloning.\\n * @param {string} [key] The key of `value`.\\n * @param {Object} [object] The parent object of `value`.\\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\\n * @returns {*} Returns the cloned value.\\n */\\n function baseClone(value, bitmask, customizer, key, object, stack) {\\n var result,\\n isDeep = bitmask & CLONE_DEEP_FLAG,\\n isFlat = bitmask & CLONE_FLAT_FLAG,\\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\\n\\n if (customizer) {\\n result = object ? customizer(value, key, object, stack) : customizer(value);\\n }\\n if (result !== undefined) {\\n return result;\\n }\\n if (!isObject(value)) {\\n return value;\\n }\\n var isArr = isArray(value);\\n if (isArr) {\\n result = initCloneArray(value);\\n if (!isDeep) {\\n return copyArray(value, result);\\n }\\n } else {\\n var tag = getTag(value),\\n isFunc = tag == funcTag || tag == genTag;\\n\\n if (isBuffer(value)) {\\n return cloneBuffer(value, isDeep);\\n }\\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\\n if (!isDeep) {\\n return isFlat\\n ? copySymbolsIn(value, baseAssignIn(result, value))\\n : copySymbols(value, baseAssign(result, value));\\n }\\n } else {\\n if (!cloneableTags[tag]) {\\n return object ? value : {};\\n }\\n result = initCloneByTag(value, tag, baseClone, isDeep);\\n }\\n }\\n // Check for circular references and return its corresponding clone.\\n stack || (stack = new Stack);\\n var stacked = stack.get(value);\\n if (stacked) {\\n return stacked;\\n }\\n stack.set(value, result);\\n\\n var keysFunc = isFull\\n ? (isFlat ? getAllKeysIn : getAllKeys)\\n : (isFlat ? keysIn : keys);\\n\\n var props = isArr ? undefined : keysFunc(value);\\n arrayEach(props || value, function(subValue, key) {\\n if (props) {\\n key = subValue;\\n subValue = value[key];\\n }\\n // Recursively populate clone (susceptible to call stack limits).\\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.conforms` which doesn't clone `source`.\\n *\\n * @private\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseConforms(source) {\\n var props = keys(source);\\n return function(object) {\\n return baseConformsTo(object, source, props);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.conformsTo` which accepts `props` to check.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\\n */\\n function baseConformsTo(object, source, props) {\\n var length = props.length;\\n if (object == null) {\\n return !length;\\n }\\n object = Object(object);\\n while (length--) {\\n var key = props[length],\\n predicate = source[key],\\n value = object[key];\\n\\n if ((value === undefined && !(key in object)) || !predicate(value)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\\n * to provide to `func`.\\n *\\n * @private\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @param {Array} args The arguments to provide to `func`.\\n * @returns {number|Object} Returns the timer id or timeout object.\\n */\\n function baseDelay(func, wait, args) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n return setTimeout(function() { func.apply(undefined, args); }, wait);\\n }\\n\\n /**\\n * The base implementation of methods like `_.difference` without support\\n * for excluding multiple arrays or iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Array} values The values to exclude.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n */\\n function baseDifference(array, values, iteratee, comparator) {\\n var index = -1,\\n includes = arrayIncludes,\\n isCommon = true,\\n length = array.length,\\n result = [],\\n valuesLength = values.length;\\n\\n if (!length) {\\n return result;\\n }\\n if (iteratee) {\\n values = arrayMap(values, baseUnary(iteratee));\\n }\\n if (comparator) {\\n includes = arrayIncludesWith;\\n isCommon = false;\\n }\\n else if (values.length >= LARGE_ARRAY_SIZE) {\\n includes = cacheHas;\\n isCommon = false;\\n values = new SetCache(values);\\n }\\n outer:\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee == null ? value : iteratee(value);\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (isCommon && computed === computed) {\\n var valuesIndex = valuesLength;\\n while (valuesIndex--) {\\n if (values[valuesIndex] === computed) {\\n continue outer;\\n }\\n }\\n result.push(value);\\n }\\n else if (!includes(values, computed, comparator)) {\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.forEach` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n */\\n var baseEach = createBaseEach(baseForOwn);\\n\\n /**\\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n */\\n var baseEachRight = createBaseEach(baseForOwnRight, true);\\n\\n /**\\n * The base implementation of `_.every` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`\\n */\\n function baseEvery(collection, predicate) {\\n var result = true;\\n baseEach(collection, function(value, index, collection) {\\n result = !!predicate(value, index, collection);\\n return result;\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of methods like `_.max` and `_.min` which accepts a\\n * `comparator` to determine the extremum value.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The iteratee invoked per iteration.\\n * @param {Function} comparator The comparator used to compare values.\\n * @returns {*} Returns the extremum value.\\n */\\n function baseExtremum(array, iteratee, comparator) {\\n var index = -1,\\n length = array.length;\\n\\n while (++index < length) {\\n var value = array[index],\\n current = iteratee(value);\\n\\n if (current != null && (computed === undefined\\n ? (current === current && !isSymbol(current))\\n : comparator(current, computed)\\n )) {\\n var computed = current,\\n result = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.fill` without an iteratee call guard.\\n *\\n * @private\\n * @param {Array} array The array to fill.\\n * @param {*} value The value to fill `array` with.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns `array`.\\n */\\n function baseFill(array, value, start, end) {\\n var length = array.length;\\n\\n start = toInteger(start);\\n if (start < 0) {\\n start = -start > length ? 0 : (length + start);\\n }\\n end = (end === undefined || end > length) ? length : toInteger(end);\\n if (end < 0) {\\n end += length;\\n }\\n end = start > end ? 0 : toLength(end);\\n while (start < end) {\\n array[start++] = value;\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.filter` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n */\\n function baseFilter(collection, predicate) {\\n var result = [];\\n baseEach(collection, function(value, index, collection) {\\n if (predicate(value, index, collection)) {\\n result.push(value);\\n }\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.flatten` with support for restricting flattening.\\n *\\n * @private\\n * @param {Array} array The array to flatten.\\n * @param {number} depth The maximum recursion depth.\\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\\n * @param {Array} [result=[]] The initial result value.\\n * @returns {Array} Returns the new flattened array.\\n */\\n function baseFlatten(array, depth, predicate, isStrict, result) {\\n var index = -1,\\n length = array.length;\\n\\n predicate || (predicate = isFlattenable);\\n result || (result = []);\\n\\n while (++index < length) {\\n var value = array[index];\\n if (depth > 0 && predicate(value)) {\\n if (depth > 1) {\\n // Recursively flatten arrays (susceptible to call stack limits).\\n baseFlatten(value, depth - 1, predicate, isStrict, result);\\n } else {\\n arrayPush(result, value);\\n }\\n } else if (!isStrict) {\\n result[result.length] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `baseForOwn` which iterates over `object`\\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @returns {Object} Returns `object`.\\n */\\n var baseFor = createBaseFor();\\n\\n /**\\n * This function is like `baseFor` except that it iterates over properties\\n * in the opposite order.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @returns {Object} Returns `object`.\\n */\\n var baseForRight = createBaseFor(true);\\n\\n /**\\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n */\\n function baseForOwn(object, iteratee) {\\n return object && baseFor(object, iteratee, keys);\\n }\\n\\n /**\\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n */\\n function baseForOwnRight(object, iteratee) {\\n return object && baseForRight(object, iteratee, keys);\\n }\\n\\n /**\\n * The base implementation of `_.functions` which creates an array of\\n * `object` function property names filtered from `props`.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Array} props The property names to filter.\\n * @returns {Array} Returns the function names.\\n */\\n function baseFunctions(object, props) {\\n return arrayFilter(props, function(key) {\\n return isFunction(object[key]);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.get` without support for default values.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to get.\\n * @returns {*} Returns the resolved value.\\n */\\n function baseGet(object, path) {\\n path = castPath(path, object);\\n\\n var index = 0,\\n length = path.length;\\n\\n while (object != null && index < length) {\\n object = object[toKey(path[index++])];\\n }\\n return (index && index == length) ? object : undefined;\\n }\\n\\n /**\\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\\n * symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\\n var result = keysFunc(object);\\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\\n }\\n\\n /**\\n * The base implementation of `getTag` without fallbacks for buggy environments.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the `toStringTag`.\\n */\\n function baseGetTag(value) {\\n if (value == null) {\\n return value === undefined ? undefinedTag : nullTag;\\n }\\n return (symToStringTag && symToStringTag in Object(value))\\n ? getRawTag(value)\\n : objectToString(value);\\n }\\n\\n /**\\n * The base implementation of `_.gt` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\\n * else `false`.\\n */\\n function baseGt(value, other) {\\n return value > other;\\n }\\n\\n /**\\n * The base implementation of `_.has` without support for deep paths.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {Array|string} key The key to check.\\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\\n */\\n function baseHas(object, key) {\\n return object != null && hasOwnProperty.call(object, key);\\n }\\n\\n /**\\n * The base implementation of `_.hasIn` without support for deep paths.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {Array|string} key The key to check.\\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\\n */\\n function baseHasIn(object, key) {\\n return object != null && key in Object(object);\\n }\\n\\n /**\\n * The base implementation of `_.inRange` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {number} number The number to check.\\n * @param {number} start The start of the range.\\n * @param {number} end The end of the range.\\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\\n */\\n function baseInRange(number, start, end) {\\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\\n }\\n\\n /**\\n * The base implementation of methods like `_.intersection`, without support\\n * for iteratee shorthands, that accepts an array of arrays to inspect.\\n *\\n * @private\\n * @param {Array} arrays The arrays to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of shared values.\\n */\\n function baseIntersection(arrays, iteratee, comparator) {\\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\\n length = arrays[0].length,\\n othLength = arrays.length,\\n othIndex = othLength,\\n caches = Array(othLength),\\n maxLength = Infinity,\\n result = [];\\n\\n while (othIndex--) {\\n var array = arrays[othIndex];\\n if (othIndex && iteratee) {\\n array = arrayMap(array, baseUnary(iteratee));\\n }\\n maxLength = nativeMin(array.length, maxLength);\\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\\n ? new SetCache(othIndex && array)\\n : undefined;\\n }\\n array = arrays[0];\\n\\n var index = -1,\\n seen = caches[0];\\n\\n outer:\\n while (++index < length && result.length < maxLength) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (!(seen\\n ? cacheHas(seen, computed)\\n : includes(result, computed, comparator)\\n )) {\\n othIndex = othLength;\\n while (--othIndex) {\\n var cache = caches[othIndex];\\n if (!(cache\\n ? cacheHas(cache, computed)\\n : includes(arrays[othIndex], computed, comparator))\\n ) {\\n continue outer;\\n }\\n }\\n if (seen) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.invert` and `_.invertBy` which inverts\\n * `object` with values transformed by `iteratee` and set by `setter`.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform values.\\n * @param {Object} accumulator The initial inverted object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function baseInverter(object, setter, iteratee, accumulator) {\\n baseForOwn(object, function(value, key, object) {\\n setter(accumulator, iteratee(value), key, object);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.invoke` without support for individual\\n * method arguments.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the method to invoke.\\n * @param {Array} args The arguments to invoke the method with.\\n * @returns {*} Returns the result of the invoked method.\\n */\\n function baseInvoke(object, path, args) {\\n path = castPath(path, object);\\n object = parent(object, path);\\n var func = object == null ? object : object[toKey(last(path))];\\n return func == null ? undefined : apply(func, object, args);\\n }\\n\\n /**\\n * The base implementation of `_.isArguments`.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\\n */\\n function baseIsArguments(value) {\\n return isObjectLike(value) && baseGetTag(value) == argsTag;\\n }\\n\\n /**\\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\\n */\\n function baseIsArrayBuffer(value) {\\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\\n }\\n\\n /**\\n * The base implementation of `_.isDate` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\\n */\\n function baseIsDate(value) {\\n return isObjectLike(value) && baseGetTag(value) == dateTag;\\n }\\n\\n /**\\n * The base implementation of `_.isEqual` which supports partial comparisons\\n * and tracks traversed objects.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @param {boolean} bitmask The bitmask flags.\\n * 1 - Unordered comparison\\n * 2 - Partial comparison\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n */\\n function baseIsEqual(value, other, bitmask, customizer, stack) {\\n if (value === other) {\\n return true;\\n }\\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\\n return value !== value && other !== other;\\n }\\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\\n }\\n\\n /**\\n * A specialized version of `baseIsEqual` for arrays and objects which performs\\n * deep comparisons and tracks traversed objects enabling objects with circular\\n * references to be compared.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\\n var objIsArr = isArray(object),\\n othIsArr = isArray(other),\\n objTag = objIsArr ? arrayTag : getTag(object),\\n othTag = othIsArr ? arrayTag : getTag(other);\\n\\n objTag = objTag == argsTag ? objectTag : objTag;\\n othTag = othTag == argsTag ? objectTag : othTag;\\n\\n var objIsObj = objTag == objectTag,\\n othIsObj = othTag == objectTag,\\n isSameTag = objTag == othTag;\\n\\n if (isSameTag && isBuffer(object)) {\\n if (!isBuffer(other)) {\\n return false;\\n }\\n objIsArr = true;\\n objIsObj = false;\\n }\\n if (isSameTag && !objIsObj) {\\n stack || (stack = new Stack);\\n return (objIsArr || isTypedArray(object))\\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\\n }\\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\\n\\n if (objIsWrapped || othIsWrapped) {\\n var objUnwrapped = objIsWrapped ? object.value() : object,\\n othUnwrapped = othIsWrapped ? other.value() : other;\\n\\n stack || (stack = new Stack);\\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\\n }\\n }\\n if (!isSameTag) {\\n return false;\\n }\\n stack || (stack = new Stack);\\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\\n }\\n\\n /**\\n * The base implementation of `_.isMap` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\\n */\\n function baseIsMap(value) {\\n return isObjectLike(value) && getTag(value) == mapTag;\\n }\\n\\n /**\\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @param {Array} matchData The property names, values, and compare flags to match.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n */\\n function baseIsMatch(object, source, matchData, customizer) {\\n var index = matchData.length,\\n length = index,\\n noCustomizer = !customizer;\\n\\n if (object == null) {\\n return !length;\\n }\\n object = Object(object);\\n while (index--) {\\n var data = matchData[index];\\n if ((noCustomizer && data[2])\\n ? data[1] !== object[data[0]]\\n : !(data[0] in object)\\n ) {\\n return false;\\n }\\n }\\n while (++index < length) {\\n data = matchData[index];\\n var key = data[0],\\n objValue = object[key],\\n srcValue = data[1];\\n\\n if (noCustomizer && data[2]) {\\n if (objValue === undefined && !(key in object)) {\\n return false;\\n }\\n } else {\\n var stack = new Stack;\\n if (customizer) {\\n var result = customizer(objValue, srcValue, key, object, source, stack);\\n }\\n if (!(result === undefined\\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\\n : result\\n )) {\\n return false;\\n }\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * The base implementation of `_.isNative` without bad shim checks.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a native function,\\n * else `false`.\\n */\\n function baseIsNative(value) {\\n if (!isObject(value) || isMasked(value)) {\\n return false;\\n }\\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\\n return pattern.test(toSource(value));\\n }\\n\\n /**\\n * The base implementation of `_.isRegExp` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\\n */\\n function baseIsRegExp(value) {\\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\\n }\\n\\n /**\\n * The base implementation of `_.isSet` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\\n */\\n function baseIsSet(value) {\\n return isObjectLike(value) && getTag(value) == setTag;\\n }\\n\\n /**\\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\\n */\\n function baseIsTypedArray(value) {\\n return isObjectLike(value) &&\\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\\n }\\n\\n /**\\n * The base implementation of `_.iteratee`.\\n *\\n * @private\\n * @param {*} [value=_.identity] The value to convert to an iteratee.\\n * @returns {Function} Returns the iteratee.\\n */\\n function baseIteratee(value) {\\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\\n if (typeof value == 'function') {\\n return value;\\n }\\n if (value == null) {\\n return identity;\\n }\\n if (typeof value == 'object') {\\n return isArray(value)\\n ? baseMatchesProperty(value[0], value[1])\\n : baseMatches(value);\\n }\\n return property(value);\\n }\\n\\n /**\\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function baseKeys(object) {\\n if (!isPrototype(object)) {\\n return nativeKeys(object);\\n }\\n var result = [];\\n for (var key in Object(object)) {\\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function baseKeysIn(object) {\\n if (!isObject(object)) {\\n return nativeKeysIn(object);\\n }\\n var isProto = isPrototype(object),\\n result = [];\\n\\n for (var key in object) {\\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.lt` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than `other`,\\n * else `false`.\\n */\\n function baseLt(value, other) {\\n return value < other;\\n }\\n\\n /**\\n * The base implementation of `_.map` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n */\\n function baseMap(collection, iteratee) {\\n var index = -1,\\n result = isArrayLike(collection) ? Array(collection.length) : [];\\n\\n baseEach(collection, function(value, key, collection) {\\n result[++index] = iteratee(value, key, collection);\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.matches` which doesn't clone `source`.\\n *\\n * @private\\n * @param {Object} source The object of property values to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseMatches(source) {\\n var matchData = getMatchData(source);\\n if (matchData.length == 1 && matchData[0][2]) {\\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\\n }\\n return function(object) {\\n return object === source || baseIsMatch(object, source, matchData);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\\n *\\n * @private\\n * @param {string} path The path of the property to get.\\n * @param {*} srcValue The value to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseMatchesProperty(path, srcValue) {\\n if (isKey(path) && isStrictComparable(srcValue)) {\\n return matchesStrictComparable(toKey(path), srcValue);\\n }\\n return function(object) {\\n var objValue = get(object, path);\\n return (objValue === undefined && objValue === srcValue)\\n ? hasIn(object, path)\\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.merge` without support for multiple sources.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @param {number} srcIndex The index of `source`.\\n * @param {Function} [customizer] The function to customize merged values.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n */\\n function baseMerge(object, source, srcIndex, customizer, stack) {\\n if (object === source) {\\n return;\\n }\\n baseFor(source, function(srcValue, key) {\\n if (isObject(srcValue)) {\\n stack || (stack = new Stack);\\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\\n }\\n else {\\n var newValue = customizer\\n ? customizer(object[key], srcValue, (key + ''), object, source, stack)\\n : undefined;\\n\\n if (newValue === undefined) {\\n newValue = srcValue;\\n }\\n assignMergeValue(object, key, newValue);\\n }\\n }, keysIn);\\n }\\n\\n /**\\n * A specialized version of `baseMerge` for arrays and objects which performs\\n * deep merges and tracks traversed objects enabling objects with circular\\n * references to be merged.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @param {string} key The key of the value to merge.\\n * @param {number} srcIndex The index of `source`.\\n * @param {Function} mergeFunc The function to merge values.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n */\\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\\n var objValue = object[key],\\n srcValue = source[key],\\n stacked = stack.get(srcValue);\\n\\n if (stacked) {\\n assignMergeValue(object, key, stacked);\\n return;\\n }\\n var newValue = customizer\\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\\n : undefined;\\n\\n var isCommon = newValue === undefined;\\n\\n if (isCommon) {\\n var isArr = isArray(srcValue),\\n isBuff = !isArr && isBuffer(srcValue),\\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\\n\\n newValue = srcValue;\\n if (isArr || isBuff || isTyped) {\\n if (isArray(objValue)) {\\n newValue = objValue;\\n }\\n else if (isArrayLikeObject(objValue)) {\\n newValue = copyArray(objValue);\\n }\\n else if (isBuff) {\\n isCommon = false;\\n newValue = cloneBuffer(srcValue, true);\\n }\\n else if (isTyped) {\\n isCommon = false;\\n newValue = cloneTypedArray(srcValue, true);\\n }\\n else {\\n newValue = [];\\n }\\n }\\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\\n newValue = objValue;\\n if (isArguments(objValue)) {\\n newValue = toPlainObject(objValue);\\n }\\n else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {\\n newValue = initCloneObject(srcValue);\\n }\\n }\\n else {\\n isCommon = false;\\n }\\n }\\n if (isCommon) {\\n // Recursively merge objects and arrays (susceptible to call stack limits).\\n stack.set(srcValue, newValue);\\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\\n stack['delete'](srcValue);\\n }\\n assignMergeValue(object, key, newValue);\\n }\\n\\n /**\\n * The base implementation of `_.nth` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {Array} array The array to query.\\n * @param {number} n The index of the element to return.\\n * @returns {*} Returns the nth element of `array`.\\n */\\n function baseNth(array, n) {\\n var length = array.length;\\n if (!length) {\\n return;\\n }\\n n += n < 0 ? length : 0;\\n return isIndex(n, length) ? array[n] : undefined;\\n }\\n\\n /**\\n * The base implementation of `_.orderBy` without param guards.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\\n * @param {string[]} orders The sort orders of `iteratees`.\\n * @returns {Array} Returns the new sorted array.\\n */\\n function baseOrderBy(collection, iteratees, orders) {\\n var index = -1;\\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\\n\\n var result = baseMap(collection, function(value, key, collection) {\\n var criteria = arrayMap(iteratees, function(iteratee) {\\n return iteratee(value);\\n });\\n return { 'criteria': criteria, 'index': ++index, 'value': value };\\n });\\n\\n return baseSortBy(result, function(object, other) {\\n return compareMultiple(object, other, orders);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.pick` without support for individual\\n * property identifiers.\\n *\\n * @private\\n * @param {Object} object The source object.\\n * @param {string[]} paths The property paths to pick.\\n * @returns {Object} Returns the new object.\\n */\\n function basePick(object, paths) {\\n return basePickBy(object, paths, function(value, path) {\\n return hasIn(object, path);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The source object.\\n * @param {string[]} paths The property paths to pick.\\n * @param {Function} predicate The function invoked per property.\\n * @returns {Object} Returns the new object.\\n */\\n function basePickBy(object, paths, predicate) {\\n var index = -1,\\n length = paths.length,\\n result = {};\\n\\n while (++index < length) {\\n var path = paths[index],\\n value = baseGet(object, path);\\n\\n if (predicate(value, path)) {\\n baseSet(result, castPath(path, object), value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseProperty` which supports deep paths.\\n *\\n * @private\\n * @param {Array|string} path The path of the property to get.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function basePropertyDeep(path) {\\n return function(object) {\\n return baseGet(object, path);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.pullAllBy` without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns `array`.\\n */\\n function basePullAll(array, values, iteratee, comparator) {\\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\\n index = -1,\\n length = values.length,\\n seen = array;\\n\\n if (array === values) {\\n values = copyArray(values);\\n }\\n if (iteratee) {\\n seen = arrayMap(array, baseUnary(iteratee));\\n }\\n while (++index < length) {\\n var fromIndex = 0,\\n value = values[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\\n if (seen !== array) {\\n splice.call(seen, fromIndex, 1);\\n }\\n splice.call(array, fromIndex, 1);\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.pullAt` without support for individual\\n * indexes or capturing the removed elements.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {number[]} indexes The indexes of elements to remove.\\n * @returns {Array} Returns `array`.\\n */\\n function basePullAt(array, indexes) {\\n var length = array ? indexes.length : 0,\\n lastIndex = length - 1;\\n\\n while (length--) {\\n var index = indexes[length];\\n if (length == lastIndex || index !== previous) {\\n var previous = index;\\n if (isIndex(index)) {\\n splice.call(array, index, 1);\\n } else {\\n baseUnset(array, index);\\n }\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.random` without support for returning\\n * floating-point numbers.\\n *\\n * @private\\n * @param {number} lower The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the random number.\\n */\\n function baseRandom(lower, upper) {\\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\\n }\\n\\n /**\\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\\n * coerce arguments.\\n *\\n * @private\\n * @param {number} start The start of the range.\\n * @param {number} end The end of the range.\\n * @param {number} step The value to increment or decrement by.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Array} Returns the range of numbers.\\n */\\n function baseRange(start, end, step, fromRight) {\\n var index = -1,\\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\\n result = Array(length);\\n\\n while (length--) {\\n result[fromRight ? length : ++index] = start;\\n start += step;\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.repeat` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {string} string The string to repeat.\\n * @param {number} n The number of times to repeat the string.\\n * @returns {string} Returns the repeated string.\\n */\\n function baseRepeat(string, n) {\\n var result = '';\\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\\n return result;\\n }\\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\\n do {\\n if (n % 2) {\\n result += string;\\n }\\n n = nativeFloor(n / 2);\\n if (n) {\\n string += string;\\n }\\n } while (n);\\n\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @returns {Function} Returns the new function.\\n */\\n function baseRest(func, start) {\\n return setToString(overRest(func, start, identity), func + '');\\n }\\n\\n /**\\n * The base implementation of `_.sample`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to sample.\\n * @returns {*} Returns the random element.\\n */\\n function baseSample(collection) {\\n return arraySample(values(collection));\\n }\\n\\n /**\\n * The base implementation of `_.sampleSize` without param guards.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to sample.\\n * @param {number} n The number of elements to sample.\\n * @returns {Array} Returns the random elements.\\n */\\n function baseSampleSize(collection, n) {\\n var array = values(collection);\\n return shuffleSelf(array, baseClamp(n, 0, array.length));\\n }\\n\\n /**\\n * The base implementation of `_.set`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @param {Function} [customizer] The function to customize path creation.\\n * @returns {Object} Returns `object`.\\n */\\n function baseSet(object, path, value, customizer) {\\n if (!isObject(object)) {\\n return object;\\n }\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length,\\n lastIndex = length - 1,\\n nested = object;\\n\\n while (nested != null && ++index < length) {\\n var key = toKey(path[index]),\\n newValue = value;\\n\\n if (index != lastIndex) {\\n var objValue = nested[key];\\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\\n if (newValue === undefined) {\\n newValue = isObject(objValue)\\n ? objValue\\n : (isIndex(path[index + 1]) ? [] : {});\\n }\\n }\\n assignValue(nested, key, newValue);\\n nested = nested[key];\\n }\\n return object;\\n }\\n\\n /**\\n * The base implementation of `setData` without support for hot loop shorting.\\n *\\n * @private\\n * @param {Function} func The function to associate metadata with.\\n * @param {*} data The metadata.\\n * @returns {Function} Returns `func`.\\n */\\n var baseSetData = !metaMap ? identity : function(func, data) {\\n metaMap.set(func, data);\\n return func;\\n };\\n\\n /**\\n * The base implementation of `setToString` without support for hot loop shorting.\\n *\\n * @private\\n * @param {Function} func The function to modify.\\n * @param {Function} string The `toString` result.\\n * @returns {Function} Returns `func`.\\n */\\n var baseSetToString = !defineProperty ? identity : function(func, string) {\\n return defineProperty(func, 'toString', {\\n 'configurable': true,\\n 'enumerable': false,\\n 'value': constant(string),\\n 'writable': true\\n });\\n };\\n\\n /**\\n * The base implementation of `_.shuffle`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n */\\n function baseShuffle(collection) {\\n return shuffleSelf(values(collection));\\n }\\n\\n /**\\n * The base implementation of `_.slice` without an iteratee call guard.\\n *\\n * @private\\n * @param {Array} array The array to slice.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function baseSlice(array, start, end) {\\n var index = -1,\\n length = array.length;\\n\\n if (start < 0) {\\n start = -start > length ? 0 : (length + start);\\n }\\n end = end > length ? length : end;\\n if (end < 0) {\\n end += length;\\n }\\n length = start > end ? 0 : ((end - start) >>> 0);\\n start >>>= 0;\\n\\n var result = Array(length);\\n while (++index < length) {\\n result[index] = array[index + start];\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.some` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n */\\n function baseSome(collection, predicate) {\\n var result;\\n\\n baseEach(collection, function(value, index, collection) {\\n result = predicate(value, index, collection);\\n return !result;\\n });\\n return !!result;\\n }\\n\\n /**\\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\\n * performs a binary search of `array` to determine the index at which `value`\\n * should be inserted into `array` in order to maintain its sort order.\\n *\\n * @private\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n */\\n function baseSortedIndex(array, value, retHighest) {\\n var low = 0,\\n high = array == null ? low : array.length;\\n\\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\\n while (low < high) {\\n var mid = (low + high) >>> 1,\\n computed = array[mid];\\n\\n if (computed !== null && !isSymbol(computed) &&\\n (retHighest ? (computed <= value) : (computed < value))) {\\n low = mid + 1;\\n } else {\\n high = mid;\\n }\\n }\\n return high;\\n }\\n return baseSortedIndexBy(array, value, identity, retHighest);\\n }\\n\\n /**\\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\\n * which invokes `iteratee` for `value` and each element of `array` to compute\\n * their sort ranking. The iteratee is invoked with one argument; (value).\\n *\\n * @private\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} iteratee The iteratee invoked per element.\\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n */\\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\\n value = iteratee(value);\\n\\n var low = 0,\\n high = array == null ? 0 : array.length,\\n valIsNaN = value !== value,\\n valIsNull = value === null,\\n valIsSymbol = isSymbol(value),\\n valIsUndefined = value === undefined;\\n\\n while (low < high) {\\n var mid = nativeFloor((low + high) / 2),\\n computed = iteratee(array[mid]),\\n othIsDefined = computed !== undefined,\\n othIsNull = computed === null,\\n othIsReflexive = computed === computed,\\n othIsSymbol = isSymbol(computed);\\n\\n if (valIsNaN) {\\n var setLow = retHighest || othIsReflexive;\\n } else if (valIsUndefined) {\\n setLow = othIsReflexive && (retHighest || othIsDefined);\\n } else if (valIsNull) {\\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\\n } else if (valIsSymbol) {\\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\\n } else if (othIsNull || othIsSymbol) {\\n setLow = false;\\n } else {\\n setLow = retHighest ? (computed <= value) : (computed < value);\\n }\\n if (setLow) {\\n low = mid + 1;\\n } else {\\n high = mid;\\n }\\n }\\n return nativeMin(high, MAX_ARRAY_INDEX);\\n }\\n\\n /**\\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\\n * support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n */\\n function baseSortedUniq(array, iteratee) {\\n var index = -1,\\n length = array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n if (!index || !eq(computed, seen)) {\\n var seen = computed;\\n result[resIndex++] = value === 0 ? 0 : value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.toNumber` which doesn't ensure correct\\n * conversions of binary, hexadecimal, or octal string values.\\n *\\n * @private\\n * @param {*} value The value to process.\\n * @returns {number} Returns the number.\\n */\\n function baseToNumber(value) {\\n if (typeof value == 'number') {\\n return value;\\n }\\n if (isSymbol(value)) {\\n return NAN;\\n }\\n return +value;\\n }\\n\\n /**\\n * The base implementation of `_.toString` which doesn't convert nullish\\n * values to empty strings.\\n *\\n * @private\\n * @param {*} value The value to process.\\n * @returns {string} Returns the string.\\n */\\n function baseToString(value) {\\n // Exit early for strings to avoid a performance hit in some environments.\\n if (typeof value == 'string') {\\n return value;\\n }\\n if (isArray(value)) {\\n // Recursively convert values (susceptible to call stack limits).\\n return arrayMap(value, baseToString) + '';\\n }\\n if (isSymbol(value)) {\\n return symbolToString ? symbolToString.call(value) : '';\\n }\\n var result = (value + '');\\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\\n }\\n\\n /**\\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n */\\n function baseUniq(array, iteratee, comparator) {\\n var index = -1,\\n includes = arrayIncludes,\\n length = array.length,\\n isCommon = true,\\n result = [],\\n seen = result;\\n\\n if (comparator) {\\n isCommon = false;\\n includes = arrayIncludesWith;\\n }\\n else if (length >= LARGE_ARRAY_SIZE) {\\n var set = iteratee ? null : createSet(array);\\n if (set) {\\n return setToArray(set);\\n }\\n isCommon = false;\\n includes = cacheHas;\\n seen = new SetCache;\\n }\\n else {\\n seen = iteratee ? [] : result;\\n }\\n outer:\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (isCommon && computed === computed) {\\n var seenIndex = seen.length;\\n while (seenIndex--) {\\n if (seen[seenIndex] === computed) {\\n continue outer;\\n }\\n }\\n if (iteratee) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n else if (!includes(seen, computed, comparator)) {\\n if (seen !== result) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.unset`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The property path to unset.\\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\\n */\\n function baseUnset(object, path) {\\n path = castPath(path, object);\\n object = parent(object, path);\\n return object == null || delete object[toKey(last(path))];\\n }\\n\\n /**\\n * The base implementation of `_.update`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to update.\\n * @param {Function} updater The function to produce the updated value.\\n * @param {Function} [customizer] The function to customize path creation.\\n * @returns {Object} Returns `object`.\\n */\\n function baseUpdate(object, path, updater, customizer) {\\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\\n }\\n\\n /**\\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\\n * without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to query.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function baseWhile(array, predicate, isDrop, fromRight) {\\n var length = array.length,\\n index = fromRight ? length : -1;\\n\\n while ((fromRight ? index-- : ++index < length) &&\\n predicate(array[index], index, array)) {}\\n\\n return isDrop\\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\\n }\\n\\n /**\\n * The base implementation of `wrapperValue` which returns the result of\\n * performing a sequence of actions on the unwrapped `value`, where each\\n * successive action is supplied the return value of the previous.\\n *\\n * @private\\n * @param {*} value The unwrapped value.\\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\\n * @returns {*} Returns the resolved value.\\n */\\n function baseWrapperValue(value, actions) {\\n var result = value;\\n if (result instanceof LazyWrapper) {\\n result = result.value();\\n }\\n return arrayReduce(actions, function(result, action) {\\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\\n }, result);\\n }\\n\\n /**\\n * The base implementation of methods like `_.xor`, without support for\\n * iteratee shorthands, that accepts an array of arrays to inspect.\\n *\\n * @private\\n * @param {Array} arrays The arrays to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of values.\\n */\\n function baseXor(arrays, iteratee, comparator) {\\n var length = arrays.length;\\n if (length < 2) {\\n return length ? baseUniq(arrays[0]) : [];\\n }\\n var index = -1,\\n result = Array(length);\\n\\n while (++index < length) {\\n var array = arrays[index],\\n othIndex = -1;\\n\\n while (++othIndex < length) {\\n if (othIndex != index) {\\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\\n }\\n }\\n }\\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\\n }\\n\\n /**\\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\\n *\\n * @private\\n * @param {Array} props The property identifiers.\\n * @param {Array} values The property values.\\n * @param {Function} assignFunc The function to assign values.\\n * @returns {Object} Returns the new object.\\n */\\n function baseZipObject(props, values, assignFunc) {\\n var index = -1,\\n length = props.length,\\n valsLength = values.length,\\n result = {};\\n\\n while (++index < length) {\\n var value = index < valsLength ? values[index] : undefined;\\n assignFunc(result, props[index], value);\\n }\\n return result;\\n }\\n\\n /**\\n * Casts `value` to an empty array if it's not an array like object.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {Array|Object} Returns the cast array-like object.\\n */\\n function castArrayLikeObject(value) {\\n return isArrayLikeObject(value) ? value : [];\\n }\\n\\n /**\\n * Casts `value` to `identity` if it's not a function.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {Function} Returns cast function.\\n */\\n function castFunction(value) {\\n return typeof value == 'function' ? value : identity;\\n }\\n\\n /**\\n * Casts `value` to a path array if it's not one.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @param {Object} [object] The object to query keys on.\\n * @returns {Array} Returns the cast property path array.\\n */\\n function castPath(value, object) {\\n if (isArray(value)) {\\n return value;\\n }\\n return isKey(value, object) ? [value] : stringToPath(toString(value));\\n }\\n\\n /**\\n * A `baseRest` alias which can be replaced with `identity` by module\\n * replacement plugins.\\n *\\n * @private\\n * @type {Function}\\n * @param {Function} func The function to apply a rest parameter to.\\n * @returns {Function} Returns the new function.\\n */\\n var castRest = baseRest;\\n\\n /**\\n * Casts `array` to a slice if it's needed.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {number} start The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the cast slice.\\n */\\n function castSlice(array, start, end) {\\n var length = array.length;\\n end = end === undefined ? length : end;\\n return (!start && end >= length) ? array : baseSlice(array, start, end);\\n }\\n\\n /**\\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\\n *\\n * @private\\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\\n */\\n var clearTimeout = ctxClearTimeout || function(id) {\\n return root.clearTimeout(id);\\n };\\n\\n /**\\n * Creates a clone of `buffer`.\\n *\\n * @private\\n * @param {Buffer} buffer The buffer to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Buffer} Returns the cloned buffer.\\n */\\n function cloneBuffer(buffer, isDeep) {\\n if (isDeep) {\\n return buffer.slice();\\n }\\n var length = buffer.length,\\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\\n\\n buffer.copy(result);\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `arrayBuffer`.\\n *\\n * @private\\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\\n * @returns {ArrayBuffer} Returns the cloned array buffer.\\n */\\n function cloneArrayBuffer(arrayBuffer) {\\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `dataView`.\\n *\\n * @private\\n * @param {Object} dataView The data view to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned data view.\\n */\\n function cloneDataView(dataView, isDeep) {\\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\\n }\\n\\n /**\\n * Creates a clone of `map`.\\n *\\n * @private\\n * @param {Object} map The map to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned map.\\n */\\n function cloneMap(map, isDeep, cloneFunc) {\\n var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map);\\n return arrayReduce(array, addMapEntry, new map.constructor);\\n }\\n\\n /**\\n * Creates a clone of `regexp`.\\n *\\n * @private\\n * @param {Object} regexp The regexp to clone.\\n * @returns {Object} Returns the cloned regexp.\\n */\\n function cloneRegExp(regexp) {\\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\\n result.lastIndex = regexp.lastIndex;\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `set`.\\n *\\n * @private\\n * @param {Object} set The set to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned set.\\n */\\n function cloneSet(set, isDeep, cloneFunc) {\\n var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set);\\n return arrayReduce(array, addSetEntry, new set.constructor);\\n }\\n\\n /**\\n * Creates a clone of the `symbol` object.\\n *\\n * @private\\n * @param {Object} symbol The symbol object to clone.\\n * @returns {Object} Returns the cloned symbol object.\\n */\\n function cloneSymbol(symbol) {\\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\\n }\\n\\n /**\\n * Creates a clone of `typedArray`.\\n *\\n * @private\\n * @param {Object} typedArray The typed array to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned typed array.\\n */\\n function cloneTypedArray(typedArray, isDeep) {\\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\\n }\\n\\n /**\\n * Compares values to sort them in ascending order.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {number} Returns the sort order indicator for `value`.\\n */\\n function compareAscending(value, other) {\\n if (value !== other) {\\n var valIsDefined = value !== undefined,\\n valIsNull = value === null,\\n valIsReflexive = value === value,\\n valIsSymbol = isSymbol(value);\\n\\n var othIsDefined = other !== undefined,\\n othIsNull = other === null,\\n othIsReflexive = other === other,\\n othIsSymbol = isSymbol(other);\\n\\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\\n (valIsNull && othIsDefined && othIsReflexive) ||\\n (!valIsDefined && othIsReflexive) ||\\n !valIsReflexive) {\\n return 1;\\n }\\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\\n (othIsNull && valIsDefined && valIsReflexive) ||\\n (!othIsDefined && valIsReflexive) ||\\n !othIsReflexive) {\\n return -1;\\n }\\n }\\n return 0;\\n }\\n\\n /**\\n * Used by `_.orderBy` to compare multiple properties of a value to another\\n * and stable sort them.\\n *\\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\\n * specify an order of \\\"desc\\\" for descending or \\\"asc\\\" for ascending sort order\\n * of corresponding values.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {boolean[]|string[]} orders The order to sort by for each property.\\n * @returns {number} Returns the sort order indicator for `object`.\\n */\\n function compareMultiple(object, other, orders) {\\n var index = -1,\\n objCriteria = object.criteria,\\n othCriteria = other.criteria,\\n length = objCriteria.length,\\n ordersLength = orders.length;\\n\\n while (++index < length) {\\n var result = compareAscending(objCriteria[index], othCriteria[index]);\\n if (result) {\\n if (index >= ordersLength) {\\n return result;\\n }\\n var order = orders[index];\\n return result * (order == 'desc' ? -1 : 1);\\n }\\n }\\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\\n // that causes it, under certain circumstances, to provide the same value for\\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\\n // for more details.\\n //\\n // This also ensures a stable sort in V8 and other engines.\\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\\n return object.index - other.index;\\n }\\n\\n /**\\n * Creates an array that is the composition of partially applied arguments,\\n * placeholders, and provided arguments into a single array of arguments.\\n *\\n * @private\\n * @param {Array} args The provided arguments.\\n * @param {Array} partials The arguments to prepend to those provided.\\n * @param {Array} holders The `partials` placeholder indexes.\\n * @params {boolean} [isCurried] Specify composing for a curried function.\\n * @returns {Array} Returns the new array of composed arguments.\\n */\\n function composeArgs(args, partials, holders, isCurried) {\\n var argsIndex = -1,\\n argsLength = args.length,\\n holdersLength = holders.length,\\n leftIndex = -1,\\n leftLength = partials.length,\\n rangeLength = nativeMax(argsLength - holdersLength, 0),\\n result = Array(leftLength + rangeLength),\\n isUncurried = !isCurried;\\n\\n while (++leftIndex < leftLength) {\\n result[leftIndex] = partials[leftIndex];\\n }\\n while (++argsIndex < holdersLength) {\\n if (isUncurried || argsIndex < argsLength) {\\n result[holders[argsIndex]] = args[argsIndex];\\n }\\n }\\n while (rangeLength--) {\\n result[leftIndex++] = args[argsIndex++];\\n }\\n return result;\\n }\\n\\n /**\\n * This function is like `composeArgs` except that the arguments composition\\n * is tailored for `_.partialRight`.\\n *\\n * @private\\n * @param {Array} args The provided arguments.\\n * @param {Array} partials The arguments to append to those provided.\\n * @param {Array} holders The `partials` placeholder indexes.\\n * @params {boolean} [isCurried] Specify composing for a curried function.\\n * @returns {Array} Returns the new array of composed arguments.\\n */\\n function composeArgsRight(args, partials, holders, isCurried) {\\n var argsIndex = -1,\\n argsLength = args.length,\\n holdersIndex = -1,\\n holdersLength = holders.length,\\n rightIndex = -1,\\n rightLength = partials.length,\\n rangeLength = nativeMax(argsLength - holdersLength, 0),\\n result = Array(rangeLength + rightLength),\\n isUncurried = !isCurried;\\n\\n while (++argsIndex < rangeLength) {\\n result[argsIndex] = args[argsIndex];\\n }\\n var offset = argsIndex;\\n while (++rightIndex < rightLength) {\\n result[offset + rightIndex] = partials[rightIndex];\\n }\\n while (++holdersIndex < holdersLength) {\\n if (isUncurried || argsIndex < argsLength) {\\n result[offset + holders[holdersIndex]] = args[argsIndex++];\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Copies the values of `source` to `array`.\\n *\\n * @private\\n * @param {Array} source The array to copy values from.\\n * @param {Array} [array=[]] The array to copy values to.\\n * @returns {Array} Returns `array`.\\n */\\n function copyArray(source, array) {\\n var index = -1,\\n length = source.length;\\n\\n array || (array = Array(length));\\n while (++index < length) {\\n array[index] = source[index];\\n }\\n return array;\\n }\\n\\n /**\\n * Copies properties of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy properties from.\\n * @param {Array} props The property identifiers to copy.\\n * @param {Object} [object={}] The object to copy properties to.\\n * @param {Function} [customizer] The function to customize copied values.\\n * @returns {Object} Returns `object`.\\n */\\n function copyObject(source, props, object, customizer) {\\n var isNew = !object;\\n object || (object = {});\\n\\n var index = -1,\\n length = props.length;\\n\\n while (++index < length) {\\n var key = props[index];\\n\\n var newValue = customizer\\n ? customizer(object[key], source[key], key, object, source)\\n : undefined;\\n\\n if (newValue === undefined) {\\n newValue = source[key];\\n }\\n if (isNew) {\\n baseAssignValue(object, key, newValue);\\n } else {\\n assignValue(object, key, newValue);\\n }\\n }\\n return object;\\n }\\n\\n /**\\n * Copies own symbols of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy symbols from.\\n * @param {Object} [object={}] The object to copy symbols to.\\n * @returns {Object} Returns `object`.\\n */\\n function copySymbols(source, object) {\\n return copyObject(source, getSymbols(source), object);\\n }\\n\\n /**\\n * Copies own and inherited symbols of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy symbols from.\\n * @param {Object} [object={}] The object to copy symbols to.\\n * @returns {Object} Returns `object`.\\n */\\n function copySymbolsIn(source, object) {\\n return copyObject(source, getSymbolsIn(source), object);\\n }\\n\\n /**\\n * Creates a function like `_.groupBy`.\\n *\\n * @private\\n * @param {Function} setter The function to set accumulator values.\\n * @param {Function} [initializer] The accumulator object initializer.\\n * @returns {Function} Returns the new aggregator function.\\n */\\n function createAggregator(setter, initializer) {\\n return function(collection, iteratee) {\\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\\n accumulator = initializer ? initializer() : {};\\n\\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\\n };\\n }\\n\\n /**\\n * Creates a function like `_.assign`.\\n *\\n * @private\\n * @param {Function} assigner The function to assign values.\\n * @returns {Function} Returns the new assigner function.\\n */\\n function createAssigner(assigner) {\\n return baseRest(function(object, sources) {\\n var index = -1,\\n length = sources.length,\\n customizer = length > 1 ? sources[length - 1] : undefined,\\n guard = length > 2 ? sources[2] : undefined;\\n\\n customizer = (assigner.length > 3 && typeof customizer == 'function')\\n ? (length--, customizer)\\n : undefined;\\n\\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\\n customizer = length < 3 ? undefined : customizer;\\n length = 1;\\n }\\n object = Object(object);\\n while (++index < length) {\\n var source = sources[index];\\n if (source) {\\n assigner(object, source, index, customizer);\\n }\\n }\\n return object;\\n });\\n }\\n\\n /**\\n * Creates a `baseEach` or `baseEachRight` function.\\n *\\n * @private\\n * @param {Function} eachFunc The function to iterate over a collection.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new base function.\\n */\\n function createBaseEach(eachFunc, fromRight) {\\n return function(collection, iteratee) {\\n if (collection == null) {\\n return collection;\\n }\\n if (!isArrayLike(collection)) {\\n return eachFunc(collection, iteratee);\\n }\\n var length = collection.length,\\n index = fromRight ? length : -1,\\n iterable = Object(collection);\\n\\n while ((fromRight ? index-- : ++index < length)) {\\n if (iteratee(iterable[index], index, iterable) === false) {\\n break;\\n }\\n }\\n return collection;\\n };\\n }\\n\\n /**\\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new base function.\\n */\\n function createBaseFor(fromRight) {\\n return function(object, iteratee, keysFunc) {\\n var index = -1,\\n iterable = Object(object),\\n props = keysFunc(object),\\n length = props.length;\\n\\n while (length--) {\\n var key = props[fromRight ? length : ++index];\\n if (iteratee(iterable[key], key, iterable) === false) {\\n break;\\n }\\n }\\n return object;\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with the optional `this`\\n * binding of `thisArg`.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createBind(func, bitmask, thisArg) {\\n var isBind = bitmask & WRAP_BIND_FLAG,\\n Ctor = createCtor(func);\\n\\n function wrapper() {\\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n return fn.apply(isBind ? thisArg : this, arguments);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a function like `_.lowerFirst`.\\n *\\n * @private\\n * @param {string} methodName The name of the `String` case method to use.\\n * @returns {Function} Returns the new case function.\\n */\\n function createCaseFirst(methodName) {\\n return function(string) {\\n string = toString(string);\\n\\n var strSymbols = hasUnicode(string)\\n ? stringToArray(string)\\n : undefined;\\n\\n var chr = strSymbols\\n ? strSymbols[0]\\n : string.charAt(0);\\n\\n var trailing = strSymbols\\n ? castSlice(strSymbols, 1).join('')\\n : string.slice(1);\\n\\n return chr[methodName]() + trailing;\\n };\\n }\\n\\n /**\\n * Creates a function like `_.camelCase`.\\n *\\n * @private\\n * @param {Function} callback The function to combine each word.\\n * @returns {Function} Returns the new compounder function.\\n */\\n function createCompounder(callback) {\\n return function(string) {\\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\\n };\\n }\\n\\n /**\\n * Creates a function that produces an instance of `Ctor` regardless of\\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\\n *\\n * @private\\n * @param {Function} Ctor The constructor to wrap.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createCtor(Ctor) {\\n return function() {\\n // Use a `switch` statement to work with class constructors. See\\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\\n // for more details.\\n var args = arguments;\\n switch (args.length) {\\n case 0: return new Ctor;\\n case 1: return new Ctor(args[0]);\\n case 2: return new Ctor(args[0], args[1]);\\n case 3: return new Ctor(args[0], args[1], args[2]);\\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\\n }\\n var thisBinding = baseCreate(Ctor.prototype),\\n result = Ctor.apply(thisBinding, args);\\n\\n // Mimic the constructor's `return` behavior.\\n // See https://es5.github.io/#x13.2.2 for more details.\\n return isObject(result) ? result : thisBinding;\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to enable currying.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {number} arity The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createCurry(func, bitmask, arity) {\\n var Ctor = createCtor(func);\\n\\n function wrapper() {\\n var length = arguments.length,\\n args = Array(length),\\n index = length,\\n placeholder = getHolder(wrapper);\\n\\n while (index--) {\\n args[index] = arguments[index];\\n }\\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\\n ? []\\n : replaceHolders(args, placeholder);\\n\\n length -= holders.length;\\n if (length < arity) {\\n return createRecurry(\\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\\n args, holders, undefined, undefined, arity - length);\\n }\\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n return apply(fn, this, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a `_.find` or `_.findLast` function.\\n *\\n * @private\\n * @param {Function} findIndexFunc The function to find the collection index.\\n * @returns {Function} Returns the new find function.\\n */\\n function createFind(findIndexFunc) {\\n return function(collection, predicate, fromIndex) {\\n var iterable = Object(collection);\\n if (!isArrayLike(collection)) {\\n var iteratee = getIteratee(predicate, 3);\\n collection = keys(collection);\\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\\n }\\n var index = findIndexFunc(collection, predicate, fromIndex);\\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\\n };\\n }\\n\\n /**\\n * Creates a `_.flow` or `_.flowRight` function.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new flow function.\\n */\\n function createFlow(fromRight) {\\n return flatRest(function(funcs) {\\n var length = funcs.length,\\n index = length,\\n prereq = LodashWrapper.prototype.thru;\\n\\n if (fromRight) {\\n funcs.reverse();\\n }\\n while (index--) {\\n var func = funcs[index];\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\\n var wrapper = new LodashWrapper([], true);\\n }\\n }\\n index = wrapper ? index : length;\\n while (++index < length) {\\n func = funcs[index];\\n\\n var funcName = getFuncName(func),\\n data = funcName == 'wrapper' ? getData(func) : undefined;\\n\\n if (data && isLaziable(data[0]) &&\\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\\n !data[4].length && data[9] == 1\\n ) {\\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\\n } else {\\n wrapper = (func.length == 1 && isLaziable(func))\\n ? wrapper[funcName]()\\n : wrapper.thru(func);\\n }\\n }\\n return function() {\\n var args = arguments,\\n value = args[0];\\n\\n if (wrapper && args.length == 1 && isArray(value)) {\\n return wrapper.plant(value).value();\\n }\\n var index = 0,\\n result = length ? funcs[index].apply(this, args) : value;\\n\\n while (++index < length) {\\n result = funcs[index].call(this, result);\\n }\\n return result;\\n };\\n });\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with optional `this`\\n * binding of `thisArg`, partial application, and currying.\\n *\\n * @private\\n * @param {Function|string} func The function or method name to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to prepend to those provided to\\n * the new function.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [partialsRight] The arguments to append to those provided\\n * to the new function.\\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\\n var isAry = bitmask & WRAP_ARY_FLAG,\\n isBind = bitmask & WRAP_BIND_FLAG,\\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\\n isFlip = bitmask & WRAP_FLIP_FLAG,\\n Ctor = isBindKey ? undefined : createCtor(func);\\n\\n function wrapper() {\\n var length = arguments.length,\\n args = Array(length),\\n index = length;\\n\\n while (index--) {\\n args[index] = arguments[index];\\n }\\n if (isCurried) {\\n var placeholder = getHolder(wrapper),\\n holdersCount = countHolders(args, placeholder);\\n }\\n if (partials) {\\n args = composeArgs(args, partials, holders, isCurried);\\n }\\n if (partialsRight) {\\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\\n }\\n length -= holdersCount;\\n if (isCurried && length < arity) {\\n var newHolders = replaceHolders(args, placeholder);\\n return createRecurry(\\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\\n args, newHolders, argPos, ary, arity - length\\n );\\n }\\n var thisBinding = isBind ? thisArg : this,\\n fn = isBindKey ? thisBinding[func] : func;\\n\\n length = args.length;\\n if (argPos) {\\n args = reorder(args, argPos);\\n } else if (isFlip && length > 1) {\\n args.reverse();\\n }\\n if (isAry && ary < length) {\\n args.length = ary;\\n }\\n if (this && this !== root && this instanceof wrapper) {\\n fn = Ctor || createCtor(fn);\\n }\\n return fn.apply(thisBinding, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a function like `_.invertBy`.\\n *\\n * @private\\n * @param {Function} setter The function to set accumulator values.\\n * @param {Function} toIteratee The function to resolve iteratees.\\n * @returns {Function} Returns the new inverter function.\\n */\\n function createInverter(setter, toIteratee) {\\n return function(object, iteratee) {\\n return baseInverter(object, setter, toIteratee(iteratee), {});\\n };\\n }\\n\\n /**\\n * Creates a function that performs a mathematical operation on two values.\\n *\\n * @private\\n * @param {Function} operator The function to perform the operation.\\n * @param {number} [defaultValue] The value used for `undefined` arguments.\\n * @returns {Function} Returns the new mathematical operation function.\\n */\\n function createMathOperation(operator, defaultValue) {\\n return function(value, other) {\\n var result;\\n if (value === undefined && other === undefined) {\\n return defaultValue;\\n }\\n if (value !== undefined) {\\n result = value;\\n }\\n if (other !== undefined) {\\n if (result === undefined) {\\n return other;\\n }\\n if (typeof value == 'string' || typeof other == 'string') {\\n value = baseToString(value);\\n other = baseToString(other);\\n } else {\\n value = baseToNumber(value);\\n other = baseToNumber(other);\\n }\\n result = operator(value, other);\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Creates a function like `_.over`.\\n *\\n * @private\\n * @param {Function} arrayFunc The function to iterate over iteratees.\\n * @returns {Function} Returns the new over function.\\n */\\n function createOver(arrayFunc) {\\n return flatRest(function(iteratees) {\\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\\n return baseRest(function(args) {\\n var thisArg = this;\\n return arrayFunc(iteratees, function(iteratee) {\\n return apply(iteratee, thisArg, args);\\n });\\n });\\n });\\n }\\n\\n /**\\n * Creates the padding for `string` based on `length`. The `chars` string\\n * is truncated if the number of characters exceeds `length`.\\n *\\n * @private\\n * @param {number} length The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padding for `string`.\\n */\\n function createPadding(length, chars) {\\n chars = chars === undefined ? ' ' : baseToString(chars);\\n\\n var charsLength = chars.length;\\n if (charsLength < 2) {\\n return charsLength ? baseRepeat(chars, length) : chars;\\n }\\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\\n return hasUnicode(chars)\\n ? castSlice(stringToArray(result), 0, length).join('')\\n : result.slice(0, length);\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with the `this` binding\\n * of `thisArg` and `partials` prepended to the arguments it receives.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {Array} partials The arguments to prepend to those provided to\\n * the new function.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createPartial(func, bitmask, thisArg, partials) {\\n var isBind = bitmask & WRAP_BIND_FLAG,\\n Ctor = createCtor(func);\\n\\n function wrapper() {\\n var argsIndex = -1,\\n argsLength = arguments.length,\\n leftIndex = -1,\\n leftLength = partials.length,\\n args = Array(leftLength + argsLength),\\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n\\n while (++leftIndex < leftLength) {\\n args[leftIndex] = partials[leftIndex];\\n }\\n while (argsLength--) {\\n args[leftIndex++] = arguments[++argsIndex];\\n }\\n return apply(fn, isBind ? thisArg : this, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a `_.range` or `_.rangeRight` function.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new range function.\\n */\\n function createRange(fromRight) {\\n return function(start, end, step) {\\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\\n end = step = undefined;\\n }\\n // Ensure the sign of `-0` is preserved.\\n start = toFinite(start);\\n if (end === undefined) {\\n end = start;\\n start = 0;\\n } else {\\n end = toFinite(end);\\n }\\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\\n return baseRange(start, end, step, fromRight);\\n };\\n }\\n\\n /**\\n * Creates a function that performs a relational operation on two values.\\n *\\n * @private\\n * @param {Function} operator The function to perform the operation.\\n * @returns {Function} Returns the new relational operation function.\\n */\\n function createRelationalOperation(operator) {\\n return function(value, other) {\\n if (!(typeof value == 'string' && typeof other == 'string')) {\\n value = toNumber(value);\\n other = toNumber(other);\\n }\\n return operator(value, other);\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to continue currying.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {Function} wrapFunc The function to create the `func` wrapper.\\n * @param {*} placeholder The placeholder value.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to prepend to those provided to\\n * the new function.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\\n var isCurry = bitmask & WRAP_CURRY_FLAG,\\n newHolders = isCurry ? holders : undefined,\\n newHoldersRight = isCurry ? undefined : holders,\\n newPartials = isCurry ? partials : undefined,\\n newPartialsRight = isCurry ? undefined : partials;\\n\\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\\n\\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\\n }\\n var newData = [\\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\\n newHoldersRight, argPos, ary, arity\\n ];\\n\\n var result = wrapFunc.apply(undefined, newData);\\n if (isLaziable(func)) {\\n setData(result, newData);\\n }\\n result.placeholder = placeholder;\\n return setWrapToString(result, func, bitmask);\\n }\\n\\n /**\\n * Creates a function like `_.round`.\\n *\\n * @private\\n * @param {string} methodName The name of the `Math` method to use when rounding.\\n * @returns {Function} Returns the new round function.\\n */\\n function createRound(methodName) {\\n var func = Math[methodName];\\n return function(number, precision) {\\n number = toNumber(number);\\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\\n if (precision) {\\n // Shift with exponential notation to avoid floating-point issues.\\n // See [MDN](https://mdn.io/round#Examples) for more details.\\n var pair = (toString(number) + 'e').split('e'),\\n value = func(pair[0] + 'e' + (+pair[1] + precision));\\n\\n pair = (toString(value) + 'e').split('e');\\n return +(pair[0] + 'e' + (+pair[1] - precision));\\n }\\n return func(number);\\n };\\n }\\n\\n /**\\n * Creates a set object of `values`.\\n *\\n * @private\\n * @param {Array} values The values to add to the set.\\n * @returns {Object} Returns the new set.\\n */\\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\\n return new Set(values);\\n };\\n\\n /**\\n * Creates a `_.toPairs` or `_.toPairsIn` function.\\n *\\n * @private\\n * @param {Function} keysFunc The function to get the keys of a given object.\\n * @returns {Function} Returns the new pairs function.\\n */\\n function createToPairs(keysFunc) {\\n return function(object) {\\n var tag = getTag(object);\\n if (tag == mapTag) {\\n return mapToArray(object);\\n }\\n if (tag == setTag) {\\n return setToPairs(object);\\n }\\n return baseToPairs(object, keysFunc(object));\\n };\\n }\\n\\n /**\\n * Creates a function that either curries or invokes `func` with optional\\n * `this` binding and partially applied arguments.\\n *\\n * @private\\n * @param {Function|string} func The function or method name to wrap.\\n * @param {number} bitmask The bitmask flags.\\n * 1 - `_.bind`\\n * 2 - `_.bindKey`\\n * 4 - `_.curry` or `_.curryRight` of a bound function\\n * 8 - `_.curry`\\n * 16 - `_.curryRight`\\n * 32 - `_.partial`\\n * 64 - `_.partialRight`\\n * 128 - `_.rearg`\\n * 256 - `_.ary`\\n * 512 - `_.flip`\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to be partially applied.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\\n if (!isBindKey && typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n var length = partials ? partials.length : 0;\\n if (!length) {\\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\\n partials = holders = undefined;\\n }\\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\\n arity = arity === undefined ? arity : toInteger(arity);\\n length -= holders ? holders.length : 0;\\n\\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\\n var partialsRight = partials,\\n holdersRight = holders;\\n\\n partials = holders = undefined;\\n }\\n var data = isBindKey ? undefined : getData(func);\\n\\n var newData = [\\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\\n argPos, ary, arity\\n ];\\n\\n if (data) {\\n mergeData(newData, data);\\n }\\n func = newData[0];\\n bitmask = newData[1];\\n thisArg = newData[2];\\n partials = newData[3];\\n holders = newData[4];\\n arity = newData[9] = newData[9] === undefined\\n ? (isBindKey ? 0 : func.length)\\n : nativeMax(newData[9] - length, 0);\\n\\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\\n }\\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\\n var result = createBind(func, bitmask, thisArg);\\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\\n result = createCurry(func, bitmask, arity);\\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\\n result = createPartial(func, bitmask, thisArg, partials);\\n } else {\\n result = createHybrid.apply(undefined, newData);\\n }\\n var setter = data ? baseSetData : setData;\\n return setWrapToString(setter(result, newData), func, bitmask);\\n }\\n\\n /**\\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\\n * of source objects to the destination object for all destination properties\\n * that resolve to `undefined`.\\n *\\n * @private\\n * @param {*} objValue The destination value.\\n * @param {*} srcValue The source value.\\n * @param {string} key The key of the property to assign.\\n * @param {Object} object The parent object of `objValue`.\\n * @returns {*} Returns the value to assign.\\n */\\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\\n if (objValue === undefined ||\\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\\n return srcValue;\\n }\\n return objValue;\\n }\\n\\n /**\\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\\n * objects into destination objects that are passed thru.\\n *\\n * @private\\n * @param {*} objValue The destination value.\\n * @param {*} srcValue The source value.\\n * @param {string} key The key of the property to merge.\\n * @param {Object} object The parent object of `objValue`.\\n * @param {Object} source The parent object of `srcValue`.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n * @returns {*} Returns the value to assign.\\n */\\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\\n if (isObject(objValue) && isObject(srcValue)) {\\n // Recursively merge objects and arrays (susceptible to call stack limits).\\n stack.set(srcValue, objValue);\\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\\n stack['delete'](srcValue);\\n }\\n return objValue;\\n }\\n\\n /**\\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\\n * objects.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @param {string} key The key of the property to inspect.\\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\\n */\\n function customOmitClone(value) {\\n return isPlainObject(value) ? undefined : value;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for arrays with support for\\n * partial deep comparisons.\\n *\\n * @private\\n * @param {Array} array The array to compare.\\n * @param {Array} other The other array to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `array` and `other` objects.\\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\\n */\\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\\n arrLength = array.length,\\n othLength = other.length;\\n\\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\\n return false;\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(array);\\n if (stacked && stack.get(other)) {\\n return stacked == other;\\n }\\n var index = -1,\\n result = true,\\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\\n\\n stack.set(array, other);\\n stack.set(other, array);\\n\\n // Ignore non-index properties.\\n while (++index < arrLength) {\\n var arrValue = array[index],\\n othValue = other[index];\\n\\n if (customizer) {\\n var compared = isPartial\\n ? customizer(othValue, arrValue, index, other, array, stack)\\n : customizer(arrValue, othValue, index, array, other, stack);\\n }\\n if (compared !== undefined) {\\n if (compared) {\\n continue;\\n }\\n result = false;\\n break;\\n }\\n // Recursively compare arrays (susceptible to call stack limits).\\n if (seen) {\\n if (!arraySome(other, function(othValue, othIndex) {\\n if (!cacheHas(seen, othIndex) &&\\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\\n return seen.push(othIndex);\\n }\\n })) {\\n result = false;\\n break;\\n }\\n } else if (!(\\n arrValue === othValue ||\\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\\n )) {\\n result = false;\\n break;\\n }\\n }\\n stack['delete'](array);\\n stack['delete'](other);\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for comparing objects of\\n * the same `toStringTag`.\\n *\\n * **Note:** This function only supports comparing values with tags of\\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {string} tag The `toStringTag` of the objects to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\\n switch (tag) {\\n case dataViewTag:\\n if ((object.byteLength != other.byteLength) ||\\n (object.byteOffset != other.byteOffset)) {\\n return false;\\n }\\n object = object.buffer;\\n other = other.buffer;\\n\\n case arrayBufferTag:\\n if ((object.byteLength != other.byteLength) ||\\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\\n return false;\\n }\\n return true;\\n\\n case boolTag:\\n case dateTag:\\n case numberTag:\\n // Coerce booleans to `1` or `0` and dates to milliseconds.\\n // Invalid dates are coerced to `NaN`.\\n return eq(+object, +other);\\n\\n case errorTag:\\n return object.name == other.name && object.message == other.message;\\n\\n case regexpTag:\\n case stringTag:\\n // Coerce regexes to strings and treat strings, primitives and objects,\\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\\n // for more details.\\n return object == (other + '');\\n\\n case mapTag:\\n var convert = mapToArray;\\n\\n case setTag:\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\\n convert || (convert = setToArray);\\n\\n if (object.size != other.size && !isPartial) {\\n return false;\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(object);\\n if (stacked) {\\n return stacked == other;\\n }\\n bitmask |= COMPARE_UNORDERED_FLAG;\\n\\n // Recursively compare objects (susceptible to call stack limits).\\n stack.set(object, other);\\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\\n stack['delete'](object);\\n return result;\\n\\n case symbolTag:\\n if (symbolValueOf) {\\n return symbolValueOf.call(object) == symbolValueOf.call(other);\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for objects with support for\\n * partial deep comparisons.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\\n objProps = getAllKeys(object),\\n objLength = objProps.length,\\n othProps = getAllKeys(other),\\n othLength = othProps.length;\\n\\n if (objLength != othLength && !isPartial) {\\n return false;\\n }\\n var index = objLength;\\n while (index--) {\\n var key = objProps[index];\\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\\n return false;\\n }\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(object);\\n if (stacked && stack.get(other)) {\\n return stacked == other;\\n }\\n var result = true;\\n stack.set(object, other);\\n stack.set(other, object);\\n\\n var skipCtor = isPartial;\\n while (++index < objLength) {\\n key = objProps[index];\\n var objValue = object[key],\\n othValue = other[key];\\n\\n if (customizer) {\\n var compared = isPartial\\n ? customizer(othValue, objValue, key, other, object, stack)\\n : customizer(objValue, othValue, key, object, other, stack);\\n }\\n // Recursively compare objects (susceptible to call stack limits).\\n if (!(compared === undefined\\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\\n : compared\\n )) {\\n result = false;\\n break;\\n }\\n skipCtor || (skipCtor = key == 'constructor');\\n }\\n if (result && !skipCtor) {\\n var objCtor = object.constructor,\\n othCtor = other.constructor;\\n\\n // Non `Object` object instances with different constructors are not equal.\\n if (objCtor != othCtor &&\\n ('constructor' in object && 'constructor' in other) &&\\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\\n result = false;\\n }\\n }\\n stack['delete'](object);\\n stack['delete'](other);\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseRest` which flattens the rest array.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @returns {Function} Returns the new function.\\n */\\n function flatRest(func) {\\n return setToString(overRest(func, undefined, flatten), func + '');\\n }\\n\\n /**\\n * Creates an array of own enumerable property names and symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function getAllKeys(object) {\\n return baseGetAllKeys(object, keys, getSymbols);\\n }\\n\\n /**\\n * Creates an array of own and inherited enumerable property names and\\n * symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function getAllKeysIn(object) {\\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\\n }\\n\\n /**\\n * Gets metadata for `func`.\\n *\\n * @private\\n * @param {Function} func The function to query.\\n * @returns {*} Returns the metadata for `func`.\\n */\\n var getData = !metaMap ? noop : function(func) {\\n return metaMap.get(func);\\n };\\n\\n /**\\n * Gets the name of `func`.\\n *\\n * @private\\n * @param {Function} func The function to query.\\n * @returns {string} Returns the function name.\\n */\\n function getFuncName(func) {\\n var result = (func.name + ''),\\n array = realNames[result],\\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\\n\\n while (length--) {\\n var data = array[length],\\n otherFunc = data.func;\\n if (otherFunc == null || otherFunc == func) {\\n return data.name;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the argument placeholder value for `func`.\\n *\\n * @private\\n * @param {Function} func The function to inspect.\\n * @returns {*} Returns the placeholder value.\\n */\\n function getHolder(func) {\\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\\n return object.placeholder;\\n }\\n\\n /**\\n * Gets the appropriate \\\"iteratee\\\" function. If `_.iteratee` is customized,\\n * this function returns the custom method, otherwise it returns `baseIteratee`.\\n * If arguments are provided, the chosen function is invoked with them and\\n * its result is returned.\\n *\\n * @private\\n * @param {*} [value] The value to convert to an iteratee.\\n * @param {number} [arity] The arity of the created iteratee.\\n * @returns {Function} Returns the chosen function or its result.\\n */\\n function getIteratee() {\\n var result = lodash.iteratee || iteratee;\\n result = result === iteratee ? baseIteratee : result;\\n return arguments.length ? result(arguments[0], arguments[1]) : result;\\n }\\n\\n /**\\n * Gets the data for `map`.\\n *\\n * @private\\n * @param {Object} map The map to query.\\n * @param {string} key The reference key.\\n * @returns {*} Returns the map data.\\n */\\n function getMapData(map, key) {\\n var data = map.__data__;\\n return isKeyable(key)\\n ? data[typeof key == 'string' ? 'string' : 'hash']\\n : data.map;\\n }\\n\\n /**\\n * Gets the property names, values, and compare flags of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the match data of `object`.\\n */\\n function getMatchData(object) {\\n var result = keys(object),\\n length = result.length;\\n\\n while (length--) {\\n var key = result[length],\\n value = object[key];\\n\\n result[length] = [key, value, isStrictComparable(value)];\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the native function at `key` of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {string} key The key of the method to get.\\n * @returns {*} Returns the function if it's native, else `undefined`.\\n */\\n function getNative(object, key) {\\n var value = getValue(object, key);\\n return baseIsNative(value) ? value : undefined;\\n }\\n\\n /**\\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the raw `toStringTag`.\\n */\\n function getRawTag(value) {\\n var isOwn = hasOwnProperty.call(value, symToStringTag),\\n tag = value[symToStringTag];\\n\\n try {\\n value[symToStringTag] = undefined;\\n var unmasked = true;\\n } catch (e) {}\\n\\n var result = nativeObjectToString.call(value);\\n if (unmasked) {\\n if (isOwn) {\\n value[symToStringTag] = tag;\\n } else {\\n delete value[symToStringTag];\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Creates an array of the own enumerable symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of symbols.\\n */\\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\\n if (object == null) {\\n return [];\\n }\\n object = Object(object);\\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\\n return propertyIsEnumerable.call(object, symbol);\\n });\\n };\\n\\n /**\\n * Creates an array of the own and inherited enumerable symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of symbols.\\n */\\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\\n var result = [];\\n while (object) {\\n arrayPush(result, getSymbols(object));\\n object = getPrototype(object);\\n }\\n return result;\\n };\\n\\n /**\\n * Gets the `toStringTag` of `value`.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the `toStringTag`.\\n */\\n var getTag = baseGetTag;\\n\\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\\n (Map && getTag(new Map) != mapTag) ||\\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\\n (Set && getTag(new Set) != setTag) ||\\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\\n getTag = function(value) {\\n var result = baseGetTag(value),\\n Ctor = result == objectTag ? value.constructor : undefined,\\n ctorString = Ctor ? toSource(Ctor) : '';\\n\\n if (ctorString) {\\n switch (ctorString) {\\n case dataViewCtorString: return dataViewTag;\\n case mapCtorString: return mapTag;\\n case promiseCtorString: return promiseTag;\\n case setCtorString: return setTag;\\n case weakMapCtorString: return weakMapTag;\\n }\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\\n *\\n * @private\\n * @param {number} start The start of the view.\\n * @param {number} end The end of the view.\\n * @param {Array} transforms The transformations to apply to the view.\\n * @returns {Object} Returns an object containing the `start` and `end`\\n * positions of the view.\\n */\\n function getView(start, end, transforms) {\\n var index = -1,\\n length = transforms.length;\\n\\n while (++index < length) {\\n var data = transforms[index],\\n size = data.size;\\n\\n switch (data.type) {\\n case 'drop': start += size; break;\\n case 'dropRight': end -= size; break;\\n case 'take': end = nativeMin(end, start + size); break;\\n case 'takeRight': start = nativeMax(start, end - size); break;\\n }\\n }\\n return { 'start': start, 'end': end };\\n }\\n\\n /**\\n * Extracts wrapper details from the `source` body comment.\\n *\\n * @private\\n * @param {string} source The source to inspect.\\n * @returns {Array} Returns the wrapper details.\\n */\\n function getWrapDetails(source) {\\n var match = source.match(reWrapDetails);\\n return match ? match[1].split(reSplitDetails) : [];\\n }\\n\\n /**\\n * Checks if `path` exists on `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @param {Function} hasFunc The function to check properties.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n */\\n function hasPath(object, path, hasFunc) {\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length,\\n result = false;\\n\\n while (++index < length) {\\n var key = toKey(path[index]);\\n if (!(result = object != null && hasFunc(object, key))) {\\n break;\\n }\\n object = object[key];\\n }\\n if (result || ++index != length) {\\n return result;\\n }\\n length = object == null ? 0 : object.length;\\n return !!length && isLength(length) && isIndex(key, length) &&\\n (isArray(object) || isArguments(object));\\n }\\n\\n /**\\n * Initializes an array clone.\\n *\\n * @private\\n * @param {Array} array The array to clone.\\n * @returns {Array} Returns the initialized clone.\\n */\\n function initCloneArray(array) {\\n var length = array.length,\\n result = array.constructor(length);\\n\\n // Add properties assigned by `RegExp#exec`.\\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\\n result.index = array.index;\\n result.input = array.input;\\n }\\n return result;\\n }\\n\\n /**\\n * Initializes an object clone.\\n *\\n * @private\\n * @param {Object} object The object to clone.\\n * @returns {Object} Returns the initialized clone.\\n */\\n function initCloneObject(object) {\\n return (typeof object.constructor == 'function' && !isPrototype(object))\\n ? baseCreate(getPrototype(object))\\n : {};\\n }\\n\\n /**\\n * Initializes an object clone based on its `toStringTag`.\\n *\\n * **Note:** This function only supports cloning values with tags of\\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\\n *\\n * @private\\n * @param {Object} object The object to clone.\\n * @param {string} tag The `toStringTag` of the object to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the initialized clone.\\n */\\n function initCloneByTag(object, tag, cloneFunc, isDeep) {\\n var Ctor = object.constructor;\\n switch (tag) {\\n case arrayBufferTag:\\n return cloneArrayBuffer(object);\\n\\n case boolTag:\\n case dateTag:\\n return new Ctor(+object);\\n\\n case dataViewTag:\\n return cloneDataView(object, isDeep);\\n\\n case float32Tag: case float64Tag:\\n case int8Tag: case int16Tag: case int32Tag:\\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\\n return cloneTypedArray(object, isDeep);\\n\\n case mapTag:\\n return cloneMap(object, isDeep, cloneFunc);\\n\\n case numberTag:\\n case stringTag:\\n return new Ctor(object);\\n\\n case regexpTag:\\n return cloneRegExp(object);\\n\\n case setTag:\\n return cloneSet(object, isDeep, cloneFunc);\\n\\n case symbolTag:\\n return cloneSymbol(object);\\n }\\n }\\n\\n /**\\n * Inserts wrapper `details` in a comment at the top of the `source` body.\\n *\\n * @private\\n * @param {string} source The source to modify.\\n * @returns {Array} details The details to insert.\\n * @returns {string} Returns the modified source.\\n */\\n function insertWrapDetails(source, details) {\\n var length = details.length;\\n if (!length) {\\n return source;\\n }\\n var lastIndex = length - 1;\\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\\n details = details.join(length > 2 ? ', ' : ' ');\\n return source.replace(reWrapComment, '{\\\\n/* [wrapped with ' + details + '] */\\\\n');\\n }\\n\\n /**\\n * Checks if `value` is a flattenable `arguments` object or array.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\\n */\\n function isFlattenable(value) {\\n return isArray(value) || isArguments(value) ||\\n !!(spreadableSymbol && value && value[spreadableSymbol]);\\n }\\n\\n /**\\n * Checks if `value` is a valid array-like index.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\\n */\\n function isIndex(value, length) {\\n length = length == null ? MAX_SAFE_INTEGER : length;\\n return !!length &&\\n (typeof value == 'number' || reIsUint.test(value)) &&\\n (value > -1 && value % 1 == 0 && value < length);\\n }\\n\\n /**\\n * Checks if the given arguments are from an iteratee call.\\n *\\n * @private\\n * @param {*} value The potential iteratee value argument.\\n * @param {*} index The potential iteratee index or key argument.\\n * @param {*} object The potential iteratee object argument.\\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\\n * else `false`.\\n */\\n function isIterateeCall(value, index, object) {\\n if (!isObject(object)) {\\n return false;\\n }\\n var type = typeof index;\\n if (type == 'number'\\n ? (isArrayLike(object) && isIndex(index, object.length))\\n : (type == 'string' && index in object)\\n ) {\\n return eq(object[index], value);\\n }\\n return false;\\n }\\n\\n /**\\n * Checks if `value` is a property name and not a property path.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @param {Object} [object] The object to query keys on.\\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\\n */\\n function isKey(value, object) {\\n if (isArray(value)) {\\n return false;\\n }\\n var type = typeof value;\\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\\n value == null || isSymbol(value)) {\\n return true;\\n }\\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\\n (object != null && value in Object(object));\\n }\\n\\n /**\\n * Checks if `value` is suitable for use as unique object key.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\\n */\\n function isKeyable(value) {\\n var type = typeof value;\\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\\n ? (value !== '__proto__')\\n : (value === null);\\n }\\n\\n /**\\n * Checks if `func` has a lazy counterpart.\\n *\\n * @private\\n * @param {Function} func The function to check.\\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\\n * else `false`.\\n */\\n function isLaziable(func) {\\n var funcName = getFuncName(func),\\n other = lodash[funcName];\\n\\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\\n return false;\\n }\\n if (func === other) {\\n return true;\\n }\\n var data = getData(other);\\n return !!data && func === data[0];\\n }\\n\\n /**\\n * Checks if `func` has its source masked.\\n *\\n * @private\\n * @param {Function} func The function to check.\\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\\n */\\n function isMasked(func) {\\n return !!maskSrcKey && (maskSrcKey in func);\\n }\\n\\n /**\\n * Checks if `func` is capable of being masked.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\\n */\\n var isMaskable = coreJsData ? isFunction : stubFalse;\\n\\n /**\\n * Checks if `value` is likely a prototype object.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\\n */\\n function isPrototype(value) {\\n var Ctor = value && value.constructor,\\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\\n\\n return value === proto;\\n }\\n\\n /**\\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` if suitable for strict\\n * equality comparisons, else `false`.\\n */\\n function isStrictComparable(value) {\\n return value === value && !isObject(value);\\n }\\n\\n /**\\n * A specialized version of `matchesProperty` for source values suitable\\n * for strict equality comparisons, i.e. `===`.\\n *\\n * @private\\n * @param {string} key The key of the property to get.\\n * @param {*} srcValue The value to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function matchesStrictComparable(key, srcValue) {\\n return function(object) {\\n if (object == null) {\\n return false;\\n }\\n return object[key] === srcValue &&\\n (srcValue !== undefined || (key in Object(object)));\\n };\\n }\\n\\n /**\\n * A specialized version of `_.memoize` which clears the memoized function's\\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\\n *\\n * @private\\n * @param {Function} func The function to have its output memoized.\\n * @returns {Function} Returns the new memoized function.\\n */\\n function memoizeCapped(func) {\\n var result = memoize(func, function(key) {\\n if (cache.size === MAX_MEMOIZE_SIZE) {\\n cache.clear();\\n }\\n return key;\\n });\\n\\n var cache = result.cache;\\n return result;\\n }\\n\\n /**\\n * Merges the function metadata of `source` into `data`.\\n *\\n * Merging metadata reduces the number of wrappers used to invoke a function.\\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\\n * may be applied regardless of execution order. Methods like `_.ary` and\\n * `_.rearg` modify function arguments, making the order in which they are\\n * executed important, preventing the merging of metadata. However, we make\\n * an exception for a safe combined case where curried functions have `_.ary`\\n * and or `_.rearg` applied.\\n *\\n * @private\\n * @param {Array} data The destination metadata.\\n * @param {Array} source The source metadata.\\n * @returns {Array} Returns `data`.\\n */\\n function mergeData(data, source) {\\n var bitmask = data[1],\\n srcBitmask = source[1],\\n newBitmask = bitmask | srcBitmask,\\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\\n\\n var isCombo =\\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\\n\\n // Exit early if metadata can't be merged.\\n if (!(isCommon || isCombo)) {\\n return data;\\n }\\n // Use source `thisArg` if available.\\n if (srcBitmask & WRAP_BIND_FLAG) {\\n data[2] = source[2];\\n // Set when currying a bound function.\\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\\n }\\n // Compose partial arguments.\\n var value = source[3];\\n if (value) {\\n var partials = data[3];\\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\\n }\\n // Compose partial right arguments.\\n value = source[5];\\n if (value) {\\n partials = data[5];\\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\\n }\\n // Use source `argPos` if available.\\n value = source[7];\\n if (value) {\\n data[7] = value;\\n }\\n // Use source `ary` if it's smaller.\\n if (srcBitmask & WRAP_ARY_FLAG) {\\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\\n }\\n // Use source `arity` if one is not provided.\\n if (data[9] == null) {\\n data[9] = source[9];\\n }\\n // Use source `func` and merge bitmasks.\\n data[0] = source[0];\\n data[1] = newBitmask;\\n\\n return data;\\n }\\n\\n /**\\n * This function is like\\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\\n * except that it includes inherited enumerable properties.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function nativeKeysIn(object) {\\n var result = [];\\n if (object != null) {\\n for (var key in Object(object)) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `value` to a string using `Object.prototype.toString`.\\n *\\n * @private\\n * @param {*} value The value to convert.\\n * @returns {string} Returns the converted string.\\n */\\n function objectToString(value) {\\n return nativeObjectToString.call(value);\\n }\\n\\n /**\\n * A specialized version of `baseRest` which transforms the rest array.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @param {Function} transform The rest array transform.\\n * @returns {Function} Returns the new function.\\n */\\n function overRest(func, start, transform) {\\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\\n return function() {\\n var args = arguments,\\n index = -1,\\n length = nativeMax(args.length - start, 0),\\n array = Array(length);\\n\\n while (++index < length) {\\n array[index] = args[start + index];\\n }\\n index = -1;\\n var otherArgs = Array(start + 1);\\n while (++index < start) {\\n otherArgs[index] = args[index];\\n }\\n otherArgs[start] = transform(array);\\n return apply(func, this, otherArgs);\\n };\\n }\\n\\n /**\\n * Gets the parent value at `path` of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} path The path to get the parent value of.\\n * @returns {*} Returns the parent value.\\n */\\n function parent(object, path) {\\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\\n }\\n\\n /**\\n * Reorder `array` according to the specified indexes where the element at\\n * the first index is assigned as the first element, the element at\\n * the second index is assigned as the second element, and so on.\\n *\\n * @private\\n * @param {Array} array The array to reorder.\\n * @param {Array} indexes The arranged array indexes.\\n * @returns {Array} Returns `array`.\\n */\\n function reorder(array, indexes) {\\n var arrLength = array.length,\\n length = nativeMin(indexes.length, arrLength),\\n oldArray = copyArray(array);\\n\\n while (length--) {\\n var index = indexes[length];\\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\\n }\\n return array;\\n }\\n\\n /**\\n * Sets metadata for `func`.\\n *\\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\\n * period of time, it will trip its breaker and transition to an identity\\n * function to avoid garbage collection pauses in V8. See\\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\\n * for more details.\\n *\\n * @private\\n * @param {Function} func The function to associate metadata with.\\n * @param {*} data The metadata.\\n * @returns {Function} Returns `func`.\\n */\\n var setData = shortOut(baseSetData);\\n\\n /**\\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\\n *\\n * @private\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @returns {number|Object} Returns the timer id or timeout object.\\n */\\n var setTimeout = ctxSetTimeout || function(func, wait) {\\n return root.setTimeout(func, wait);\\n };\\n\\n /**\\n * Sets the `toString` method of `func` to return `string`.\\n *\\n * @private\\n * @param {Function} func The function to modify.\\n * @param {Function} string The `toString` result.\\n * @returns {Function} Returns `func`.\\n */\\n var setToString = shortOut(baseSetToString);\\n\\n /**\\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\\n * with wrapper details in a comment at the top of the source body.\\n *\\n * @private\\n * @param {Function} wrapper The function to modify.\\n * @param {Function} reference The reference function.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @returns {Function} Returns `wrapper`.\\n */\\n function setWrapToString(wrapper, reference, bitmask) {\\n var source = (reference + '');\\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\\n }\\n\\n /**\\n * Creates a function that'll short out and invoke `identity` instead\\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\\n * milliseconds.\\n *\\n * @private\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new shortable function.\\n */\\n function shortOut(func) {\\n var count = 0,\\n lastCalled = 0;\\n\\n return function() {\\n var stamp = nativeNow(),\\n remaining = HOT_SPAN - (stamp - lastCalled);\\n\\n lastCalled = stamp;\\n if (remaining > 0) {\\n if (++count >= HOT_COUNT) {\\n return arguments[0];\\n }\\n } else {\\n count = 0;\\n }\\n return func.apply(undefined, arguments);\\n };\\n }\\n\\n /**\\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\\n *\\n * @private\\n * @param {Array} array The array to shuffle.\\n * @param {number} [size=array.length] The size of `array`.\\n * @returns {Array} Returns `array`.\\n */\\n function shuffleSelf(array, size) {\\n var index = -1,\\n length = array.length,\\n lastIndex = length - 1;\\n\\n size = size === undefined ? length : size;\\n while (++index < size) {\\n var rand = baseRandom(index, lastIndex),\\n value = array[rand];\\n\\n array[rand] = array[index];\\n array[index] = value;\\n }\\n array.length = size;\\n return array;\\n }\\n\\n /**\\n * Converts `string` to a property path array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the property path array.\\n */\\n var stringToPath = memoizeCapped(function(string) {\\n var result = [];\\n if (reLeadingDot.test(string)) {\\n result.push('');\\n }\\n string.replace(rePropName, function(match, number, quote, string) {\\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\\n });\\n return result;\\n });\\n\\n /**\\n * Converts `value` to a string key if it's not a string or symbol.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {string|symbol} Returns the key.\\n */\\n function toKey(value) {\\n if (typeof value == 'string' || isSymbol(value)) {\\n return value;\\n }\\n var result = (value + '');\\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\\n }\\n\\n /**\\n * Converts `func` to its source code.\\n *\\n * @private\\n * @param {Function} func The function to convert.\\n * @returns {string} Returns the source code.\\n */\\n function toSource(func) {\\n if (func != null) {\\n try {\\n return funcToString.call(func);\\n } catch (e) {}\\n try {\\n return (func + '');\\n } catch (e) {}\\n }\\n return '';\\n }\\n\\n /**\\n * Updates wrapper `details` based on `bitmask` flags.\\n *\\n * @private\\n * @returns {Array} details The details to modify.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @returns {Array} Returns `details`.\\n */\\n function updateWrapDetails(details, bitmask) {\\n arrayEach(wrapFlags, function(pair) {\\n var value = '_.' + pair[0];\\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\\n details.push(value);\\n }\\n });\\n return details.sort();\\n }\\n\\n /**\\n * Creates a clone of `wrapper`.\\n *\\n * @private\\n * @param {Object} wrapper The wrapper to clone.\\n * @returns {Object} Returns the cloned wrapper.\\n */\\n function wrapperClone(wrapper) {\\n if (wrapper instanceof LazyWrapper) {\\n return wrapper.clone();\\n }\\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\\n result.__actions__ = copyArray(wrapper.__actions__);\\n result.__index__ = wrapper.__index__;\\n result.__values__ = wrapper.__values__;\\n return result;\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an array of elements split into groups the length of `size`.\\n * If `array` can't be split evenly, the final chunk will be the remaining\\n * elements.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to process.\\n * @param {number} [size=1] The length of each chunk\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the new array of chunks.\\n * @example\\n *\\n * _.chunk(['a', 'b', 'c', 'd'], 2);\\n * // => [['a', 'b'], ['c', 'd']]\\n *\\n * _.chunk(['a', 'b', 'c', 'd'], 3);\\n * // => [['a', 'b', 'c'], ['d']]\\n */\\n function chunk(array, size, guard) {\\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\\n size = 1;\\n } else {\\n size = nativeMax(toInteger(size), 0);\\n }\\n var length = array == null ? 0 : array.length;\\n if (!length || size < 1) {\\n return [];\\n }\\n var index = 0,\\n resIndex = 0,\\n result = Array(nativeCeil(length / size));\\n\\n while (index < length) {\\n result[resIndex++] = baseSlice(array, index, (index += size));\\n }\\n return result;\\n }\\n\\n /**\\n * Creates an array with all falsey values removed. The values `false`, `null`,\\n * `0`, `\\\"\\\"`, `undefined`, and `NaN` are falsey.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to compact.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.compact([0, 1, false, 2, '', 3]);\\n * // => [1, 2, 3]\\n */\\n function compact(array) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (value) {\\n result[resIndex++] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Creates a new array concatenating `array` with any additional arrays\\n * and/or values.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to concatenate.\\n * @param {...*} [values] The values to concatenate.\\n * @returns {Array} Returns the new concatenated array.\\n * @example\\n *\\n * var array = [1];\\n * var other = _.concat(array, 2, [3], [[4]]);\\n *\\n * console.log(other);\\n * // => [1, 2, 3, [4]]\\n *\\n * console.log(array);\\n * // => [1]\\n */\\n function concat() {\\n var length = arguments.length;\\n if (!length) {\\n return [];\\n }\\n var args = Array(length - 1),\\n array = arguments[0],\\n index = length;\\n\\n while (index--) {\\n args[index - 1] = arguments[index];\\n }\\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\\n }\\n\\n /**\\n * Creates an array of `array` values not included in the other given arrays\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. The order and references of result values are\\n * determined by the first array.\\n *\\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.without, _.xor\\n * @example\\n *\\n * _.difference([2, 1], [2, 3]);\\n * // => [1]\\n */\\n var difference = baseRest(function(array, values) {\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.difference` except that it accepts `iteratee` which\\n * is invoked for each element of `array` and `values` to generate the criterion\\n * by which they're compared. The order and references of result values are\\n * determined by the first array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\\n * // => [{ 'x': 2 }]\\n */\\n var differenceBy = baseRest(function(array, values) {\\n var iteratee = last(values);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.difference` except that it accepts `comparator`\\n * which is invoked to compare elements of `array` to `values`. The order and\\n * references of result values are determined by the first array. The comparator\\n * is invoked with two arguments: (arrVal, othVal).\\n *\\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n *\\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\\n * // => [{ 'x': 2, 'y': 1 }]\\n */\\n var differenceWith = baseRest(function(array, values) {\\n var comparator = last(values);\\n if (isArrayLikeObject(comparator)) {\\n comparator = undefined;\\n }\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\\n : [];\\n });\\n\\n /**\\n * Creates a slice of `array` with `n` elements dropped from the beginning.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to drop.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.drop([1, 2, 3]);\\n * // => [2, 3]\\n *\\n * _.drop([1, 2, 3], 2);\\n * // => [3]\\n *\\n * _.drop([1, 2, 3], 5);\\n * // => []\\n *\\n * _.drop([1, 2, 3], 0);\\n * // => [1, 2, 3]\\n */\\n function drop(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n return baseSlice(array, n < 0 ? 0 : n, length);\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements dropped from the end.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to drop.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.dropRight([1, 2, 3]);\\n * // => [1, 2]\\n *\\n * _.dropRight([1, 2, 3], 2);\\n * // => [1]\\n *\\n * _.dropRight([1, 2, 3], 5);\\n * // => []\\n *\\n * _.dropRight([1, 2, 3], 0);\\n * // => [1, 2, 3]\\n */\\n function dropRight(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n n = length - n;\\n return baseSlice(array, 0, n < 0 ? 0 : n);\\n }\\n\\n /**\\n * Creates a slice of `array` excluding elements dropped from the end.\\n * Elements are dropped until `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.dropRightWhile(users, function(o) { return !o.active; });\\n * // => objects for ['barney']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.dropRightWhile(users, ['active', false]);\\n * // => objects for ['barney']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.dropRightWhile(users, 'active');\\n * // => objects for ['barney', 'fred', 'pebbles']\\n */\\n function dropRightWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\\n : [];\\n }\\n\\n /**\\n * Creates a slice of `array` excluding elements dropped from the beginning.\\n * Elements are dropped until `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.dropWhile(users, function(o) { return !o.active; });\\n * // => objects for ['pebbles']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.dropWhile(users, ['active', false]);\\n * // => objects for ['pebbles']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.dropWhile(users, 'active');\\n * // => objects for ['barney', 'fred', 'pebbles']\\n */\\n function dropWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), true)\\n : [];\\n }\\n\\n /**\\n * Fills elements of `array` with `value` from `start` up to, but not\\n * including, `end`.\\n *\\n * **Note:** This method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.2.0\\n * @category Array\\n * @param {Array} array The array to fill.\\n * @param {*} value The value to fill `array` with.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _.fill(array, 'a');\\n * console.log(array);\\n * // => ['a', 'a', 'a']\\n *\\n * _.fill(Array(3), 2);\\n * // => [2, 2, 2]\\n *\\n * _.fill([4, 6, 8, 10], '*', 1, 3);\\n * // => [4, '*', '*', 10]\\n */\\n function fill(array, value, start, end) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\\n start = 0;\\n end = length;\\n }\\n return baseFill(array, value, start, end);\\n }\\n\\n /**\\n * This method is like `_.find` except that it returns the index of the first\\n * element `predicate` returns truthy for instead of the element itself.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {number} Returns the index of the found element, else `-1`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\\n * // => 0\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findIndex(users, { 'user': 'fred', 'active': false });\\n * // => 1\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findIndex(users, ['active', false]);\\n * // => 0\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findIndex(users, 'active');\\n * // => 2\\n */\\n function findIndex(array, predicate, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\\n if (index < 0) {\\n index = nativeMax(length + index, 0);\\n }\\n return baseFindIndex(array, getIteratee(predicate, 3), index);\\n }\\n\\n /**\\n * This method is like `_.findIndex` except that it iterates over elements\\n * of `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=array.length-1] The index to search from.\\n * @returns {number} Returns the index of the found element, else `-1`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\\n * // => 2\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\\n * // => 0\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findLastIndex(users, ['active', false]);\\n * // => 2\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findLastIndex(users, 'active');\\n * // => 0\\n */\\n function findLastIndex(array, predicate, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = length - 1;\\n if (fromIndex !== undefined) {\\n index = toInteger(fromIndex);\\n index = fromIndex < 0\\n ? nativeMax(length + index, 0)\\n : nativeMin(index, length - 1);\\n }\\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\\n }\\n\\n /**\\n * Flattens `array` a single level deep.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * _.flatten([1, [2, [3, [4]], 5]]);\\n * // => [1, 2, [3, [4]], 5]\\n */\\n function flatten(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseFlatten(array, 1) : [];\\n }\\n\\n /**\\n * Recursively flattens `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\\n * // => [1, 2, 3, 4, 5]\\n */\\n function flattenDeep(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseFlatten(array, INFINITY) : [];\\n }\\n\\n /**\\n * Recursively flatten `array` up to `depth` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.4.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @param {number} [depth=1] The maximum recursion depth.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * var array = [1, [2, [3, [4]], 5]];\\n *\\n * _.flattenDepth(array, 1);\\n * // => [1, 2, [3, [4]], 5]\\n *\\n * _.flattenDepth(array, 2);\\n * // => [1, 2, 3, [4], 5]\\n */\\n function flattenDepth(array, depth) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n depth = depth === undefined ? 1 : toInteger(depth);\\n return baseFlatten(array, depth);\\n }\\n\\n /**\\n * The inverse of `_.toPairs`; this method returns an object composed\\n * from key-value `pairs`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} pairs The key-value pairs.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.fromPairs([['a', 1], ['b', 2]]);\\n * // => { 'a': 1, 'b': 2 }\\n */\\n function fromPairs(pairs) {\\n var index = -1,\\n length = pairs == null ? 0 : pairs.length,\\n result = {};\\n\\n while (++index < length) {\\n var pair = pairs[index];\\n result[pair[0]] = pair[1];\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the first element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @alias first\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {*} Returns the first element of `array`.\\n * @example\\n *\\n * _.head([1, 2, 3]);\\n * // => 1\\n *\\n * _.head([]);\\n * // => undefined\\n */\\n function head(array) {\\n return (array && array.length) ? array[0] : undefined;\\n }\\n\\n /**\\n * Gets the index at which the first occurrence of `value` is found in `array`\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. If `fromIndex` is negative, it's used as the\\n * offset from the end of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.indexOf([1, 2, 1, 2], 2);\\n * // => 1\\n *\\n * // Search from the `fromIndex`.\\n * _.indexOf([1, 2, 1, 2], 2, 2);\\n * // => 3\\n */\\n function indexOf(array, value, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\\n if (index < 0) {\\n index = nativeMax(length + index, 0);\\n }\\n return baseIndexOf(array, value, index);\\n }\\n\\n /**\\n * Gets all but the last element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.initial([1, 2, 3]);\\n * // => [1, 2]\\n */\\n function initial(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseSlice(array, 0, -1) : [];\\n }\\n\\n /**\\n * Creates an array of unique values that are included in all given arrays\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. The order and references of result values are\\n * determined by the first array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * _.intersection([2, 1], [2, 3]);\\n * // => [2]\\n */\\n var intersection = baseRest(function(arrays) {\\n var mapped = arrayMap(arrays, castArrayLikeObject);\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped)\\n : [];\\n });\\n\\n /**\\n * This method is like `_.intersection` except that it accepts `iteratee`\\n * which is invoked for each element of each `arrays` to generate the criterion\\n * by which they're compared. The order and references of result values are\\n * determined by the first array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [2.1]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }]\\n */\\n var intersectionBy = baseRest(function(arrays) {\\n var iteratee = last(arrays),\\n mapped = arrayMap(arrays, castArrayLikeObject);\\n\\n if (iteratee === last(mapped)) {\\n iteratee = undefined;\\n } else {\\n mapped.pop();\\n }\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.intersection` except that it accepts `comparator`\\n * which is invoked to compare elements of `arrays`. The order and references\\n * of result values are determined by the first array. The comparator is\\n * invoked with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.intersectionWith(objects, others, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }]\\n */\\n var intersectionWith = baseRest(function(arrays) {\\n var comparator = last(arrays),\\n mapped = arrayMap(arrays, castArrayLikeObject);\\n\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n if (comparator) {\\n mapped.pop();\\n }\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped, undefined, comparator)\\n : [];\\n });\\n\\n /**\\n * Converts all elements in `array` into a string separated by `separator`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to convert.\\n * @param {string} [separator=','] The element separator.\\n * @returns {string} Returns the joined string.\\n * @example\\n *\\n * _.join(['a', 'b', 'c'], '~');\\n * // => 'a~b~c'\\n */\\n function join(array, separator) {\\n return array == null ? '' : nativeJoin.call(array, separator);\\n }\\n\\n /**\\n * Gets the last element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {*} Returns the last element of `array`.\\n * @example\\n *\\n * _.last([1, 2, 3]);\\n * // => 3\\n */\\n function last(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? array[length - 1] : undefined;\\n }\\n\\n /**\\n * This method is like `_.indexOf` except that it iterates over elements of\\n * `array` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=array.length-1] The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.lastIndexOf([1, 2, 1, 2], 2);\\n * // => 3\\n *\\n * // Search from the `fromIndex`.\\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\\n * // => 1\\n */\\n function lastIndexOf(array, value, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = length;\\n if (fromIndex !== undefined) {\\n index = toInteger(fromIndex);\\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\\n }\\n return value === value\\n ? strictLastIndexOf(array, value, index)\\n : baseFindIndex(array, baseIsNaN, index, true);\\n }\\n\\n /**\\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\\n * element from the end is returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.11.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=0] The index of the element to return.\\n * @returns {*} Returns the nth element of `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'd'];\\n *\\n * _.nth(array, 1);\\n * // => 'b'\\n *\\n * _.nth(array, -2);\\n * // => 'c';\\n */\\n function nth(array, n) {\\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\\n }\\n\\n /**\\n * Removes all given values from `array` using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\\n * to remove elements from an array by predicate.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {...*} [values] The values to remove.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\\n *\\n * _.pull(array, 'a', 'c');\\n * console.log(array);\\n * // => ['b', 'b']\\n */\\n var pull = baseRest(pullAll);\\n\\n /**\\n * This method is like `_.pull` except that it accepts an array of values to remove.\\n *\\n * **Note:** Unlike `_.difference`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\\n *\\n * _.pullAll(array, ['a', 'c']);\\n * console.log(array);\\n * // => ['b', 'b']\\n */\\n function pullAll(array, values) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values)\\n : array;\\n }\\n\\n /**\\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\\n * invoked for each element of `array` and `values` to generate the criterion\\n * by which they're compared. The iteratee is invoked with one argument: (value).\\n *\\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\\n *\\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\\n * console.log(array);\\n * // => [{ 'x': 2 }]\\n */\\n function pullAllBy(array, values, iteratee) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values, getIteratee(iteratee, 2))\\n : array;\\n }\\n\\n /**\\n * This method is like `_.pullAll` except that it accepts `comparator` which\\n * is invoked to compare elements of `array` to `values`. The comparator is\\n * invoked with two arguments: (arrVal, othVal).\\n *\\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\\n *\\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\\n * console.log(array);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\\n */\\n function pullAllWith(array, values, comparator) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values, undefined, comparator)\\n : array;\\n }\\n\\n /**\\n * Removes elements from `array` corresponding to `indexes` and returns an\\n * array of removed elements.\\n *\\n * **Note:** Unlike `_.at`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\\n * @returns {Array} Returns the new array of removed elements.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'd'];\\n * var pulled = _.pullAt(array, [1, 3]);\\n *\\n * console.log(array);\\n * // => ['a', 'c']\\n *\\n * console.log(pulled);\\n * // => ['b', 'd']\\n */\\n var pullAt = flatRest(function(array, indexes) {\\n var length = array == null ? 0 : array.length,\\n result = baseAt(array, indexes);\\n\\n basePullAt(array, arrayMap(indexes, function(index) {\\n return isIndex(index, length) ? +index : index;\\n }).sort(compareAscending));\\n\\n return result;\\n });\\n\\n /**\\n * Removes all elements from `array` that `predicate` returns truthy for\\n * and returns an array of the removed elements. The predicate is invoked\\n * with three arguments: (value, index, array).\\n *\\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\\n * to pull elements from an array by value.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new array of removed elements.\\n * @example\\n *\\n * var array = [1, 2, 3, 4];\\n * var evens = _.remove(array, function(n) {\\n * return n % 2 == 0;\\n * });\\n *\\n * console.log(array);\\n * // => [1, 3]\\n *\\n * console.log(evens);\\n * // => [2, 4]\\n */\\n function remove(array, predicate) {\\n var result = [];\\n if (!(array && array.length)) {\\n return result;\\n }\\n var index = -1,\\n indexes = [],\\n length = array.length;\\n\\n predicate = getIteratee(predicate, 3);\\n while (++index < length) {\\n var value = array[index];\\n if (predicate(value, index, array)) {\\n result.push(value);\\n indexes.push(index);\\n }\\n }\\n basePullAt(array, indexes);\\n return result;\\n }\\n\\n /**\\n * Reverses `array` so that the first element becomes the last, the second\\n * element becomes the second to last, and so on.\\n *\\n * **Note:** This method mutates `array` and is based on\\n * [`Array#reverse`](https://mdn.io/Array/reverse).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _.reverse(array);\\n * // => [3, 2, 1]\\n *\\n * console.log(array);\\n * // => [3, 2, 1]\\n */\\n function reverse(array) {\\n return array == null ? array : nativeReverse.call(array);\\n }\\n\\n /**\\n * Creates a slice of `array` from `start` up to, but not including, `end`.\\n *\\n * **Note:** This method is used instead of\\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\\n * returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to slice.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function slice(array, start, end) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\\n start = 0;\\n end = length;\\n }\\n else {\\n start = start == null ? 0 : toInteger(start);\\n end = end === undefined ? length : toInteger(end);\\n }\\n return baseSlice(array, start, end);\\n }\\n\\n /**\\n * Uses a binary search to determine the lowest index at which `value`\\n * should be inserted into `array` in order to maintain its sort order.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * _.sortedIndex([30, 50], 40);\\n * // => 1\\n */\\n function sortedIndex(array, value) {\\n return baseSortedIndex(array, value);\\n }\\n\\n /**\\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\\n * which is invoked for `value` and each element of `array` to compute their\\n * sort ranking. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\\n *\\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\\n * // => 0\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\\n * // => 0\\n */\\n function sortedIndexBy(array, value, iteratee) {\\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\\n }\\n\\n /**\\n * This method is like `_.indexOf` except that it performs a binary\\n * search on a sorted `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\\n * // => 1\\n */\\n function sortedIndexOf(array, value) {\\n var length = array == null ? 0 : array.length;\\n if (length) {\\n var index = baseSortedIndex(array, value);\\n if (index < length && eq(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * This method is like `_.sortedIndex` except that it returns the highest\\n * index at which `value` should be inserted into `array` in order to\\n * maintain its sort order.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\\n * // => 4\\n */\\n function sortedLastIndex(array, value) {\\n return baseSortedIndex(array, value, true);\\n }\\n\\n /**\\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\\n * which is invoked for `value` and each element of `array` to compute their\\n * sort ranking. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\\n *\\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\\n * // => 1\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\\n * // => 1\\n */\\n function sortedLastIndexBy(array, value, iteratee) {\\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\\n }\\n\\n /**\\n * This method is like `_.lastIndexOf` except that it performs a binary\\n * search on a sorted `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\\n * // => 3\\n */\\n function sortedLastIndexOf(array, value) {\\n var length = array == null ? 0 : array.length;\\n if (length) {\\n var index = baseSortedIndex(array, value, true) - 1;\\n if (eq(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it's designed and optimized\\n * for sorted arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.sortedUniq([1, 1, 2]);\\n * // => [1, 2]\\n */\\n function sortedUniq(array) {\\n return (array && array.length)\\n ? baseSortedUniq(array)\\n : [];\\n }\\n\\n /**\\n * This method is like `_.uniqBy` except that it's designed and optimized\\n * for sorted arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\\n * // => [1.1, 2.3]\\n */\\n function sortedUniqBy(array, iteratee) {\\n return (array && array.length)\\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\\n : [];\\n }\\n\\n /**\\n * Gets all but the first element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.tail([1, 2, 3]);\\n * // => [2, 3]\\n */\\n function tail(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseSlice(array, 1, length) : [];\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements taken from the beginning.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to take.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.take([1, 2, 3]);\\n * // => [1]\\n *\\n * _.take([1, 2, 3], 2);\\n * // => [1, 2]\\n *\\n * _.take([1, 2, 3], 5);\\n * // => [1, 2, 3]\\n *\\n * _.take([1, 2, 3], 0);\\n * // => []\\n */\\n function take(array, n, guard) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n return baseSlice(array, 0, n < 0 ? 0 : n);\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements taken from the end.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to take.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.takeRight([1, 2, 3]);\\n * // => [3]\\n *\\n * _.takeRight([1, 2, 3], 2);\\n * // => [2, 3]\\n *\\n * _.takeRight([1, 2, 3], 5);\\n * // => [1, 2, 3]\\n *\\n * _.takeRight([1, 2, 3], 0);\\n * // => []\\n */\\n function takeRight(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n n = length - n;\\n return baseSlice(array, n < 0 ? 0 : n, length);\\n }\\n\\n /**\\n * Creates a slice of `array` with elements taken from the end. Elements are\\n * taken until `predicate` returns falsey. The predicate is invoked with\\n * three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.takeRightWhile(users, function(o) { return !o.active; });\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\\n * // => objects for ['pebbles']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.takeRightWhile(users, ['active', false]);\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.takeRightWhile(users, 'active');\\n * // => []\\n */\\n function takeRightWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\\n : [];\\n }\\n\\n /**\\n * Creates a slice of `array` with elements taken from the beginning. Elements\\n * are taken until `predicate` returns falsey. The predicate is invoked with\\n * three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.takeWhile(users, function(o) { return !o.active; });\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.takeWhile(users, ['active', false]);\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.takeWhile(users, 'active');\\n * // => []\\n */\\n function takeWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3))\\n : [];\\n }\\n\\n /**\\n * Creates an array of unique values, in order, from all given arrays using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * _.union([2], [1, 2]);\\n * // => [2, 1]\\n */\\n var union = baseRest(function(arrays) {\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\\n });\\n\\n /**\\n * This method is like `_.union` except that it accepts `iteratee` which is\\n * invoked for each element of each `arrays` to generate the criterion by\\n * which uniqueness is computed. Result values are chosen from the first\\n * array in which the value occurs. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\\n * // => [2.1, 1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }, { 'x': 2 }]\\n */\\n var unionBy = baseRest(function(arrays) {\\n var iteratee = last(arrays);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\\n });\\n\\n /**\\n * This method is like `_.union` except that it accepts `comparator` which\\n * is invoked to compare elements of `arrays`. Result values are chosen from\\n * the first array in which the value occurs. The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.unionWith(objects, others, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\\n */\\n var unionWith = baseRest(function(arrays) {\\n var comparator = last(arrays);\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\\n });\\n\\n /**\\n * Creates a duplicate-free version of an array, using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons, in which only the first occurrence of each element\\n * is kept. The order of result values is determined by the order they occur\\n * in the array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.uniq([2, 1, 2]);\\n * // => [2, 1]\\n */\\n function uniq(array) {\\n return (array && array.length) ? baseUniq(array) : [];\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it accepts `iteratee` which is\\n * invoked for each element in `array` to generate the criterion by which\\n * uniqueness is computed. The order of result values is determined by the\\n * order they occur in the array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\\n * // => [2.1, 1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }, { 'x': 2 }]\\n */\\n function uniqBy(array, iteratee) {\\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it accepts `comparator` which\\n * is invoked to compare elements of `array`. The order of result values is\\n * determined by the order they occur in the array.The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.uniqWith(objects, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\\n */\\n function uniqWith(array, comparator) {\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\\n }\\n\\n /**\\n * This method is like `_.zip` except that it accepts an array of grouped\\n * elements and creates an array regrouping the elements to their pre-zip\\n * configuration.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.2.0\\n * @category Array\\n * @param {Array} array The array of grouped elements to process.\\n * @returns {Array} Returns the new array of regrouped elements.\\n * @example\\n *\\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\\n * // => [['a', 1, true], ['b', 2, false]]\\n *\\n * _.unzip(zipped);\\n * // => [['a', 'b'], [1, 2], [true, false]]\\n */\\n function unzip(array) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n var length = 0;\\n array = arrayFilter(array, function(group) {\\n if (isArrayLikeObject(group)) {\\n length = nativeMax(group.length, length);\\n return true;\\n }\\n });\\n return baseTimes(length, function(index) {\\n return arrayMap(array, baseProperty(index));\\n });\\n }\\n\\n /**\\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\\n * how regrouped values should be combined. The iteratee is invoked with the\\n * elements of each group: (...group).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Array\\n * @param {Array} array The array of grouped elements to process.\\n * @param {Function} [iteratee=_.identity] The function to combine\\n * regrouped values.\\n * @returns {Array} Returns the new array of regrouped elements.\\n * @example\\n *\\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\\n * // => [[1, 10, 100], [2, 20, 200]]\\n *\\n * _.unzipWith(zipped, _.add);\\n * // => [3, 30, 300]\\n */\\n function unzipWith(array, iteratee) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n var result = unzip(array);\\n if (iteratee == null) {\\n return result;\\n }\\n return arrayMap(result, function(group) {\\n return apply(iteratee, undefined, group);\\n });\\n }\\n\\n /**\\n * Creates an array excluding all given values using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * **Note:** Unlike `_.pull`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...*} [values] The values to exclude.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.difference, _.xor\\n * @example\\n *\\n * _.without([2, 1, 2, 3], 1, 2);\\n * // => [3]\\n */\\n var without = baseRest(function(array, values) {\\n return isArrayLikeObject(array)\\n ? baseDifference(array, values)\\n : [];\\n });\\n\\n /**\\n * Creates an array of unique values that is the\\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\\n * of the given arrays. The order of result values is determined by the order\\n * they occur in the arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.difference, _.without\\n * @example\\n *\\n * _.xor([2, 1], [2, 3]);\\n * // => [1, 3]\\n */\\n var xor = baseRest(function(arrays) {\\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\\n });\\n\\n /**\\n * This method is like `_.xor` except that it accepts `iteratee` which is\\n * invoked for each element of each `arrays` to generate the criterion by\\n * which by which they're compared. The order of result values is determined\\n * by the order they occur in the arrays. The iteratee is invoked with one\\n * argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [1.2, 3.4]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 2 }]\\n */\\n var xorBy = baseRest(function(arrays) {\\n var iteratee = last(arrays);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\\n });\\n\\n /**\\n * This method is like `_.xor` except that it accepts `comparator` which is\\n * invoked to compare elements of `arrays`. The order of result values is\\n * determined by the order they occur in the arrays. The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.xorWith(objects, others, _.isEqual);\\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\\n */\\n var xorWith = baseRest(function(arrays) {\\n var comparator = last(arrays);\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\\n });\\n\\n /**\\n * Creates an array of grouped elements, the first of which contains the\\n * first elements of the given arrays, the second of which contains the\\n * second elements of the given arrays, and so on.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to process.\\n * @returns {Array} Returns the new array of grouped elements.\\n * @example\\n *\\n * _.zip(['a', 'b'], [1, 2], [true, false]);\\n * // => [['a', 1, true], ['b', 2, false]]\\n */\\n var zip = baseRest(unzip);\\n\\n /**\\n * This method is like `_.fromPairs` except that it accepts two arrays,\\n * one of property identifiers and one of corresponding values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.4.0\\n * @category Array\\n * @param {Array} [props=[]] The property identifiers.\\n * @param {Array} [values=[]] The property values.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.zipObject(['a', 'b'], [1, 2]);\\n * // => { 'a': 1, 'b': 2 }\\n */\\n function zipObject(props, values) {\\n return baseZipObject(props || [], values || [], assignValue);\\n }\\n\\n /**\\n * This method is like `_.zipObject` except that it supports property paths.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.1.0\\n * @category Array\\n * @param {Array} [props=[]] The property identifiers.\\n * @param {Array} [values=[]] The property values.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\\n */\\n function zipObjectDeep(props, values) {\\n return baseZipObject(props || [], values || [], baseSet);\\n }\\n\\n /**\\n * This method is like `_.zip` except that it accepts `iteratee` to specify\\n * how grouped values should be combined. The iteratee is invoked with the\\n * elements of each group: (...group).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to process.\\n * @param {Function} [iteratee=_.identity] The function to combine\\n * grouped values.\\n * @returns {Array} Returns the new array of grouped elements.\\n * @example\\n *\\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\\n * return a + b + c;\\n * });\\n * // => [111, 222]\\n */\\n var zipWith = baseRest(function(arrays) {\\n var length = arrays.length,\\n iteratee = length > 1 ? arrays[length - 1] : undefined;\\n\\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\\n return unzipWith(arrays, iteratee);\\n });\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\\n * chain sequences enabled. The result of such sequences must be unwrapped\\n * with `_#value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.3.0\\n * @category Seq\\n * @param {*} value The value to wrap.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'pebbles', 'age': 1 }\\n * ];\\n *\\n * var youngest = _\\n * .chain(users)\\n * .sortBy('age')\\n * .map(function(o) {\\n * return o.user + ' is ' + o.age;\\n * })\\n * .head()\\n * .value();\\n * // => 'pebbles is 1'\\n */\\n function chain(value) {\\n var result = lodash(value);\\n result.__chain__ = true;\\n return result;\\n }\\n\\n /**\\n * This method invokes `interceptor` and returns `value`. The interceptor\\n * is invoked with one argument; (value). The purpose of this method is to\\n * \\\"tap into\\\" a method chain sequence in order to modify intermediate results.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @param {*} value The value to provide to `interceptor`.\\n * @param {Function} interceptor The function to invoke.\\n * @returns {*} Returns `value`.\\n * @example\\n *\\n * _([1, 2, 3])\\n * .tap(function(array) {\\n * // Mutate input array.\\n * array.pop();\\n * })\\n * .reverse()\\n * .value();\\n * // => [2, 1]\\n */\\n function tap(value, interceptor) {\\n interceptor(value);\\n return value;\\n }\\n\\n /**\\n * This method is like `_.tap` except that it returns the result of `interceptor`.\\n * The purpose of this method is to \\\"pass thru\\\" values replacing intermediate\\n * results in a method chain sequence.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Seq\\n * @param {*} value The value to provide to `interceptor`.\\n * @param {Function} interceptor The function to invoke.\\n * @returns {*} Returns the result of `interceptor`.\\n * @example\\n *\\n * _(' abc ')\\n * .chain()\\n * .trim()\\n * .thru(function(value) {\\n * return [value];\\n * })\\n * .value();\\n * // => ['abc']\\n */\\n function thru(value, interceptor) {\\n return interceptor(value);\\n }\\n\\n /**\\n * This method is the wrapper version of `_.at`.\\n *\\n * @name at\\n * @memberOf _\\n * @since 1.0.0\\n * @category Seq\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\\n *\\n * _(object).at(['a[0].b.c', 'a[1]']).value();\\n * // => [3, 4]\\n */\\n var wrapperAt = flatRest(function(paths) {\\n var length = paths.length,\\n start = length ? paths[0] : 0,\\n value = this.__wrapped__,\\n interceptor = function(object) { return baseAt(object, paths); };\\n\\n if (length > 1 || this.__actions__.length ||\\n !(value instanceof LazyWrapper) || !isIndex(start)) {\\n return this.thru(interceptor);\\n }\\n value = value.slice(start, +start + (length ? 1 : 0));\\n value.__actions__.push({\\n 'func': thru,\\n 'args': [interceptor],\\n 'thisArg': undefined\\n });\\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\\n if (length && !array.length) {\\n array.push(undefined);\\n }\\n return array;\\n });\\n });\\n\\n /**\\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\\n *\\n * @name chain\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 }\\n * ];\\n *\\n * // A sequence without explicit chaining.\\n * _(users).head();\\n * // => { 'user': 'barney', 'age': 36 }\\n *\\n * // A sequence with explicit chaining.\\n * _(users)\\n * .chain()\\n * .head()\\n * .pick('user')\\n * .value();\\n * // => { 'user': 'barney' }\\n */\\n function wrapperChain() {\\n return chain(this);\\n }\\n\\n /**\\n * Executes the chain sequence and returns the wrapped result.\\n *\\n * @name commit\\n * @memberOf _\\n * @since 3.2.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var array = [1, 2];\\n * var wrapped = _(array).push(3);\\n *\\n * console.log(array);\\n * // => [1, 2]\\n *\\n * wrapped = wrapped.commit();\\n * console.log(array);\\n * // => [1, 2, 3]\\n *\\n * wrapped.last();\\n * // => 3\\n *\\n * console.log(array);\\n * // => [1, 2, 3]\\n */\\n function wrapperCommit() {\\n return new LodashWrapper(this.value(), this.__chain__);\\n }\\n\\n /**\\n * Gets the next value on a wrapped object following the\\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\\n *\\n * @name next\\n * @memberOf _\\n * @since 4.0.0\\n * @category Seq\\n * @returns {Object} Returns the next iterator value.\\n * @example\\n *\\n * var wrapped = _([1, 2]);\\n *\\n * wrapped.next();\\n * // => { 'done': false, 'value': 1 }\\n *\\n * wrapped.next();\\n * // => { 'done': false, 'value': 2 }\\n *\\n * wrapped.next();\\n * // => { 'done': true, 'value': undefined }\\n */\\n function wrapperNext() {\\n if (this.__values__ === undefined) {\\n this.__values__ = toArray(this.value());\\n }\\n var done = this.__index__ >= this.__values__.length,\\n value = done ? undefined : this.__values__[this.__index__++];\\n\\n return { 'done': done, 'value': value };\\n }\\n\\n /**\\n * Enables the wrapper to be iterable.\\n *\\n * @name Symbol.iterator\\n * @memberOf _\\n * @since 4.0.0\\n * @category Seq\\n * @returns {Object} Returns the wrapper object.\\n * @example\\n *\\n * var wrapped = _([1, 2]);\\n *\\n * wrapped[Symbol.iterator]() === wrapped;\\n * // => true\\n *\\n * Array.from(wrapped);\\n * // => [1, 2]\\n */\\n function wrapperToIterator() {\\n return this;\\n }\\n\\n /**\\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\\n *\\n * @name plant\\n * @memberOf _\\n * @since 3.2.0\\n * @category Seq\\n * @param {*} value The value to plant.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var wrapped = _([1, 2]).map(square);\\n * var other = wrapped.plant([3, 4]);\\n *\\n * other.value();\\n * // => [9, 16]\\n *\\n * wrapped.value();\\n * // => [1, 4]\\n */\\n function wrapperPlant(value) {\\n var result,\\n parent = this;\\n\\n while (parent instanceof baseLodash) {\\n var clone = wrapperClone(parent);\\n clone.__index__ = 0;\\n clone.__values__ = undefined;\\n if (result) {\\n previous.__wrapped__ = clone;\\n } else {\\n result = clone;\\n }\\n var previous = clone;\\n parent = parent.__wrapped__;\\n }\\n previous.__wrapped__ = value;\\n return result;\\n }\\n\\n /**\\n * This method is the wrapper version of `_.reverse`.\\n *\\n * **Note:** This method mutates the wrapped array.\\n *\\n * @name reverse\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _(array).reverse().value()\\n * // => [3, 2, 1]\\n *\\n * console.log(array);\\n * // => [3, 2, 1]\\n */\\n function wrapperReverse() {\\n var value = this.__wrapped__;\\n if (value instanceof LazyWrapper) {\\n var wrapped = value;\\n if (this.__actions__.length) {\\n wrapped = new LazyWrapper(this);\\n }\\n wrapped = wrapped.reverse();\\n wrapped.__actions__.push({\\n 'func': thru,\\n 'args': [reverse],\\n 'thisArg': undefined\\n });\\n return new LodashWrapper(wrapped, this.__chain__);\\n }\\n return this.thru(reverse);\\n }\\n\\n /**\\n * Executes the chain sequence to resolve the unwrapped value.\\n *\\n * @name value\\n * @memberOf _\\n * @since 0.1.0\\n * @alias toJSON, valueOf\\n * @category Seq\\n * @returns {*} Returns the resolved unwrapped value.\\n * @example\\n *\\n * _([1, 2, 3]).value();\\n * // => [1, 2, 3]\\n */\\n function wrapperValue() {\\n return baseWrapperValue(this.__wrapped__, this.__actions__);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The corresponding value of\\n * each key is the number of times the key was returned by `iteratee`. The\\n * iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\\n * // => { '4': 1, '6': 2 }\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.countBy(['one', 'two', 'three'], 'length');\\n * // => { '3': 2, '5': 1 }\\n */\\n var countBy = createAggregator(function(result, value, key) {\\n if (hasOwnProperty.call(result, key)) {\\n ++result[key];\\n } else {\\n baseAssignValue(result, key, 1);\\n }\\n });\\n\\n /**\\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\\n * Iteration is stopped once `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index|key, collection).\\n *\\n * **Note:** This method returns `true` for\\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\\n * elements of empty collections.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`.\\n * @example\\n *\\n * _.every([true, 1, null, 'yes'], Boolean);\\n * // => false\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': false }\\n * ];\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.every(users, { 'user': 'barney', 'active': false });\\n * // => false\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.every(users, ['active', false]);\\n * // => true\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.every(users, 'active');\\n * // => false\\n */\\n function every(collection, predicate, guard) {\\n var func = isArray(collection) ? arrayEvery : baseEvery;\\n if (guard && isIterateeCall(collection, predicate, guard)) {\\n predicate = undefined;\\n }\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Iterates over elements of `collection`, returning an array of all elements\\n * `predicate` returns truthy for. The predicate is invoked with three\\n * arguments: (value, index|key, collection).\\n *\\n * **Note:** Unlike `_.remove`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n * @see _.reject\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': true },\\n * { 'user': 'fred', 'age': 40, 'active': false }\\n * ];\\n *\\n * _.filter(users, function(o) { return !o.active; });\\n * // => objects for ['fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.filter(users, { 'age': 36, 'active': true });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.filter(users, ['active', false]);\\n * // => objects for ['fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.filter(users, 'active');\\n * // => objects for ['barney']\\n */\\n function filter(collection, predicate) {\\n var func = isArray(collection) ? arrayFilter : baseFilter;\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Iterates over elements of `collection`, returning the first element\\n * `predicate` returns truthy for. The predicate is invoked with three\\n * arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {*} Returns the matched element, else `undefined`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': true },\\n * { 'user': 'fred', 'age': 40, 'active': false },\\n * { 'user': 'pebbles', 'age': 1, 'active': true }\\n * ];\\n *\\n * _.find(users, function(o) { return o.age < 40; });\\n * // => object for 'barney'\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.find(users, { 'age': 1, 'active': true });\\n * // => object for 'pebbles'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.find(users, ['active', false]);\\n * // => object for 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.find(users, 'active');\\n * // => object for 'barney'\\n */\\n var find = createFind(findIndex);\\n\\n /**\\n * This method is like `_.find` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=collection.length-1] The index to search from.\\n * @returns {*} Returns the matched element, else `undefined`.\\n * @example\\n *\\n * _.findLast([1, 2, 3, 4], function(n) {\\n * return n % 2 == 1;\\n * });\\n * // => 3\\n */\\n var findLast = createFind(findLastIndex);\\n\\n /**\\n * Creates a flattened array of values by running each element in `collection`\\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\\n * with three arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [n, n];\\n * }\\n *\\n * _.flatMap([1, 2], duplicate);\\n * // => [1, 1, 2, 2]\\n */\\n function flatMap(collection, iteratee) {\\n return baseFlatten(map(collection, iteratee), 1);\\n }\\n\\n /**\\n * This method is like `_.flatMap` except that it recursively flattens the\\n * mapped results.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.7.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [[[n, n]]];\\n * }\\n *\\n * _.flatMapDeep([1, 2], duplicate);\\n * // => [1, 1, 2, 2]\\n */\\n function flatMapDeep(collection, iteratee) {\\n return baseFlatten(map(collection, iteratee), INFINITY);\\n }\\n\\n /**\\n * This method is like `_.flatMap` except that it recursively flattens the\\n * mapped results up to `depth` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.7.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {number} [depth=1] The maximum recursion depth.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [[[n, n]]];\\n * }\\n *\\n * _.flatMapDepth([1, 2], duplicate, 2);\\n * // => [[1, 1], [2, 2]]\\n */\\n function flatMapDepth(collection, iteratee, depth) {\\n depth = depth === undefined ? 1 : toInteger(depth);\\n return baseFlatten(map(collection, iteratee), depth);\\n }\\n\\n /**\\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\\n * The iteratee is invoked with three arguments: (value, index|key, collection).\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * **Note:** As with other \\\"Collections\\\" methods, objects with a \\\"length\\\"\\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\\n * or `_.forOwn` for object iteration.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @alias each\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n * @see _.forEachRight\\n * @example\\n *\\n * _.forEach([1, 2], function(value) {\\n * console.log(value);\\n * });\\n * // => Logs `1` then `2`.\\n *\\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\\n */\\n function forEach(collection, iteratee) {\\n var func = isArray(collection) ? arrayEach : baseEach;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.forEach` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @alias eachRight\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n * @see _.forEach\\n * @example\\n *\\n * _.forEachRight([1, 2], function(value) {\\n * console.log(value);\\n * });\\n * // => Logs `2` then `1`.\\n */\\n function forEachRight(collection, iteratee) {\\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The order of grouped values\\n * is determined by the order they occur in `collection`. The corresponding\\n * value of each key is an array of elements responsible for generating the\\n * key. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\\n * // => { '4': [4.2], '6': [6.1, 6.3] }\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.groupBy(['one', 'two', 'three'], 'length');\\n * // => { '3': ['one', 'two'], '5': ['three'] }\\n */\\n var groupBy = createAggregator(function(result, value, key) {\\n if (hasOwnProperty.call(result, key)) {\\n result[key].push(value);\\n } else {\\n baseAssignValue(result, key, [value]);\\n }\\n });\\n\\n /**\\n * Checks if `value` is in `collection`. If `collection` is a string, it's\\n * checked for a substring of `value`, otherwise\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\\n * the offset from the end of `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object|string} collection The collection to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\\n * @example\\n *\\n * _.includes([1, 2, 3], 1);\\n * // => true\\n *\\n * _.includes([1, 2, 3], 1, 2);\\n * // => false\\n *\\n * _.includes({ 'a': 1, 'b': 2 }, 1);\\n * // => true\\n *\\n * _.includes('abcd', 'bc');\\n * // => true\\n */\\n function includes(collection, value, fromIndex, guard) {\\n collection = isArrayLike(collection) ? collection : values(collection);\\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\\n\\n var length = collection.length;\\n if (fromIndex < 0) {\\n fromIndex = nativeMax(length + fromIndex, 0);\\n }\\n return isString(collection)\\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\\n }\\n\\n /**\\n * Invokes the method at `path` of each element in `collection`, returning\\n * an array of the results of each invoked method. Any additional arguments\\n * are provided to each invoked method. If `path` is a function, it's invoked\\n * for, and `this` bound to, each element in `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Array|Function|string} path The path of the method to invoke or\\n * the function invoked per iteration.\\n * @param {...*} [args] The arguments to invoke each method with.\\n * @returns {Array} Returns the array of results.\\n * @example\\n *\\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\\n * // => [[1, 5, 7], [1, 2, 3]]\\n *\\n * _.invokeMap([123, 456], String.prototype.split, '');\\n * // => [['1', '2', '3'], ['4', '5', '6']]\\n */\\n var invokeMap = baseRest(function(collection, path, args) {\\n var index = -1,\\n isFunc = typeof path == 'function',\\n result = isArrayLike(collection) ? Array(collection.length) : [];\\n\\n baseEach(collection, function(value) {\\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\\n });\\n return result;\\n });\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The corresponding value of\\n * each key is the last element responsible for generating the key. The\\n * iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * var array = [\\n * { 'dir': 'left', 'code': 97 },\\n * { 'dir': 'right', 'code': 100 }\\n * ];\\n *\\n * _.keyBy(array, function(o) {\\n * return String.fromCharCode(o.code);\\n * });\\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\\n *\\n * _.keyBy(array, 'dir');\\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\\n */\\n var keyBy = createAggregator(function(result, value, key) {\\n baseAssignValue(result, key, value);\\n });\\n\\n /**\\n * Creates an array of values by running each element in `collection` thru\\n * `iteratee`. The iteratee is invoked with three arguments:\\n * (value, index|key, collection).\\n *\\n * Many lodash methods are guarded to work as iteratees for methods like\\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\\n *\\n * The guarded methods are:\\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * _.map([4, 8], square);\\n * // => [16, 64]\\n *\\n * _.map({ 'a': 4, 'b': 8 }, square);\\n * // => [16, 64] (iteration order is not guaranteed)\\n *\\n * var users = [\\n * { 'user': 'barney' },\\n * { 'user': 'fred' }\\n * ];\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.map(users, 'user');\\n * // => ['barney', 'fred']\\n */\\n function map(collection, iteratee) {\\n var func = isArray(collection) ? arrayMap : baseMap;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.sortBy` except that it allows specifying the sort\\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\\n * are sorted in ascending order. Otherwise, specify an order of \\\"desc\\\" for\\n * descending or \\\"asc\\\" for ascending sort order of corresponding values.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\\n * The iteratees to sort by.\\n * @param {string[]} [orders] The sort orders of `iteratees`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\\n * @returns {Array} Returns the new sorted array.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'fred', 'age': 48 },\\n * { 'user': 'barney', 'age': 34 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'barney', 'age': 36 }\\n * ];\\n *\\n * // Sort by `user` in ascending order and by `age` in descending order.\\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\\n */\\n function orderBy(collection, iteratees, orders, guard) {\\n if (collection == null) {\\n return [];\\n }\\n if (!isArray(iteratees)) {\\n iteratees = iteratees == null ? [] : [iteratees];\\n }\\n orders = guard ? undefined : orders;\\n if (!isArray(orders)) {\\n orders = orders == null ? [] : [orders];\\n }\\n return baseOrderBy(collection, iteratees, orders);\\n }\\n\\n /**\\n * Creates an array of elements split into two groups, the first of which\\n * contains elements `predicate` returns truthy for, the second of which\\n * contains elements `predicate` returns falsey for. The predicate is\\n * invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the array of grouped elements.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': true },\\n * { 'user': 'pebbles', 'age': 1, 'active': false }\\n * ];\\n *\\n * _.partition(users, function(o) { return o.active; });\\n * // => objects for [['fred'], ['barney', 'pebbles']]\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.partition(users, { 'age': 1, 'active': false });\\n * // => objects for [['pebbles'], ['barney', 'fred']]\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.partition(users, ['active', false]);\\n * // => objects for [['barney', 'pebbles'], ['fred']]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.partition(users, 'active');\\n * // => objects for [['fred'], ['barney', 'pebbles']]\\n */\\n var partition = createAggregator(function(result, value, key) {\\n result[key ? 0 : 1].push(value);\\n }, function() { return [[], []]; });\\n\\n /**\\n * Reduces `collection` to a value which is the accumulated result of running\\n * each element in `collection` thru `iteratee`, where each successive\\n * invocation is supplied the return value of the previous. If `accumulator`\\n * is not given, the first element of `collection` is used as the initial\\n * value. The iteratee is invoked with four arguments:\\n * (accumulator, value, index|key, collection).\\n *\\n * Many lodash methods are guarded to work as iteratees for methods like\\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\\n *\\n * The guarded methods are:\\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\\n * and `sortBy`\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @returns {*} Returns the accumulated value.\\n * @see _.reduceRight\\n * @example\\n *\\n * _.reduce([1, 2], function(sum, n) {\\n * return sum + n;\\n * }, 0);\\n * // => 3\\n *\\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\\n * (result[value] || (result[value] = [])).push(key);\\n * return result;\\n * }, {});\\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\\n */\\n function reduce(collection, iteratee, accumulator) {\\n var func = isArray(collection) ? arrayReduce : baseReduce,\\n initAccum = arguments.length < 3;\\n\\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\\n }\\n\\n /**\\n * This method is like `_.reduce` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @returns {*} Returns the accumulated value.\\n * @see _.reduce\\n * @example\\n *\\n * var array = [[0, 1], [2, 3], [4, 5]];\\n *\\n * _.reduceRight(array, function(flattened, other) {\\n * return flattened.concat(other);\\n * }, []);\\n * // => [4, 5, 2, 3, 0, 1]\\n */\\n function reduceRight(collection, iteratee, accumulator) {\\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\\n initAccum = arguments.length < 3;\\n\\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\\n }\\n\\n /**\\n * The opposite of `_.filter`; this method returns the elements of `collection`\\n * that `predicate` does **not** return truthy for.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n * @see _.filter\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': true }\\n * ];\\n *\\n * _.reject(users, function(o) { return !o.active; });\\n * // => objects for ['fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.reject(users, { 'age': 40, 'active': true });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.reject(users, ['active', false]);\\n * // => objects for ['fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.reject(users, 'active');\\n * // => objects for ['barney']\\n */\\n function reject(collection, predicate) {\\n var func = isArray(collection) ? arrayFilter : baseFilter;\\n return func(collection, negate(getIteratee(predicate, 3)));\\n }\\n\\n /**\\n * Gets a random element from `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to sample.\\n * @returns {*} Returns the random element.\\n * @example\\n *\\n * _.sample([1, 2, 3, 4]);\\n * // => 2\\n */\\n function sample(collection) {\\n var func = isArray(collection) ? arraySample : baseSample;\\n return func(collection);\\n }\\n\\n /**\\n * Gets `n` random elements at unique keys from `collection` up to the\\n * size of `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to sample.\\n * @param {number} [n=1] The number of elements to sample.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the random elements.\\n * @example\\n *\\n * _.sampleSize([1, 2, 3], 2);\\n * // => [3, 1]\\n *\\n * _.sampleSize([1, 2, 3], 4);\\n * // => [2, 3, 1]\\n */\\n function sampleSize(collection, n, guard) {\\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\\n n = 1;\\n } else {\\n n = toInteger(n);\\n }\\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\\n return func(collection, n);\\n }\\n\\n /**\\n * Creates an array of shuffled values, using a version of the\\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n * @example\\n *\\n * _.shuffle([1, 2, 3, 4]);\\n * // => [4, 1, 3, 2]\\n */\\n function shuffle(collection) {\\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\\n return func(collection);\\n }\\n\\n /**\\n * Gets the size of `collection` by returning its length for array-like\\n * values or the number of own enumerable string keyed properties for objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object|string} collection The collection to inspect.\\n * @returns {number} Returns the collection size.\\n * @example\\n *\\n * _.size([1, 2, 3]);\\n * // => 3\\n *\\n * _.size({ 'a': 1, 'b': 2 });\\n * // => 2\\n *\\n * _.size('pebbles');\\n * // => 7\\n */\\n function size(collection) {\\n if (collection == null) {\\n return 0;\\n }\\n if (isArrayLike(collection)) {\\n return isString(collection) ? stringSize(collection) : collection.length;\\n }\\n var tag = getTag(collection);\\n if (tag == mapTag || tag == setTag) {\\n return collection.size;\\n }\\n return baseKeys(collection).length;\\n }\\n\\n /**\\n * Checks if `predicate` returns truthy for **any** element of `collection`.\\n * Iteration is stopped once `predicate` returns truthy. The predicate is\\n * invoked with three arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n * @example\\n *\\n * _.some([null, 0, 'yes', false], Boolean);\\n * // => true\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false }\\n * ];\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.some(users, { 'user': 'barney', 'active': false });\\n * // => false\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.some(users, ['active', false]);\\n * // => true\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.some(users, 'active');\\n * // => true\\n */\\n function some(collection, predicate, guard) {\\n var func = isArray(collection) ? arraySome : baseSome;\\n if (guard && isIterateeCall(collection, predicate, guard)) {\\n predicate = undefined;\\n }\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Creates an array of elements, sorted in ascending order by the results of\\n * running each element in a collection thru each iteratee. This method\\n * performs a stable sort, that is, it preserves the original sort order of\\n * equal elements. The iteratees are invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\\n * The iteratees to sort by.\\n * @returns {Array} Returns the new sorted array.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'fred', 'age': 48 },\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'barney', 'age': 34 }\\n * ];\\n *\\n * _.sortBy(users, [function(o) { return o.user; }]);\\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\\n *\\n * _.sortBy(users, ['user', 'age']);\\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\\n */\\n var sortBy = baseRest(function(collection, iteratees) {\\n if (collection == null) {\\n return [];\\n }\\n var length = iteratees.length;\\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\\n iteratees = [];\\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\\n iteratees = [iteratees[0]];\\n }\\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\\n });\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Gets the timestamp of the number of milliseconds that have elapsed since\\n * the Unix epoch (1 January 1970 00:00:00 UTC).\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Date\\n * @returns {number} Returns the timestamp.\\n * @example\\n *\\n * _.defer(function(stamp) {\\n * console.log(_.now() - stamp);\\n * }, _.now());\\n * // => Logs the number of milliseconds it took for the deferred invocation.\\n */\\n var now = ctxNow || function() {\\n return root.Date.now();\\n };\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * The opposite of `_.before`; this method creates a function that invokes\\n * `func` once it's called `n` or more times.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {number} n The number of calls before `func` is invoked.\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * var saves = ['profile', 'settings'];\\n *\\n * var done = _.after(saves.length, function() {\\n * console.log('done saving!');\\n * });\\n *\\n * _.forEach(saves, function(type) {\\n * asyncSave({ 'type': type, 'complete': done });\\n * });\\n * // => Logs 'done saving!' after the two async saves have completed.\\n */\\n function after(n, func) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n n = toInteger(n);\\n return function() {\\n if (--n < 1) {\\n return func.apply(this, arguments);\\n }\\n };\\n }\\n\\n /**\\n * Creates a function that invokes `func`, with up to `n` arguments,\\n * ignoring any additional arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to cap arguments for.\\n * @param {number} [n=func.length] The arity cap.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new capped function.\\n * @example\\n *\\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\\n * // => [6, 8, 10]\\n */\\n function ary(func, n, guard) {\\n n = guard ? undefined : n;\\n n = (func && n == null) ? func.length : n;\\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\\n }\\n\\n /**\\n * Creates a function that invokes `func`, with the `this` binding and arguments\\n * of the created function, while it's called less than `n` times. Subsequent\\n * calls to the created function return the result of the last `func` invocation.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {number} n The number of calls at which `func` is no longer invoked.\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * jQuery(element).on('click', _.before(5, addContactToList));\\n * // => Allows adding up to 4 contacts to the list.\\n */\\n function before(n, func) {\\n var result;\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n n = toInteger(n);\\n return function() {\\n if (--n > 0) {\\n result = func.apply(this, arguments);\\n }\\n if (n <= 1) {\\n func = undefined;\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\\n * and `partials` prepended to the arguments it receives.\\n *\\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\\n * may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \\\"length\\\"\\n * property of bound functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to bind.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new bound function.\\n * @example\\n *\\n * function greet(greeting, punctuation) {\\n * return greeting + ' ' + this.user + punctuation;\\n * }\\n *\\n * var object = { 'user': 'fred' };\\n *\\n * var bound = _.bind(greet, object, 'hi');\\n * bound('!');\\n * // => 'hi fred!'\\n *\\n * // Bound with placeholders.\\n * var bound = _.bind(greet, object, _, '!');\\n * bound('hi');\\n * // => 'hi fred!'\\n */\\n var bind = baseRest(function(func, thisArg, partials) {\\n var bitmask = WRAP_BIND_FLAG;\\n if (partials.length) {\\n var holders = replaceHolders(partials, getHolder(bind));\\n bitmask |= WRAP_PARTIAL_FLAG;\\n }\\n return createWrap(func, bitmask, thisArg, partials, holders);\\n });\\n\\n /**\\n * Creates a function that invokes the method at `object[key]` with `partials`\\n * prepended to the arguments it receives.\\n *\\n * This method differs from `_.bind` by allowing bound functions to reference\\n * methods that may be redefined or don't yet exist. See\\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\\n * for more details.\\n *\\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.10.0\\n * @category Function\\n * @param {Object} object The object to invoke the method on.\\n * @param {string} key The key of the method.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new bound function.\\n * @example\\n *\\n * var object = {\\n * 'user': 'fred',\\n * 'greet': function(greeting, punctuation) {\\n * return greeting + ' ' + this.user + punctuation;\\n * }\\n * };\\n *\\n * var bound = _.bindKey(object, 'greet', 'hi');\\n * bound('!');\\n * // => 'hi fred!'\\n *\\n * object.greet = function(greeting, punctuation) {\\n * return greeting + 'ya ' + this.user + punctuation;\\n * };\\n *\\n * bound('!');\\n * // => 'hiya fred!'\\n *\\n * // Bound with placeholders.\\n * var bound = _.bindKey(object, 'greet', _, '!');\\n * bound('hi');\\n * // => 'hiya fred!'\\n */\\n var bindKey = baseRest(function(object, key, partials) {\\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\\n if (partials.length) {\\n var holders = replaceHolders(partials, getHolder(bindKey));\\n bitmask |= WRAP_PARTIAL_FLAG;\\n }\\n return createWrap(key, bitmask, object, partials, holders);\\n });\\n\\n /**\\n * Creates a function that accepts arguments of `func` and either invokes\\n * `func` returning its result, if at least `arity` number of arguments have\\n * been provided, or returns a function that accepts the remaining `func`\\n * arguments, and so on. The arity of `func` may be specified if `func.length`\\n * is not sufficient.\\n *\\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\\n * may be used as a placeholder for provided arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of curried functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Function\\n * @param {Function} func The function to curry.\\n * @param {number} [arity=func.length] The arity of `func`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new curried function.\\n * @example\\n *\\n * var abc = function(a, b, c) {\\n * return [a, b, c];\\n * };\\n *\\n * var curried = _.curry(abc);\\n *\\n * curried(1)(2)(3);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2)(3);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2, 3);\\n * // => [1, 2, 3]\\n *\\n * // Curried with placeholders.\\n * curried(1)(_, 3)(2);\\n * // => [1, 2, 3]\\n */\\n function curry(func, arity, guard) {\\n arity = guard ? undefined : arity;\\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\\n result.placeholder = curry.placeholder;\\n return result;\\n }\\n\\n /**\\n * This method is like `_.curry` except that arguments are applied to `func`\\n * in the manner of `_.partialRight` instead of `_.partial`.\\n *\\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for provided arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of curried functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to curry.\\n * @param {number} [arity=func.length] The arity of `func`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new curried function.\\n * @example\\n *\\n * var abc = function(a, b, c) {\\n * return [a, b, c];\\n * };\\n *\\n * var curried = _.curryRight(abc);\\n *\\n * curried(3)(2)(1);\\n * // => [1, 2, 3]\\n *\\n * curried(2, 3)(1);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2, 3);\\n * // => [1, 2, 3]\\n *\\n * // Curried with placeholders.\\n * curried(3)(1, _)(2);\\n * // => [1, 2, 3]\\n */\\n function curryRight(func, arity, guard) {\\n arity = guard ? undefined : arity;\\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\\n result.placeholder = curryRight.placeholder;\\n return result;\\n }\\n\\n /**\\n * Creates a debounced function that delays invoking `func` until after `wait`\\n * milliseconds have elapsed since the last time the debounced function was\\n * invoked. The debounced function comes with a `cancel` method to cancel\\n * delayed `func` invocations and a `flush` method to immediately invoke them.\\n * Provide `options` to indicate whether `func` should be invoked on the\\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\\n * with the last arguments provided to the debounced function. Subsequent\\n * calls to the debounced function return the result of the last `func`\\n * invocation.\\n *\\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\\n * invoked on the trailing edge of the timeout only if the debounced function\\n * is invoked more than once during the `wait` timeout.\\n *\\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\\n *\\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\\n * for details over the differences between `_.debounce` and `_.throttle`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to debounce.\\n * @param {number} [wait=0] The number of milliseconds to delay.\\n * @param {Object} [options={}] The options object.\\n * @param {boolean} [options.leading=false]\\n * Specify invoking on the leading edge of the timeout.\\n * @param {number} [options.maxWait]\\n * The maximum time `func` is allowed to be delayed before it's invoked.\\n * @param {boolean} [options.trailing=true]\\n * Specify invoking on the trailing edge of the timeout.\\n * @returns {Function} Returns the new debounced function.\\n * @example\\n *\\n * // Avoid costly calculations while the window size is in flux.\\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\\n *\\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\\n * 'leading': true,\\n * 'trailing': false\\n * }));\\n *\\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\\n * var source = new EventSource('/stream');\\n * jQuery(source).on('message', debounced);\\n *\\n * // Cancel the trailing debounced invocation.\\n * jQuery(window).on('popstate', debounced.cancel);\\n */\\n function debounce(func, wait, options) {\\n var lastArgs,\\n lastThis,\\n maxWait,\\n result,\\n timerId,\\n lastCallTime,\\n lastInvokeTime = 0,\\n leading = false,\\n maxing = false,\\n trailing = true;\\n\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n wait = toNumber(wait) || 0;\\n if (isObject(options)) {\\n leading = !!options.leading;\\n maxing = 'maxWait' in options;\\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\\n trailing = 'trailing' in options ? !!options.trailing : trailing;\\n }\\n\\n function invokeFunc(time) {\\n var args = lastArgs,\\n thisArg = lastThis;\\n\\n lastArgs = lastThis = undefined;\\n lastInvokeTime = time;\\n result = func.apply(thisArg, args);\\n return result;\\n }\\n\\n function leadingEdge(time) {\\n // Reset any `maxWait` timer.\\n lastInvokeTime = time;\\n // Start the timer for the trailing edge.\\n timerId = setTimeout(timerExpired, wait);\\n // Invoke the leading edge.\\n return leading ? invokeFunc(time) : result;\\n }\\n\\n function remainingWait(time) {\\n var timeSinceLastCall = time - lastCallTime,\\n timeSinceLastInvoke = time - lastInvokeTime,\\n result = wait - timeSinceLastCall;\\n\\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\\n }\\n\\n function shouldInvoke(time) {\\n var timeSinceLastCall = time - lastCallTime,\\n timeSinceLastInvoke = time - lastInvokeTime;\\n\\n // Either this is the first call, activity has stopped and we're at the\\n // trailing edge, the system time has gone backwards and we're treating\\n // it as the trailing edge, or we've hit the `maxWait` limit.\\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\\n }\\n\\n function timerExpired() {\\n var time = now();\\n if (shouldInvoke(time)) {\\n return trailingEdge(time);\\n }\\n // Restart the timer.\\n timerId = setTimeout(timerExpired, remainingWait(time));\\n }\\n\\n function trailingEdge(time) {\\n timerId = undefined;\\n\\n // Only invoke if we have `lastArgs` which means `func` has been\\n // debounced at least once.\\n if (trailing && lastArgs) {\\n return invokeFunc(time);\\n }\\n lastArgs = lastThis = undefined;\\n return result;\\n }\\n\\n function cancel() {\\n if (timerId !== undefined) {\\n clearTimeout(timerId);\\n }\\n lastInvokeTime = 0;\\n lastArgs = lastCallTime = lastThis = timerId = undefined;\\n }\\n\\n function flush() {\\n return timerId === undefined ? result : trailingEdge(now());\\n }\\n\\n function debounced() {\\n var time = now(),\\n isInvoking = shouldInvoke(time);\\n\\n lastArgs = arguments;\\n lastThis = this;\\n lastCallTime = time;\\n\\n if (isInvoking) {\\n if (timerId === undefined) {\\n return leadingEdge(lastCallTime);\\n }\\n if (maxing) {\\n // Handle invocations in a tight loop.\\n timerId = setTimeout(timerExpired, wait);\\n return invokeFunc(lastCallTime);\\n }\\n }\\n if (timerId === undefined) {\\n timerId = setTimeout(timerExpired, wait);\\n }\\n return result;\\n }\\n debounced.cancel = cancel;\\n debounced.flush = flush;\\n return debounced;\\n }\\n\\n /**\\n * Defers invoking the `func` until the current call stack has cleared. Any\\n * additional arguments are provided to `func` when it's invoked.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to defer.\\n * @param {...*} [args] The arguments to invoke `func` with.\\n * @returns {number} Returns the timer id.\\n * @example\\n *\\n * _.defer(function(text) {\\n * console.log(text);\\n * }, 'deferred');\\n * // => Logs 'deferred' after one millisecond.\\n */\\n var defer = baseRest(function(func, args) {\\n return baseDelay(func, 1, args);\\n });\\n\\n /**\\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\\n * provided to `func` when it's invoked.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @param {...*} [args] The arguments to invoke `func` with.\\n * @returns {number} Returns the timer id.\\n * @example\\n *\\n * _.delay(function(text) {\\n * console.log(text);\\n * }, 1000, 'later');\\n * // => Logs 'later' after one second.\\n */\\n var delay = baseRest(function(func, wait, args) {\\n return baseDelay(func, toNumber(wait) || 0, args);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with arguments reversed.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to flip arguments for.\\n * @returns {Function} Returns the new flipped function.\\n * @example\\n *\\n * var flipped = _.flip(function() {\\n * return _.toArray(arguments);\\n * });\\n *\\n * flipped('a', 'b', 'c', 'd');\\n * // => ['d', 'c', 'b', 'a']\\n */\\n function flip(func) {\\n return createWrap(func, WRAP_FLIP_FLAG);\\n }\\n\\n /**\\n * Creates a function that memoizes the result of `func`. If `resolver` is\\n * provided, it determines the cache key for storing the result based on the\\n * arguments provided to the memoized function. By default, the first argument\\n * provided to the memoized function is used as the map cache key. The `func`\\n * is invoked with the `this` binding of the memoized function.\\n *\\n * **Note:** The cache is exposed as the `cache` property on the memoized\\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\\n * constructor with one whose instances implement the\\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to have its output memoized.\\n * @param {Function} [resolver] The function to resolve the cache key.\\n * @returns {Function} Returns the new memoized function.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n * var other = { 'c': 3, 'd': 4 };\\n *\\n * var values = _.memoize(_.values);\\n * values(object);\\n * // => [1, 2]\\n *\\n * values(other);\\n * // => [3, 4]\\n *\\n * object.a = 2;\\n * values(object);\\n * // => [1, 2]\\n *\\n * // Modify the result cache.\\n * values.cache.set(object, ['a', 'b']);\\n * values(object);\\n * // => ['a', 'b']\\n *\\n * // Replace `_.memoize.Cache`.\\n * _.memoize.Cache = WeakMap;\\n */\\n function memoize(func, resolver) {\\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n var memoized = function() {\\n var args = arguments,\\n key = resolver ? resolver.apply(this, args) : args[0],\\n cache = memoized.cache;\\n\\n if (cache.has(key)) {\\n return cache.get(key);\\n }\\n var result = func.apply(this, args);\\n memoized.cache = cache.set(key, result) || cache;\\n return result;\\n };\\n memoized.cache = new (memoize.Cache || MapCache);\\n return memoized;\\n }\\n\\n // Expose `MapCache`.\\n memoize.Cache = MapCache;\\n\\n /**\\n * Creates a function that negates the result of the predicate `func`. The\\n * `func` predicate is invoked with the `this` binding and arguments of the\\n * created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} predicate The predicate to negate.\\n * @returns {Function} Returns the new negated function.\\n * @example\\n *\\n * function isEven(n) {\\n * return n % 2 == 0;\\n * }\\n *\\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\\n * // => [1, 3, 5]\\n */\\n function negate(predicate) {\\n if (typeof predicate != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n return function() {\\n var args = arguments;\\n switch (args.length) {\\n case 0: return !predicate.call(this);\\n case 1: return !predicate.call(this, args[0]);\\n case 2: return !predicate.call(this, args[0], args[1]);\\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\\n }\\n return !predicate.apply(this, args);\\n };\\n }\\n\\n /**\\n * Creates a function that is restricted to invoking `func` once. Repeat calls\\n * to the function return the value of the first invocation. The `func` is\\n * invoked with the `this` binding and arguments of the created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * var initialize = _.once(createApplication);\\n * initialize();\\n * initialize();\\n * // => `createApplication` is invoked once\\n */\\n function once(func) {\\n return before(2, func);\\n }\\n\\n /**\\n * Creates a function that invokes `func` with its arguments transformed.\\n *\\n * @static\\n * @since 4.0.0\\n * @memberOf _\\n * @category Function\\n * @param {Function} func The function to wrap.\\n * @param {...(Function|Function[])} [transforms=[_.identity]]\\n * The argument transforms.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * function doubled(n) {\\n * return n * 2;\\n * }\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var func = _.overArgs(function(x, y) {\\n * return [x, y];\\n * }, [square, doubled]);\\n *\\n * func(9, 3);\\n * // => [81, 6]\\n *\\n * func(10, 5);\\n * // => [100, 10]\\n */\\n var overArgs = castRest(function(func, transforms) {\\n transforms = (transforms.length == 1 && isArray(transforms[0]))\\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\\n\\n var funcsLength = transforms.length;\\n return baseRest(function(args) {\\n var index = -1,\\n length = nativeMin(args.length, funcsLength);\\n\\n while (++index < length) {\\n args[index] = transforms[index].call(this, args[index]);\\n }\\n return apply(func, this, args);\\n });\\n });\\n\\n /**\\n * Creates a function that invokes `func` with `partials` prepended to the\\n * arguments it receives. This method is like `_.bind` except it does **not**\\n * alter the `this` binding.\\n *\\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of partially\\n * applied functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.2.0\\n * @category Function\\n * @param {Function} func The function to partially apply arguments to.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new partially applied function.\\n * @example\\n *\\n * function greet(greeting, name) {\\n * return greeting + ' ' + name;\\n * }\\n *\\n * var sayHelloTo = _.partial(greet, 'hello');\\n * sayHelloTo('fred');\\n * // => 'hello fred'\\n *\\n * // Partially applied with placeholders.\\n * var greetFred = _.partial(greet, _, 'fred');\\n * greetFred('hi');\\n * // => 'hi fred'\\n */\\n var partial = baseRest(function(func, partials) {\\n var holders = replaceHolders(partials, getHolder(partial));\\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\\n });\\n\\n /**\\n * This method is like `_.partial` except that partially applied arguments\\n * are appended to the arguments it receives.\\n *\\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of partially\\n * applied functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Function\\n * @param {Function} func The function to partially apply arguments to.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new partially applied function.\\n * @example\\n *\\n * function greet(greeting, name) {\\n * return greeting + ' ' + name;\\n * }\\n *\\n * var greetFred = _.partialRight(greet, 'fred');\\n * greetFred('hi');\\n * // => 'hi fred'\\n *\\n * // Partially applied with placeholders.\\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\\n * sayHelloTo('fred');\\n * // => 'hello fred'\\n */\\n var partialRight = baseRest(function(func, partials) {\\n var holders = replaceHolders(partials, getHolder(partialRight));\\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with arguments arranged according\\n * to the specified `indexes` where the argument value at the first index is\\n * provided as the first argument, the argument value at the second index is\\n * provided as the second argument, and so on.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to rearrange arguments for.\\n * @param {...(number|number[])} indexes The arranged argument indexes.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var rearged = _.rearg(function(a, b, c) {\\n * return [a, b, c];\\n * }, [2, 0, 1]);\\n *\\n * rearged('b', 'c', 'a')\\n * // => ['a', 'b', 'c']\\n */\\n var rearg = flatRest(function(func, indexes) {\\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of the\\n * created function and arguments from `start` and beyond provided as\\n * an array.\\n *\\n * **Note:** This method is based on the\\n * [rest parameter](https://mdn.io/rest_parameters).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var say = _.rest(function(what, names) {\\n * return what + ' ' + _.initial(names).join(', ') +\\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\\n * });\\n *\\n * say('hello', 'fred', 'barney', 'pebbles');\\n * // => 'hello fred, barney, & pebbles'\\n */\\n function rest(func, start) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n start = start === undefined ? start : toInteger(start);\\n return baseRest(func, start);\\n }\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of the\\n * create function and an array of arguments much like\\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\\n *\\n * **Note:** This method is based on the\\n * [spread operator](https://mdn.io/spread_operator).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.2.0\\n * @category Function\\n * @param {Function} func The function to spread arguments over.\\n * @param {number} [start=0] The start position of the spread.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var say = _.spread(function(who, what) {\\n * return who + ' says ' + what;\\n * });\\n *\\n * say(['fred', 'hello']);\\n * // => 'fred says hello'\\n *\\n * var numbers = Promise.all([\\n * Promise.resolve(40),\\n * Promise.resolve(36)\\n * ]);\\n *\\n * numbers.then(_.spread(function(x, y) {\\n * return x + y;\\n * }));\\n * // => a Promise of 76\\n */\\n function spread(func, start) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\\n return baseRest(function(args) {\\n var array = args[start],\\n otherArgs = castSlice(args, 0, start);\\n\\n if (array) {\\n arrayPush(otherArgs, array);\\n }\\n return apply(func, this, otherArgs);\\n });\\n }\\n\\n /**\\n * Creates a throttled function that only invokes `func` at most once per\\n * every `wait` milliseconds. The throttled function comes with a `cancel`\\n * method to cancel delayed `func` invocations and a `flush` method to\\n * immediately invoke them. Provide `options` to indicate whether `func`\\n * should be invoked on the leading and/or trailing edge of the `wait`\\n * timeout. The `func` is invoked with the last arguments provided to the\\n * throttled function. Subsequent calls to the throttled function return the\\n * result of the last `func` invocation.\\n *\\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\\n * invoked on the trailing edge of the timeout only if the throttled function\\n * is invoked more than once during the `wait` timeout.\\n *\\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\\n *\\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\\n * for details over the differences between `_.throttle` and `_.debounce`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to throttle.\\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\\n * @param {Object} [options={}] The options object.\\n * @param {boolean} [options.leading=true]\\n * Specify invoking on the leading edge of the timeout.\\n * @param {boolean} [options.trailing=true]\\n * Specify invoking on the trailing edge of the timeout.\\n * @returns {Function} Returns the new throttled function.\\n * @example\\n *\\n * // Avoid excessively updating the position while scrolling.\\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\\n *\\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\\n * jQuery(element).on('click', throttled);\\n *\\n * // Cancel the trailing throttled invocation.\\n * jQuery(window).on('popstate', throttled.cancel);\\n */\\n function throttle(func, wait, options) {\\n var leading = true,\\n trailing = true;\\n\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n if (isObject(options)) {\\n leading = 'leading' in options ? !!options.leading : leading;\\n trailing = 'trailing' in options ? !!options.trailing : trailing;\\n }\\n return debounce(func, wait, {\\n 'leading': leading,\\n 'maxWait': wait,\\n 'trailing': trailing\\n });\\n }\\n\\n /**\\n * Creates a function that accepts up to one argument, ignoring any\\n * additional arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to cap arguments for.\\n * @returns {Function} Returns the new capped function.\\n * @example\\n *\\n * _.map(['6', '8', '10'], _.unary(parseInt));\\n * // => [6, 8, 10]\\n */\\n function unary(func) {\\n return ary(func, 1);\\n }\\n\\n /**\\n * Creates a function that provides `value` to `wrapper` as its first\\n * argument. Any additional arguments provided to the function are appended\\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\\n * binding of the created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {*} value The value to wrap.\\n * @param {Function} [wrapper=identity] The wrapper function.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var p = _.wrap(_.escape, function(func, text) {\\n * return '

' + func(text) + '

';\\n * });\\n *\\n * p('fred, barney, & pebbles');\\n * // => '

fred, barney, & pebbles

'\\n */\\n function wrap(value, wrapper) {\\n return partial(castFunction(wrapper), value);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Casts `value` as an array if it's not one.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.4.0\\n * @category Lang\\n * @param {*} value The value to inspect.\\n * @returns {Array} Returns the cast array.\\n * @example\\n *\\n * _.castArray(1);\\n * // => [1]\\n *\\n * _.castArray({ 'a': 1 });\\n * // => [{ 'a': 1 }]\\n *\\n * _.castArray('abc');\\n * // => ['abc']\\n *\\n * _.castArray(null);\\n * // => [null]\\n *\\n * _.castArray(undefined);\\n * // => [undefined]\\n *\\n * _.castArray();\\n * // => []\\n *\\n * var array = [1, 2, 3];\\n * console.log(_.castArray(array) === array);\\n * // => true\\n */\\n function castArray() {\\n if (!arguments.length) {\\n return [];\\n }\\n var value = arguments[0];\\n return isArray(value) ? value : [value];\\n }\\n\\n /**\\n * Creates a shallow clone of `value`.\\n *\\n * **Note:** This method is loosely based on the\\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\\n * arrays. The own enumerable properties of `arguments` objects are cloned\\n * as plain objects. An empty object is returned for uncloneable values such\\n * as error objects, functions, DOM nodes, and WeakMaps.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to clone.\\n * @returns {*} Returns the cloned value.\\n * @see _.cloneDeep\\n * @example\\n *\\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\\n *\\n * var shallow = _.clone(objects);\\n * console.log(shallow[0] === objects[0]);\\n * // => true\\n */\\n function clone(value) {\\n return baseClone(value, CLONE_SYMBOLS_FLAG);\\n }\\n\\n /**\\n * This method is like `_.clone` except that it accepts `customizer` which\\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\\n * cloning is handled by the method instead. The `customizer` is invoked with\\n * up to four arguments; (value [, index|key, object, stack]).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to clone.\\n * @param {Function} [customizer] The function to customize cloning.\\n * @returns {*} Returns the cloned value.\\n * @see _.cloneDeepWith\\n * @example\\n *\\n * function customizer(value) {\\n * if (_.isElement(value)) {\\n * return value.cloneNode(false);\\n * }\\n * }\\n *\\n * var el = _.cloneWith(document.body, customizer);\\n *\\n * console.log(el === document.body);\\n * // => false\\n * console.log(el.nodeName);\\n * // => 'BODY'\\n * console.log(el.childNodes.length);\\n * // => 0\\n */\\n function cloneWith(value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\\n }\\n\\n /**\\n * This method is like `_.clone` except that it recursively clones `value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Lang\\n * @param {*} value The value to recursively clone.\\n * @returns {*} Returns the deep cloned value.\\n * @see _.clone\\n * @example\\n *\\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\\n *\\n * var deep = _.cloneDeep(objects);\\n * console.log(deep[0] === objects[0]);\\n * // => false\\n */\\n function cloneDeep(value) {\\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\\n }\\n\\n /**\\n * This method is like `_.cloneWith` except that it recursively clones `value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to recursively clone.\\n * @param {Function} [customizer] The function to customize cloning.\\n * @returns {*} Returns the deep cloned value.\\n * @see _.cloneWith\\n * @example\\n *\\n * function customizer(value) {\\n * if (_.isElement(value)) {\\n * return value.cloneNode(true);\\n * }\\n * }\\n *\\n * var el = _.cloneDeepWith(document.body, customizer);\\n *\\n * console.log(el === document.body);\\n * // => false\\n * console.log(el.nodeName);\\n * // => 'BODY'\\n * console.log(el.childNodes.length);\\n * // => 20\\n */\\n function cloneDeepWith(value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\\n }\\n\\n /**\\n * Checks if `object` conforms to `source` by invoking the predicate\\n * properties of `source` with the corresponding property values of `object`.\\n *\\n * **Note:** This method is equivalent to `_.conforms` when `source` is\\n * partially applied.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.14.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n *\\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\\n * // => true\\n *\\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\\n * // => false\\n */\\n function conformsTo(object, source) {\\n return source == null || baseConformsTo(object, source, keys(source));\\n }\\n\\n /**\\n * Performs a\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * comparison between two values to determine if they are equivalent.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1 };\\n * var other = { 'a': 1 };\\n *\\n * _.eq(object, object);\\n * // => true\\n *\\n * _.eq(object, other);\\n * // => false\\n *\\n * _.eq('a', 'a');\\n * // => true\\n *\\n * _.eq('a', Object('a'));\\n * // => false\\n *\\n * _.eq(NaN, NaN);\\n * // => true\\n */\\n function eq(value, other) {\\n return value === other || (value !== value && other !== other);\\n }\\n\\n /**\\n * Checks if `value` is greater than `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\\n * else `false`.\\n * @see _.lt\\n * @example\\n *\\n * _.gt(3, 1);\\n * // => true\\n *\\n * _.gt(3, 3);\\n * // => false\\n *\\n * _.gt(1, 3);\\n * // => false\\n */\\n var gt = createRelationalOperation(baseGt);\\n\\n /**\\n * Checks if `value` is greater than or equal to `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\\n * `other`, else `false`.\\n * @see _.lte\\n * @example\\n *\\n * _.gte(3, 1);\\n * // => true\\n *\\n * _.gte(3, 3);\\n * // => true\\n *\\n * _.gte(1, 3);\\n * // => false\\n */\\n var gte = createRelationalOperation(function(value, other) {\\n return value >= other;\\n });\\n\\n /**\\n * Checks if `value` is likely an `arguments` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\\n * else `false`.\\n * @example\\n *\\n * _.isArguments(function() { return arguments; }());\\n * // => true\\n *\\n * _.isArguments([1, 2, 3]);\\n * // => false\\n */\\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\\n !propertyIsEnumerable.call(value, 'callee');\\n };\\n\\n /**\\n * Checks if `value` is classified as an `Array` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\\n * @example\\n *\\n * _.isArray([1, 2, 3]);\\n * // => true\\n *\\n * _.isArray(document.body.children);\\n * // => false\\n *\\n * _.isArray('abc');\\n * // => false\\n *\\n * _.isArray(_.noop);\\n * // => false\\n */\\n var isArray = Array.isArray;\\n\\n /**\\n * Checks if `value` is classified as an `ArrayBuffer` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\\n * @example\\n *\\n * _.isArrayBuffer(new ArrayBuffer(2));\\n * // => true\\n *\\n * _.isArrayBuffer(new Array(2));\\n * // => false\\n */\\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\\n\\n /**\\n * Checks if `value` is array-like. A value is considered array-like if it's\\n * not a function and has a `value.length` that's an integer greater than or\\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\\n * @example\\n *\\n * _.isArrayLike([1, 2, 3]);\\n * // => true\\n *\\n * _.isArrayLike(document.body.children);\\n * // => true\\n *\\n * _.isArrayLike('abc');\\n * // => true\\n *\\n * _.isArrayLike(_.noop);\\n * // => false\\n */\\n function isArrayLike(value) {\\n return value != null && isLength(value.length) && !isFunction(value);\\n }\\n\\n /**\\n * This method is like `_.isArrayLike` except that it also checks if `value`\\n * is an object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array-like object,\\n * else `false`.\\n * @example\\n *\\n * _.isArrayLikeObject([1, 2, 3]);\\n * // => true\\n *\\n * _.isArrayLikeObject(document.body.children);\\n * // => true\\n *\\n * _.isArrayLikeObject('abc');\\n * // => false\\n *\\n * _.isArrayLikeObject(_.noop);\\n * // => false\\n */\\n function isArrayLikeObject(value) {\\n return isObjectLike(value) && isArrayLike(value);\\n }\\n\\n /**\\n * Checks if `value` is classified as a boolean primitive or object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\\n * @example\\n *\\n * _.isBoolean(false);\\n * // => true\\n *\\n * _.isBoolean(null);\\n * // => false\\n */\\n function isBoolean(value) {\\n return value === true || value === false ||\\n (isObjectLike(value) && baseGetTag(value) == boolTag);\\n }\\n\\n /**\\n * Checks if `value` is a buffer.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\\n * @example\\n *\\n * _.isBuffer(new Buffer(2));\\n * // => true\\n *\\n * _.isBuffer(new Uint8Array(2));\\n * // => false\\n */\\n var isBuffer = nativeIsBuffer || stubFalse;\\n\\n /**\\n * Checks if `value` is classified as a `Date` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\\n * @example\\n *\\n * _.isDate(new Date);\\n * // => true\\n *\\n * _.isDate('Mon April 23 2012');\\n * // => false\\n */\\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\\n\\n /**\\n * Checks if `value` is likely a DOM element.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\\n * @example\\n *\\n * _.isElement(document.body);\\n * // => true\\n *\\n * _.isElement('');\\n * // => false\\n */\\n function isElement(value) {\\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\\n }\\n\\n /**\\n * Checks if `value` is an empty object, collection, map, or set.\\n *\\n * Objects are considered empty if they have no own enumerable string keyed\\n * properties.\\n *\\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\\n * jQuery-like collections are considered empty if they have a `length` of `0`.\\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\\n * @example\\n *\\n * _.isEmpty(null);\\n * // => true\\n *\\n * _.isEmpty(true);\\n * // => true\\n *\\n * _.isEmpty(1);\\n * // => true\\n *\\n * _.isEmpty([1, 2, 3]);\\n * // => false\\n *\\n * _.isEmpty({ 'a': 1 });\\n * // => false\\n */\\n function isEmpty(value) {\\n if (value == null) {\\n return true;\\n }\\n if (isArrayLike(value) &&\\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\\n return !value.length;\\n }\\n var tag = getTag(value);\\n if (tag == mapTag || tag == setTag) {\\n return !value.size;\\n }\\n if (isPrototype(value)) {\\n return !baseKeys(value).length;\\n }\\n for (var key in value) {\\n if (hasOwnProperty.call(value, key)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * Performs a deep comparison between two values to determine if they are\\n * equivalent.\\n *\\n * **Note:** This method supports comparing arrays, array buffers, booleans,\\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\\n * by their own, not inherited, enumerable properties. Functions and DOM\\n * nodes are compared by strict equality, i.e. `===`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1 };\\n * var other = { 'a': 1 };\\n *\\n * _.isEqual(object, other);\\n * // => true\\n *\\n * object === other;\\n * // => false\\n */\\n function isEqual(value, other) {\\n return baseIsEqual(value, other);\\n }\\n\\n /**\\n * This method is like `_.isEqual` except that it accepts `customizer` which\\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\\n * are handled by the method instead. The `customizer` is invoked with up to\\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * function isGreeting(value) {\\n * return /^h(?:i|ello)$/.test(value);\\n * }\\n *\\n * function customizer(objValue, othValue) {\\n * if (isGreeting(objValue) && isGreeting(othValue)) {\\n * return true;\\n * }\\n * }\\n *\\n * var array = ['hello', 'goodbye'];\\n * var other = ['hi', 'goodbye'];\\n *\\n * _.isEqualWith(array, other, customizer);\\n * // => true\\n */\\n function isEqualWith(value, other, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n var result = customizer ? customizer(value, other) : undefined;\\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\\n }\\n\\n /**\\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\\n * `SyntaxError`, `TypeError`, or `URIError` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\\n * @example\\n *\\n * _.isError(new Error);\\n * // => true\\n *\\n * _.isError(Error);\\n * // => false\\n */\\n function isError(value) {\\n if (!isObjectLike(value)) {\\n return false;\\n }\\n var tag = baseGetTag(value);\\n return tag == errorTag || tag == domExcTag ||\\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\\n }\\n\\n /**\\n * Checks if `value` is a finite primitive number.\\n *\\n * **Note:** This method is based on\\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\\n * @example\\n *\\n * _.isFinite(3);\\n * // => true\\n *\\n * _.isFinite(Number.MIN_VALUE);\\n * // => true\\n *\\n * _.isFinite(Infinity);\\n * // => false\\n *\\n * _.isFinite('3');\\n * // => false\\n */\\n function isFinite(value) {\\n return typeof value == 'number' && nativeIsFinite(value);\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Function` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\\n * @example\\n *\\n * _.isFunction(_);\\n * // => true\\n *\\n * _.isFunction(/abc/);\\n * // => false\\n */\\n function isFunction(value) {\\n if (!isObject(value)) {\\n return false;\\n }\\n // The use of `Object#toString` avoids issues with the `typeof` operator\\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\\n var tag = baseGetTag(value);\\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\\n }\\n\\n /**\\n * Checks if `value` is an integer.\\n *\\n * **Note:** This method is based on\\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\\n * @example\\n *\\n * _.isInteger(3);\\n * // => true\\n *\\n * _.isInteger(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isInteger(Infinity);\\n * // => false\\n *\\n * _.isInteger('3');\\n * // => false\\n */\\n function isInteger(value) {\\n return typeof value == 'number' && value == toInteger(value);\\n }\\n\\n /**\\n * Checks if `value` is a valid array-like length.\\n *\\n * **Note:** This method is loosely based on\\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\\n * @example\\n *\\n * _.isLength(3);\\n * // => true\\n *\\n * _.isLength(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isLength(Infinity);\\n * // => false\\n *\\n * _.isLength('3');\\n * // => false\\n */\\n function isLength(value) {\\n return typeof value == 'number' &&\\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\\n }\\n\\n /**\\n * Checks if `value` is the\\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\\n * @example\\n *\\n * _.isObject({});\\n * // => true\\n *\\n * _.isObject([1, 2, 3]);\\n * // => true\\n *\\n * _.isObject(_.noop);\\n * // => true\\n *\\n * _.isObject(null);\\n * // => false\\n */\\n function isObject(value) {\\n var type = typeof value;\\n return value != null && (type == 'object' || type == 'function');\\n }\\n\\n /**\\n * Checks if `value` is object-like. A value is object-like if it's not `null`\\n * and has a `typeof` result of \\\"object\\\".\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\\n * @example\\n *\\n * _.isObjectLike({});\\n * // => true\\n *\\n * _.isObjectLike([1, 2, 3]);\\n * // => true\\n *\\n * _.isObjectLike(_.noop);\\n * // => false\\n *\\n * _.isObjectLike(null);\\n * // => false\\n */\\n function isObjectLike(value) {\\n return value != null && typeof value == 'object';\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Map` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\\n * @example\\n *\\n * _.isMap(new Map);\\n * // => true\\n *\\n * _.isMap(new WeakMap);\\n * // => false\\n */\\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\\n\\n /**\\n * Performs a partial deep comparison between `object` and `source` to\\n * determine if `object` contains equivalent property values.\\n *\\n * **Note:** This method is equivalent to `_.matches` when `source` is\\n * partially applied.\\n *\\n * Partial comparisons will match empty array and empty object `source`\\n * values against any array or object value, respectively. See `_.isEqual`\\n * for a list of supported value comparisons.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n *\\n * _.isMatch(object, { 'b': 2 });\\n * // => true\\n *\\n * _.isMatch(object, { 'b': 1 });\\n * // => false\\n */\\n function isMatch(object, source) {\\n return object === source || baseIsMatch(object, source, getMatchData(source));\\n }\\n\\n /**\\n * This method is like `_.isMatch` except that it accepts `customizer` which\\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\\n * are handled by the method instead. The `customizer` is invoked with five\\n * arguments: (objValue, srcValue, index|key, object, source).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n * @example\\n *\\n * function isGreeting(value) {\\n * return /^h(?:i|ello)$/.test(value);\\n * }\\n *\\n * function customizer(objValue, srcValue) {\\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\\n * return true;\\n * }\\n * }\\n *\\n * var object = { 'greeting': 'hello' };\\n * var source = { 'greeting': 'hi' };\\n *\\n * _.isMatchWith(object, source, customizer);\\n * // => true\\n */\\n function isMatchWith(object, source, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseIsMatch(object, source, getMatchData(source), customizer);\\n }\\n\\n /**\\n * Checks if `value` is `NaN`.\\n *\\n * **Note:** This method is based on\\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\\n * `undefined` and other non-number values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\\n * @example\\n *\\n * _.isNaN(NaN);\\n * // => true\\n *\\n * _.isNaN(new Number(NaN));\\n * // => true\\n *\\n * isNaN(undefined);\\n * // => true\\n *\\n * _.isNaN(undefined);\\n * // => false\\n */\\n function isNaN(value) {\\n // An `NaN` primitive is the only value that is not equal to itself.\\n // Perform the `toStringTag` check first to avoid errors with some\\n // ActiveX objects in IE.\\n return isNumber(value) && value != +value;\\n }\\n\\n /**\\n * Checks if `value` is a pristine native function.\\n *\\n * **Note:** This method can't reliably detect native functions in the presence\\n * of the core-js package because core-js circumvents this kind of detection.\\n * Despite multiple requests, the core-js maintainer has made it clear: any\\n * attempt to fix the detection will be obstructed. As a result, we're left\\n * with little choice but to throw an error. Unfortunately, this also affects\\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\\n * which rely on core-js.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a native function,\\n * else `false`.\\n * @example\\n *\\n * _.isNative(Array.prototype.push);\\n * // => true\\n *\\n * _.isNative(_);\\n * // => false\\n */\\n function isNative(value) {\\n if (isMaskable(value)) {\\n throw new Error(CORE_ERROR_TEXT);\\n }\\n return baseIsNative(value);\\n }\\n\\n /**\\n * Checks if `value` is `null`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\\n * @example\\n *\\n * _.isNull(null);\\n * // => true\\n *\\n * _.isNull(void 0);\\n * // => false\\n */\\n function isNull(value) {\\n return value === null;\\n }\\n\\n /**\\n * Checks if `value` is `null` or `undefined`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\\n * @example\\n *\\n * _.isNil(null);\\n * // => true\\n *\\n * _.isNil(void 0);\\n * // => true\\n *\\n * _.isNil(NaN);\\n * // => false\\n */\\n function isNil(value) {\\n return value == null;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Number` primitive or object.\\n *\\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\\n * classified as numbers, use the `_.isFinite` method.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\\n * @example\\n *\\n * _.isNumber(3);\\n * // => true\\n *\\n * _.isNumber(Number.MIN_VALUE);\\n * // => true\\n *\\n * _.isNumber(Infinity);\\n * // => true\\n *\\n * _.isNumber('3');\\n * // => false\\n */\\n function isNumber(value) {\\n return typeof value == 'number' ||\\n (isObjectLike(value) && baseGetTag(value) == numberTag);\\n }\\n\\n /**\\n * Checks if `value` is a plain object, that is, an object created by the\\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.8.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * _.isPlainObject(new Foo);\\n * // => false\\n *\\n * _.isPlainObject([1, 2, 3]);\\n * // => false\\n *\\n * _.isPlainObject({ 'x': 0, 'y': 0 });\\n * // => true\\n *\\n * _.isPlainObject(Object.create(null));\\n * // => true\\n */\\n function isPlainObject(value) {\\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\\n return false;\\n }\\n var proto = getPrototype(value);\\n if (proto === null) {\\n return true;\\n }\\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\\n funcToString.call(Ctor) == objectCtorString;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `RegExp` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\\n * @example\\n *\\n * _.isRegExp(/abc/);\\n * // => true\\n *\\n * _.isRegExp('/abc/');\\n * // => false\\n */\\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\\n\\n /**\\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\\n * double precision number which isn't the result of a rounded unsafe integer.\\n *\\n * **Note:** This method is based on\\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\\n * @example\\n *\\n * _.isSafeInteger(3);\\n * // => true\\n *\\n * _.isSafeInteger(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isSafeInteger(Infinity);\\n * // => false\\n *\\n * _.isSafeInteger('3');\\n * // => false\\n */\\n function isSafeInteger(value) {\\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Set` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\\n * @example\\n *\\n * _.isSet(new Set);\\n * // => true\\n *\\n * _.isSet(new WeakSet);\\n * // => false\\n */\\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\\n\\n /**\\n * Checks if `value` is classified as a `String` primitive or object.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\\n * @example\\n *\\n * _.isString('abc');\\n * // => true\\n *\\n * _.isString(1);\\n * // => false\\n */\\n function isString(value) {\\n return typeof value == 'string' ||\\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Symbol` primitive or object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\\n * @example\\n *\\n * _.isSymbol(Symbol.iterator);\\n * // => true\\n *\\n * _.isSymbol('abc');\\n * // => false\\n */\\n function isSymbol(value) {\\n return typeof value == 'symbol' ||\\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\\n }\\n\\n /**\\n * Checks if `value` is classified as a typed array.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\\n * @example\\n *\\n * _.isTypedArray(new Uint8Array);\\n * // => true\\n *\\n * _.isTypedArray([]);\\n * // => false\\n */\\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\\n\\n /**\\n * Checks if `value` is `undefined`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\\n * @example\\n *\\n * _.isUndefined(void 0);\\n * // => true\\n *\\n * _.isUndefined(null);\\n * // => false\\n */\\n function isUndefined(value) {\\n return value === undefined;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `WeakMap` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\\n * @example\\n *\\n * _.isWeakMap(new WeakMap);\\n * // => true\\n *\\n * _.isWeakMap(new Map);\\n * // => false\\n */\\n function isWeakMap(value) {\\n return isObjectLike(value) && getTag(value) == weakMapTag;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `WeakSet` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\\n * @example\\n *\\n * _.isWeakSet(new WeakSet);\\n * // => true\\n *\\n * _.isWeakSet(new Set);\\n * // => false\\n */\\n function isWeakSet(value) {\\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\\n }\\n\\n /**\\n * Checks if `value` is less than `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than `other`,\\n * else `false`.\\n * @see _.gt\\n * @example\\n *\\n * _.lt(1, 3);\\n * // => true\\n *\\n * _.lt(3, 3);\\n * // => false\\n *\\n * _.lt(3, 1);\\n * // => false\\n */\\n var lt = createRelationalOperation(baseLt);\\n\\n /**\\n * Checks if `value` is less than or equal to `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than or equal to\\n * `other`, else `false`.\\n * @see _.gte\\n * @example\\n *\\n * _.lte(1, 3);\\n * // => true\\n *\\n * _.lte(3, 3);\\n * // => true\\n *\\n * _.lte(3, 1);\\n * // => false\\n */\\n var lte = createRelationalOperation(function(value, other) {\\n return value <= other;\\n });\\n\\n /**\\n * Converts `value` to an array.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {Array} Returns the converted array.\\n * @example\\n *\\n * _.toArray({ 'a': 1, 'b': 2 });\\n * // => [1, 2]\\n *\\n * _.toArray('abc');\\n * // => ['a', 'b', 'c']\\n *\\n * _.toArray(1);\\n * // => []\\n *\\n * _.toArray(null);\\n * // => []\\n */\\n function toArray(value) {\\n if (!value) {\\n return [];\\n }\\n if (isArrayLike(value)) {\\n return isString(value) ? stringToArray(value) : copyArray(value);\\n }\\n if (symIterator && value[symIterator]) {\\n return iteratorToArray(value[symIterator]());\\n }\\n var tag = getTag(value),\\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\\n\\n return func(value);\\n }\\n\\n /**\\n * Converts `value` to a finite number.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.12.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted number.\\n * @example\\n *\\n * _.toFinite(3.2);\\n * // => 3.2\\n *\\n * _.toFinite(Number.MIN_VALUE);\\n * // => 5e-324\\n *\\n * _.toFinite(Infinity);\\n * // => 1.7976931348623157e+308\\n *\\n * _.toFinite('3.2');\\n * // => 3.2\\n */\\n function toFinite(value) {\\n if (!value) {\\n return value === 0 ? value : 0;\\n }\\n value = toNumber(value);\\n if (value === INFINITY || value === -INFINITY) {\\n var sign = (value < 0 ? -1 : 1);\\n return sign * MAX_INTEGER;\\n }\\n return value === value ? value : 0;\\n }\\n\\n /**\\n * Converts `value` to an integer.\\n *\\n * **Note:** This method is loosely based on\\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toInteger(3.2);\\n * // => 3\\n *\\n * _.toInteger(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toInteger(Infinity);\\n * // => 1.7976931348623157e+308\\n *\\n * _.toInteger('3.2');\\n * // => 3\\n */\\n function toInteger(value) {\\n var result = toFinite(value),\\n remainder = result % 1;\\n\\n return result === result ? (remainder ? result - remainder : result) : 0;\\n }\\n\\n /**\\n * Converts `value` to an integer suitable for use as the length of an\\n * array-like object.\\n *\\n * **Note:** This method is based on\\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toLength(3.2);\\n * // => 3\\n *\\n * _.toLength(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toLength(Infinity);\\n * // => 4294967295\\n *\\n * _.toLength('3.2');\\n * // => 3\\n */\\n function toLength(value) {\\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\\n }\\n\\n /**\\n * Converts `value` to a number.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to process.\\n * @returns {number} Returns the number.\\n * @example\\n *\\n * _.toNumber(3.2);\\n * // => 3.2\\n *\\n * _.toNumber(Number.MIN_VALUE);\\n * // => 5e-324\\n *\\n * _.toNumber(Infinity);\\n * // => Infinity\\n *\\n * _.toNumber('3.2');\\n * // => 3.2\\n */\\n function toNumber(value) {\\n if (typeof value == 'number') {\\n return value;\\n }\\n if (isSymbol(value)) {\\n return NAN;\\n }\\n if (isObject(value)) {\\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\\n value = isObject(other) ? (other + '') : other;\\n }\\n if (typeof value != 'string') {\\n return value === 0 ? value : +value;\\n }\\n value = value.replace(reTrim, '');\\n var isBinary = reIsBinary.test(value);\\n return (isBinary || reIsOctal.test(value))\\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\\n : (reIsBadHex.test(value) ? NAN : +value);\\n }\\n\\n /**\\n * Converts `value` to a plain object flattening inherited enumerable string\\n * keyed properties of `value` to own properties of the plain object.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {Object} Returns the converted plain object.\\n * @example\\n *\\n * function Foo() {\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.assign({ 'a': 1 }, new Foo);\\n * // => { 'a': 1, 'b': 2 }\\n *\\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\\n * // => { 'a': 1, 'b': 2, 'c': 3 }\\n */\\n function toPlainObject(value) {\\n return copyObject(value, keysIn(value));\\n }\\n\\n /**\\n * Converts `value` to a safe integer. A safe integer can be compared and\\n * represented correctly.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toSafeInteger(3.2);\\n * // => 3\\n *\\n * _.toSafeInteger(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toSafeInteger(Infinity);\\n * // => 9007199254740991\\n *\\n * _.toSafeInteger('3.2');\\n * // => 3\\n */\\n function toSafeInteger(value) {\\n return value\\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\\n : (value === 0 ? value : 0);\\n }\\n\\n /**\\n * Converts `value` to a string. An empty string is returned for `null`\\n * and `undefined` values. The sign of `-0` is preserved.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {string} Returns the converted string.\\n * @example\\n *\\n * _.toString(null);\\n * // => ''\\n *\\n * _.toString(-0);\\n * // => '-0'\\n *\\n * _.toString([1, 2, 3]);\\n * // => '1,2,3'\\n */\\n function toString(value) {\\n return value == null ? '' : baseToString(value);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Assigns own enumerable string keyed properties of source objects to the\\n * destination object. Source objects are applied from left to right.\\n * Subsequent sources overwrite property assignments of previous sources.\\n *\\n * **Note:** This method mutates `object` and is loosely based on\\n * [`Object.assign`](https://mdn.io/Object/assign).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.10.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.assignIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * function Bar() {\\n * this.c = 3;\\n * }\\n *\\n * Foo.prototype.b = 2;\\n * Bar.prototype.d = 4;\\n *\\n * _.assign({ 'a': 0 }, new Foo, new Bar);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n var assign = createAssigner(function(object, source) {\\n if (isPrototype(source) || isArrayLike(source)) {\\n copyObject(source, keys(source), object);\\n return;\\n }\\n for (var key in source) {\\n if (hasOwnProperty.call(source, key)) {\\n assignValue(object, key, source[key]);\\n }\\n }\\n });\\n\\n /**\\n * This method is like `_.assign` except that it iterates over own and\\n * inherited source properties.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias extend\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.assign\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * function Bar() {\\n * this.c = 3;\\n * }\\n *\\n * Foo.prototype.b = 2;\\n * Bar.prototype.d = 4;\\n *\\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\\n */\\n var assignIn = createAssigner(function(object, source) {\\n copyObject(source, keysIn(source), object);\\n });\\n\\n /**\\n * This method is like `_.assignIn` except that it accepts `customizer`\\n * which is invoked to produce the assigned values. If `customizer` returns\\n * `undefined`, assignment is handled by the method instead. The `customizer`\\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias extendWith\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @see _.assignWith\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * return _.isUndefined(objValue) ? srcValue : objValue;\\n * }\\n *\\n * var defaults = _.partialRight(_.assignInWith, customizer);\\n *\\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\\n copyObject(source, keysIn(source), object, customizer);\\n });\\n\\n /**\\n * This method is like `_.assign` except that it accepts `customizer`\\n * which is invoked to produce the assigned values. If `customizer` returns\\n * `undefined`, assignment is handled by the method instead. The `customizer`\\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @see _.assignInWith\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * return _.isUndefined(objValue) ? srcValue : objValue;\\n * }\\n *\\n * var defaults = _.partialRight(_.assignWith, customizer);\\n *\\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\\n copyObject(source, keys(source), object, customizer);\\n });\\n\\n /**\\n * Creates an array of values corresponding to `paths` of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Array} Returns the picked values.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\\n *\\n * _.at(object, ['a[0].b.c', 'a[1]']);\\n * // => [3, 4]\\n */\\n var at = flatRest(baseAt);\\n\\n /**\\n * Creates an object that inherits from the `prototype` object. If a\\n * `properties` object is given, its own enumerable string keyed properties\\n * are assigned to the created object.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.3.0\\n * @category Object\\n * @param {Object} prototype The object to inherit from.\\n * @param {Object} [properties] The properties to assign to the object.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * function Shape() {\\n * this.x = 0;\\n * this.y = 0;\\n * }\\n *\\n * function Circle() {\\n * Shape.call(this);\\n * }\\n *\\n * Circle.prototype = _.create(Shape.prototype, {\\n * 'constructor': Circle\\n * });\\n *\\n * var circle = new Circle;\\n * circle instanceof Circle;\\n * // => true\\n *\\n * circle instanceof Shape;\\n * // => true\\n */\\n function create(prototype, properties) {\\n var result = baseCreate(prototype);\\n return properties == null ? result : baseAssign(result, properties);\\n }\\n\\n /**\\n * Assigns own and inherited enumerable string keyed properties of source\\n * objects to the destination object for all destination properties that\\n * resolve to `undefined`. Source objects are applied from left to right.\\n * Once a property is set, additional values of the same property are ignored.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.defaultsDeep\\n * @example\\n *\\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var defaults = baseRest(function(args) {\\n args.push(undefined, customDefaultsAssignIn);\\n return apply(assignInWith, undefined, args);\\n });\\n\\n /**\\n * This method is like `_.defaults` except that it recursively assigns\\n * default properties.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.10.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.defaults\\n * @example\\n *\\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\\n * // => { 'a': { 'b': 2, 'c': 3 } }\\n */\\n var defaultsDeep = baseRest(function(args) {\\n args.push(undefined, customDefaultsMerge);\\n return apply(mergeWith, undefined, args);\\n });\\n\\n /**\\n * This method is like `_.find` except that it returns the key of the first\\n * element `predicate` returns truthy for instead of the element itself.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {string|undefined} Returns the key of the matched element,\\n * else `undefined`.\\n * @example\\n *\\n * var users = {\\n * 'barney': { 'age': 36, 'active': true },\\n * 'fred': { 'age': 40, 'active': false },\\n * 'pebbles': { 'age': 1, 'active': true }\\n * };\\n *\\n * _.findKey(users, function(o) { return o.age < 40; });\\n * // => 'barney' (iteration order is not guaranteed)\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findKey(users, { 'age': 1, 'active': true });\\n * // => 'pebbles'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findKey(users, ['active', false]);\\n * // => 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findKey(users, 'active');\\n * // => 'barney'\\n */\\n function findKey(object, predicate) {\\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\\n }\\n\\n /**\\n * This method is like `_.findKey` except that it iterates over elements of\\n * a collection in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {string|undefined} Returns the key of the matched element,\\n * else `undefined`.\\n * @example\\n *\\n * var users = {\\n * 'barney': { 'age': 36, 'active': true },\\n * 'fred': { 'age': 40, 'active': false },\\n * 'pebbles': { 'age': 1, 'active': true }\\n * };\\n *\\n * _.findLastKey(users, function(o) { return o.age < 40; });\\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findLastKey(users, { 'age': 36, 'active': true });\\n * // => 'barney'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findLastKey(users, ['active', false]);\\n * // => 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findLastKey(users, 'active');\\n * // => 'pebbles'\\n */\\n function findLastKey(object, predicate) {\\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\\n }\\n\\n /**\\n * Iterates over own and inherited enumerable string keyed properties of an\\n * object and invokes `iteratee` for each property. The iteratee is invoked\\n * with three arguments: (value, key, object). Iteratee functions may exit\\n * iteration early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forInRight\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forIn(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\\n */\\n function forIn(object, iteratee) {\\n return object == null\\n ? object\\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\\n }\\n\\n /**\\n * This method is like `_.forIn` except that it iterates over properties of\\n * `object` in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forInRight(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\\n */\\n function forInRight(object, iteratee) {\\n return object == null\\n ? object\\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\\n }\\n\\n /**\\n * Iterates over own enumerable string keyed properties of an object and\\n * invokes `iteratee` for each property. The iteratee is invoked with three\\n * arguments: (value, key, object). Iteratee functions may exit iteration\\n * early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forOwnRight\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forOwn(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\\n */\\n function forOwn(object, iteratee) {\\n return object && baseForOwn(object, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.forOwn` except that it iterates over properties of\\n * `object` in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forOwn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forOwnRight(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\\n */\\n function forOwnRight(object, iteratee) {\\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * Creates an array of function property names from own enumerable properties\\n * of `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @returns {Array} Returns the function names.\\n * @see _.functionsIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = _.constant('a');\\n * this.b = _.constant('b');\\n * }\\n *\\n * Foo.prototype.c = _.constant('c');\\n *\\n * _.functions(new Foo);\\n * // => ['a', 'b']\\n */\\n function functions(object) {\\n return object == null ? [] : baseFunctions(object, keys(object));\\n }\\n\\n /**\\n * Creates an array of function property names from own and inherited\\n * enumerable properties of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @returns {Array} Returns the function names.\\n * @see _.functions\\n * @example\\n *\\n * function Foo() {\\n * this.a = _.constant('a');\\n * this.b = _.constant('b');\\n * }\\n *\\n * Foo.prototype.c = _.constant('c');\\n *\\n * _.functionsIn(new Foo);\\n * // => ['a', 'b', 'c']\\n */\\n function functionsIn(object) {\\n return object == null ? [] : baseFunctions(object, keysIn(object));\\n }\\n\\n /**\\n * Gets the value at `path` of `object`. If the resolved value is\\n * `undefined`, the `defaultValue` is returned in its place.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.7.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to get.\\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\\n * @returns {*} Returns the resolved value.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.get(object, 'a[0].b.c');\\n * // => 3\\n *\\n * _.get(object, ['a', '0', 'b', 'c']);\\n * // => 3\\n *\\n * _.get(object, 'a.b.c', 'default');\\n * // => 'default'\\n */\\n function get(object, path, defaultValue) {\\n var result = object == null ? undefined : baseGet(object, path);\\n return result === undefined ? defaultValue : result;\\n }\\n\\n /**\\n * Checks if `path` is a direct property of `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n * @example\\n *\\n * var object = { 'a': { 'b': 2 } };\\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\\n *\\n * _.has(object, 'a');\\n * // => true\\n *\\n * _.has(object, 'a.b');\\n * // => true\\n *\\n * _.has(object, ['a', 'b']);\\n * // => true\\n *\\n * _.has(other, 'a');\\n * // => false\\n */\\n function has(object, path) {\\n return object != null && hasPath(object, path, baseHas);\\n }\\n\\n /**\\n * Checks if `path` is a direct or inherited property of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n * @example\\n *\\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\\n *\\n * _.hasIn(object, 'a');\\n * // => true\\n *\\n * _.hasIn(object, 'a.b');\\n * // => true\\n *\\n * _.hasIn(object, ['a', 'b']);\\n * // => true\\n *\\n * _.hasIn(object, 'b');\\n * // => false\\n */\\n function hasIn(object, path) {\\n return object != null && hasPath(object, path, baseHasIn);\\n }\\n\\n /**\\n * Creates an object composed of the inverted keys and values of `object`.\\n * If `object` contains duplicate values, subsequent values overwrite\\n * property assignments of previous values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.7.0\\n * @category Object\\n * @param {Object} object The object to invert.\\n * @returns {Object} Returns the new inverted object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\\n *\\n * _.invert(object);\\n * // => { '1': 'c', '2': 'b' }\\n */\\n var invert = createInverter(function(result, value, key) {\\n result[value] = key;\\n }, constant(identity));\\n\\n /**\\n * This method is like `_.invert` except that the inverted object is generated\\n * from the results of running each element of `object` thru `iteratee`. The\\n * corresponding inverted value of each inverted key is an array of keys\\n * responsible for generating the inverted value. The iteratee is invoked\\n * with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.1.0\\n * @category Object\\n * @param {Object} object The object to invert.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Object} Returns the new inverted object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\\n *\\n * _.invertBy(object);\\n * // => { '1': ['a', 'c'], '2': ['b'] }\\n *\\n * _.invertBy(object, function(value) {\\n * return 'group' + value;\\n * });\\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\\n */\\n var invertBy = createInverter(function(result, value, key) {\\n if (hasOwnProperty.call(result, value)) {\\n result[value].push(key);\\n } else {\\n result[value] = [key];\\n }\\n }, getIteratee);\\n\\n /**\\n * Invokes the method at `path` of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the method to invoke.\\n * @param {...*} [args] The arguments to invoke the method with.\\n * @returns {*} Returns the result of the invoked method.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\\n *\\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\\n * // => [2, 3]\\n */\\n var invoke = baseRest(baseInvoke);\\n\\n /**\\n * Creates an array of the own enumerable property names of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects. See the\\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\\n * for more details.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.keys(new Foo);\\n * // => ['a', 'b'] (iteration order is not guaranteed)\\n *\\n * _.keys('hi');\\n * // => ['0', '1']\\n */\\n function keys(object) {\\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\\n }\\n\\n /**\\n * Creates an array of the own and inherited enumerable property names of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.keysIn(new Foo);\\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\\n */\\n function keysIn(object) {\\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\\n }\\n\\n /**\\n * The opposite of `_.mapValues`; this method creates an object with the\\n * same values as `object` and keys generated by running each own enumerable\\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\\n * with three arguments: (value, key, object).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns the new mapped object.\\n * @see _.mapValues\\n * @example\\n *\\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\\n * return key + value;\\n * });\\n * // => { 'a1': 1, 'b2': 2 }\\n */\\n function mapKeys(object, iteratee) {\\n var result = {};\\n iteratee = getIteratee(iteratee, 3);\\n\\n baseForOwn(object, function(value, key, object) {\\n baseAssignValue(result, iteratee(value, key, object), value);\\n });\\n return result;\\n }\\n\\n /**\\n * Creates an object with the same keys as `object` and values generated\\n * by running each own enumerable string keyed property of `object` thru\\n * `iteratee`. The iteratee is invoked with three arguments:\\n * (value, key, object).\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns the new mapped object.\\n * @see _.mapKeys\\n * @example\\n *\\n * var users = {\\n * 'fred': { 'user': 'fred', 'age': 40 },\\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\\n * };\\n *\\n * _.mapValues(users, function(o) { return o.age; });\\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.mapValues(users, 'age');\\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\\n */\\n function mapValues(object, iteratee) {\\n var result = {};\\n iteratee = getIteratee(iteratee, 3);\\n\\n baseForOwn(object, function(value, key, object) {\\n baseAssignValue(result, key, iteratee(value, key, object));\\n });\\n return result;\\n }\\n\\n /**\\n * This method is like `_.assign` except that it recursively merges own and\\n * inherited enumerable string keyed properties of source objects into the\\n * destination object. Source properties that resolve to `undefined` are\\n * skipped if a destination value exists. Array and plain object properties\\n * are merged recursively. Other objects and value types are overridden by\\n * assignment. Source objects are applied from left to right. Subsequent\\n * sources overwrite property assignments of previous sources.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {\\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\\n * };\\n *\\n * var other = {\\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\\n * };\\n *\\n * _.merge(object, other);\\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\\n */\\n var merge = createAssigner(function(object, source, srcIndex) {\\n baseMerge(object, source, srcIndex);\\n });\\n\\n /**\\n * This method is like `_.merge` except that it accepts `customizer` which\\n * is invoked to produce the merged values of the destination and source\\n * properties. If `customizer` returns `undefined`, merging is handled by the\\n * method instead. The `customizer` is invoked with six arguments:\\n * (objValue, srcValue, key, object, source, stack).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} customizer The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * if (_.isArray(objValue)) {\\n * return objValue.concat(srcValue);\\n * }\\n * }\\n *\\n * var object = { 'a': [1], 'b': [2] };\\n * var other = { 'a': [3], 'b': [4] };\\n *\\n * _.mergeWith(object, other, customizer);\\n * // => { 'a': [1, 3], 'b': [2, 4] }\\n */\\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\\n baseMerge(object, source, srcIndex, customizer);\\n });\\n\\n /**\\n * The opposite of `_.pick`; this method creates an object composed of the\\n * own and inherited enumerable property paths of `object` that are not omitted.\\n *\\n * **Note:** This method is considerably slower than `_.pick`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {...(string|string[])} [paths] The property paths to omit.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.omit(object, ['a', 'c']);\\n * // => { 'b': '2' }\\n */\\n var omit = flatRest(function(object, paths) {\\n var result = {};\\n if (object == null) {\\n return result;\\n }\\n var isDeep = false;\\n paths = arrayMap(paths, function(path) {\\n path = castPath(path, object);\\n isDeep || (isDeep = path.length > 1);\\n return path;\\n });\\n copyObject(object, getAllKeysIn(object), result);\\n if (isDeep) {\\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\\n }\\n var length = paths.length;\\n while (length--) {\\n baseUnset(result, paths[length]);\\n }\\n return result;\\n });\\n\\n /**\\n * The opposite of `_.pickBy`; this method creates an object composed of\\n * the own and inherited enumerable string keyed properties of `object` that\\n * `predicate` doesn't return truthy for. The predicate is invoked with two\\n * arguments: (value, key).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {Function} [predicate=_.identity] The function invoked per property.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.omitBy(object, _.isNumber);\\n * // => { 'b': '2' }\\n */\\n function omitBy(object, predicate) {\\n return pickBy(object, negate(getIteratee(predicate)));\\n }\\n\\n /**\\n * Creates an object composed of the picked `object` properties.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.pick(object, ['a', 'c']);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n var pick = flatRest(function(object, paths) {\\n return object == null ? {} : basePick(object, paths);\\n });\\n\\n /**\\n * Creates an object composed of the `object` properties `predicate` returns\\n * truthy for. The predicate is invoked with two arguments: (value, key).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {Function} [predicate=_.identity] The function invoked per property.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.pickBy(object, _.isNumber);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n function pickBy(object, predicate) {\\n if (object == null) {\\n return {};\\n }\\n var props = arrayMap(getAllKeysIn(object), function(prop) {\\n return [prop];\\n });\\n predicate = getIteratee(predicate);\\n return basePickBy(object, props, function(value, path) {\\n return predicate(value, path[0]);\\n });\\n }\\n\\n /**\\n * This method is like `_.get` except that if the resolved value is a\\n * function it's invoked with the `this` binding of its parent object and\\n * its result is returned.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to resolve.\\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\\n * @returns {*} Returns the resolved value.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\\n *\\n * _.result(object, 'a[0].b.c1');\\n * // => 3\\n *\\n * _.result(object, 'a[0].b.c2');\\n * // => 4\\n *\\n * _.result(object, 'a[0].b.c3', 'default');\\n * // => 'default'\\n *\\n * _.result(object, 'a[0].b.c3', _.constant('default'));\\n * // => 'default'\\n */\\n function result(object, path, defaultValue) {\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length;\\n\\n // Ensure the loop is entered when path is empty.\\n if (!length) {\\n length = 1;\\n object = undefined;\\n }\\n while (++index < length) {\\n var value = object == null ? undefined : object[toKey(path[index])];\\n if (value === undefined) {\\n index = length;\\n value = defaultValue;\\n }\\n object = isFunction(value) ? value.call(object) : value;\\n }\\n return object;\\n }\\n\\n /**\\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\\n * it's created. Arrays are created for missing index properties while objects\\n * are created for all other missing properties. Use `_.setWith` to customize\\n * `path` creation.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.7.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.set(object, 'a[0].b.c', 4);\\n * console.log(object.a[0].b.c);\\n * // => 4\\n *\\n * _.set(object, ['x', '0', 'y', 'z'], 5);\\n * console.log(object.x[0].y.z);\\n * // => 5\\n */\\n function set(object, path, value) {\\n return object == null ? object : baseSet(object, path, value);\\n }\\n\\n /**\\n * This method is like `_.set` except that it accepts `customizer` which is\\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\\n * path creation is handled by the method instead. The `customizer` is invoked\\n * with three arguments: (nsValue, key, nsObject).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {};\\n *\\n * _.setWith(object, '[0][1]', 'a', Object);\\n * // => { '0': { '1': 'a' } }\\n */\\n function setWith(object, path, value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return object == null ? object : baseSet(object, path, value, customizer);\\n }\\n\\n /**\\n * Creates an array of own enumerable string keyed-value pairs for `object`\\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\\n * entries are returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias entries\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the key-value pairs.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.toPairs(new Foo);\\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\\n */\\n var toPairs = createToPairs(keys);\\n\\n /**\\n * Creates an array of own and inherited enumerable string keyed-value pairs\\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\\n * or set, its entries are returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias entriesIn\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the key-value pairs.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.toPairsIn(new Foo);\\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\\n */\\n var toPairsIn = createToPairs(keysIn);\\n\\n /**\\n * An alternative to `_.reduce`; this method transforms `object` to a new\\n * `accumulator` object which is the result of running each of its own\\n * enumerable string keyed properties thru `iteratee`, with each invocation\\n * potentially mutating the `accumulator` object. If `accumulator` is not\\n * provided, a new object with the same `[[Prototype]]` will be used. The\\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The custom accumulator value.\\n * @returns {*} Returns the accumulated value.\\n * @example\\n *\\n * _.transform([2, 3, 4], function(result, n) {\\n * result.push(n *= n);\\n * return n % 2 == 0;\\n * }, []);\\n * // => [4, 9]\\n *\\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\\n * (result[value] || (result[value] = [])).push(key);\\n * }, {});\\n * // => { '1': ['a', 'c'], '2': ['b'] }\\n */\\n function transform(object, iteratee, accumulator) {\\n var isArr = isArray(object),\\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\\n\\n iteratee = getIteratee(iteratee, 4);\\n if (accumulator == null) {\\n var Ctor = object && object.constructor;\\n if (isArrLike) {\\n accumulator = isArr ? new Ctor : [];\\n }\\n else if (isObject(object)) {\\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\\n }\\n else {\\n accumulator = {};\\n }\\n }\\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\\n return iteratee(accumulator, value, index, object);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * Removes the property at `path` of `object`.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to unset.\\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\\n * _.unset(object, 'a[0].b.c');\\n * // => true\\n *\\n * console.log(object);\\n * // => { 'a': [{ 'b': {} }] };\\n *\\n * _.unset(object, ['a', '0', 'b', 'c']);\\n * // => true\\n *\\n * console.log(object);\\n * // => { 'a': [{ 'b': {} }] };\\n */\\n function unset(object, path) {\\n return object == null ? true : baseUnset(object, path);\\n }\\n\\n /**\\n * This method is like `_.set` except that accepts `updater` to produce the\\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\\n * is invoked with one argument: (value).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {Function} updater The function to produce the updated value.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\\n * console.log(object.a[0].b.c);\\n * // => 9\\n *\\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\\n * console.log(object.x[0].y.z);\\n * // => 0\\n */\\n function update(object, path, updater) {\\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\\n }\\n\\n /**\\n * This method is like `_.update` except that it accepts `customizer` which is\\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\\n * path creation is handled by the method instead. The `customizer` is invoked\\n * with three arguments: (nsValue, key, nsObject).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {Function} updater The function to produce the updated value.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {};\\n *\\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\\n * // => { '0': { '1': 'a' } }\\n */\\n function updateWith(object, path, updater, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\\n }\\n\\n /**\\n * Creates an array of the own enumerable string keyed property values of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property values.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.values(new Foo);\\n * // => [1, 2] (iteration order is not guaranteed)\\n *\\n * _.values('hi');\\n * // => ['h', 'i']\\n */\\n function values(object) {\\n return object == null ? [] : baseValues(object, keys(object));\\n }\\n\\n /**\\n * Creates an array of the own and inherited enumerable string keyed property\\n * values of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property values.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.valuesIn(new Foo);\\n * // => [1, 2, 3] (iteration order is not guaranteed)\\n */\\n function valuesIn(object) {\\n return object == null ? [] : baseValues(object, keysIn(object));\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Number\\n * @param {number} number The number to clamp.\\n * @param {number} [lower] The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the clamped number.\\n * @example\\n *\\n * _.clamp(-10, -5, 5);\\n * // => -5\\n *\\n * _.clamp(10, -5, 5);\\n * // => 5\\n */\\n function clamp(number, lower, upper) {\\n if (upper === undefined) {\\n upper = lower;\\n lower = undefined;\\n }\\n if (upper !== undefined) {\\n upper = toNumber(upper);\\n upper = upper === upper ? upper : 0;\\n }\\n if (lower !== undefined) {\\n lower = toNumber(lower);\\n lower = lower === lower ? lower : 0;\\n }\\n return baseClamp(toNumber(number), lower, upper);\\n }\\n\\n /**\\n * Checks if `n` is between `start` and up to, but not including, `end`. If\\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\\n * If `start` is greater than `end` the params are swapped to support\\n * negative ranges.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.3.0\\n * @category Number\\n * @param {number} number The number to check.\\n * @param {number} [start=0] The start of the range.\\n * @param {number} end The end of the range.\\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\\n * @see _.range, _.rangeRight\\n * @example\\n *\\n * _.inRange(3, 2, 4);\\n * // => true\\n *\\n * _.inRange(4, 8);\\n * // => true\\n *\\n * _.inRange(4, 2);\\n * // => false\\n *\\n * _.inRange(2, 2);\\n * // => false\\n *\\n * _.inRange(1.2, 2);\\n * // => true\\n *\\n * _.inRange(5.2, 4);\\n * // => false\\n *\\n * _.inRange(-3, -2, -6);\\n * // => true\\n */\\n function inRange(number, start, end) {\\n start = toFinite(start);\\n if (end === undefined) {\\n end = start;\\n start = 0;\\n } else {\\n end = toFinite(end);\\n }\\n number = toNumber(number);\\n return baseInRange(number, start, end);\\n }\\n\\n /**\\n * Produces a random number between the inclusive `lower` and `upper` bounds.\\n * If only one argument is provided a number between `0` and the given number\\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\\n * floats, a floating-point number is returned instead of an integer.\\n *\\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\\n * floating-point values which can produce unexpected results.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.7.0\\n * @category Number\\n * @param {number} [lower=0] The lower bound.\\n * @param {number} [upper=1] The upper bound.\\n * @param {boolean} [floating] Specify returning a floating-point number.\\n * @returns {number} Returns the random number.\\n * @example\\n *\\n * _.random(0, 5);\\n * // => an integer between 0 and 5\\n *\\n * _.random(5);\\n * // => also an integer between 0 and 5\\n *\\n * _.random(5, true);\\n * // => a floating-point number between 0 and 5\\n *\\n * _.random(1.2, 5.2);\\n * // => a floating-point number between 1.2 and 5.2\\n */\\n function random(lower, upper, floating) {\\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\\n upper = floating = undefined;\\n }\\n if (floating === undefined) {\\n if (typeof upper == 'boolean') {\\n floating = upper;\\n upper = undefined;\\n }\\n else if (typeof lower == 'boolean') {\\n floating = lower;\\n lower = undefined;\\n }\\n }\\n if (lower === undefined && upper === undefined) {\\n lower = 0;\\n upper = 1;\\n }\\n else {\\n lower = toFinite(lower);\\n if (upper === undefined) {\\n upper = lower;\\n lower = 0;\\n } else {\\n upper = toFinite(upper);\\n }\\n }\\n if (lower > upper) {\\n var temp = lower;\\n lower = upper;\\n upper = temp;\\n }\\n if (floating || lower % 1 || upper % 1) {\\n var rand = nativeRandom();\\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\\n }\\n return baseRandom(lower, upper);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the camel cased string.\\n * @example\\n *\\n * _.camelCase('Foo Bar');\\n * // => 'fooBar'\\n *\\n * _.camelCase('--foo-bar--');\\n * // => 'fooBar'\\n *\\n * _.camelCase('__FOO_BAR__');\\n * // => 'fooBar'\\n */\\n var camelCase = createCompounder(function(result, word, index) {\\n word = word.toLowerCase();\\n return result + (index ? capitalize(word) : word);\\n });\\n\\n /**\\n * Converts the first character of `string` to upper case and the remaining\\n * to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to capitalize.\\n * @returns {string} Returns the capitalized string.\\n * @example\\n *\\n * _.capitalize('FRED');\\n * // => 'Fred'\\n */\\n function capitalize(string) {\\n return upperFirst(toString(string).toLowerCase());\\n }\\n\\n /**\\n * Deburrs `string` by converting\\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\\n * letters to basic Latin letters and removing\\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to deburr.\\n * @returns {string} Returns the deburred string.\\n * @example\\n *\\n * _.deburr('déjà vu');\\n * // => 'deja vu'\\n */\\n function deburr(string) {\\n string = toString(string);\\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\\n }\\n\\n /**\\n * Checks if `string` ends with the given target string.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to inspect.\\n * @param {string} [target] The string to search for.\\n * @param {number} [position=string.length] The position to search up to.\\n * @returns {boolean} Returns `true` if `string` ends with `target`,\\n * else `false`.\\n * @example\\n *\\n * _.endsWith('abc', 'c');\\n * // => true\\n *\\n * _.endsWith('abc', 'b');\\n * // => false\\n *\\n * _.endsWith('abc', 'b', 2);\\n * // => true\\n */\\n function endsWith(string, target, position) {\\n string = toString(string);\\n target = baseToString(target);\\n\\n var length = string.length;\\n position = position === undefined\\n ? length\\n : baseClamp(toInteger(position), 0, length);\\n\\n var end = position;\\n position -= target.length;\\n return position >= 0 && string.slice(position, end) == target;\\n }\\n\\n /**\\n * Converts the characters \\\"&\\\", \\\"<\\\", \\\">\\\", '\\\"', and \\\"'\\\" in `string` to their\\n * corresponding HTML entities.\\n *\\n * **Note:** No other characters are escaped. To escape additional\\n * characters use a third-party library like [_he_](https://mths.be/he).\\n *\\n * Though the \\\">\\\" character is escaped for symmetry, characters like\\n * \\\">\\\" and \\\"/\\\" don't need escaping in HTML and have no special meaning\\n * unless they're part of a tag or unquoted attribute value. See\\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\\n * (under \\\"semi-related fun fact\\\") for more details.\\n *\\n * When working with HTML you should always\\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\\n * XSS vectors.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category String\\n * @param {string} [string=''] The string to escape.\\n * @returns {string} Returns the escaped string.\\n * @example\\n *\\n * _.escape('fred, barney, & pebbles');\\n * // => 'fred, barney, & pebbles'\\n */\\n function escape(string) {\\n string = toString(string);\\n return (string && reHasUnescapedHtml.test(string))\\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\\n : string;\\n }\\n\\n /**\\n * Escapes the `RegExp` special characters \\\"^\\\", \\\"$\\\", \\\"\\\\\\\", \\\".\\\", \\\"*\\\", \\\"+\\\",\\n * \\\"?\\\", \\\"(\\\", \\\")\\\", \\\"[\\\", \\\"]\\\", \\\"{\\\", \\\"}\\\", and \\\"|\\\" in `string`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to escape.\\n * @returns {string} Returns the escaped string.\\n * @example\\n *\\n * _.escapeRegExp('[lodash](https://lodash.com/)');\\n * // => '\\\\[lodash\\\\]\\\\(https://lodash\\\\.com/\\\\)'\\n */\\n function escapeRegExp(string) {\\n string = toString(string);\\n return (string && reHasRegExpChar.test(string))\\n ? string.replace(reRegExpChar, '\\\\\\\\$&')\\n : string;\\n }\\n\\n /**\\n * Converts `string` to\\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the kebab cased string.\\n * @example\\n *\\n * _.kebabCase('Foo Bar');\\n * // => 'foo-bar'\\n *\\n * _.kebabCase('fooBar');\\n * // => 'foo-bar'\\n *\\n * _.kebabCase('__FOO_BAR__');\\n * // => 'foo-bar'\\n */\\n var kebabCase = createCompounder(function(result, word, index) {\\n return result + (index ? '-' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Converts `string`, as space separated words, to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the lower cased string.\\n * @example\\n *\\n * _.lowerCase('--Foo-Bar--');\\n * // => 'foo bar'\\n *\\n * _.lowerCase('fooBar');\\n * // => 'foo bar'\\n *\\n * _.lowerCase('__FOO_BAR__');\\n * // => 'foo bar'\\n */\\n var lowerCase = createCompounder(function(result, word, index) {\\n return result + (index ? ' ' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Converts the first character of `string` to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the converted string.\\n * @example\\n *\\n * _.lowerFirst('Fred');\\n * // => 'fred'\\n *\\n * _.lowerFirst('FRED');\\n * // => 'fRED'\\n */\\n var lowerFirst = createCaseFirst('toLowerCase');\\n\\n /**\\n * Pads `string` on the left and right sides if it's shorter than `length`.\\n * Padding characters are truncated if they can't be evenly divided by `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.pad('abc', 8);\\n * // => ' abc '\\n *\\n * _.pad('abc', 8, '_-');\\n * // => '_-abc_-_'\\n *\\n * _.pad('abc', 3);\\n * // => 'abc'\\n */\\n function pad(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n if (!length || strLength >= length) {\\n return string;\\n }\\n var mid = (length - strLength) / 2;\\n return (\\n createPadding(nativeFloor(mid), chars) +\\n string +\\n createPadding(nativeCeil(mid), chars)\\n );\\n }\\n\\n /**\\n * Pads `string` on the right side if it's shorter than `length`. Padding\\n * characters are truncated if they exceed `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.padEnd('abc', 6);\\n * // => 'abc '\\n *\\n * _.padEnd('abc', 6, '_-');\\n * // => 'abc_-_'\\n *\\n * _.padEnd('abc', 3);\\n * // => 'abc'\\n */\\n function padEnd(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n return (length && strLength < length)\\n ? (string + createPadding(length - strLength, chars))\\n : string;\\n }\\n\\n /**\\n * Pads `string` on the left side if it's shorter than `length`. Padding\\n * characters are truncated if they exceed `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.padStart('abc', 6);\\n * // => ' abc'\\n *\\n * _.padStart('abc', 6, '_-');\\n * // => '_-_abc'\\n *\\n * _.padStart('abc', 3);\\n * // => 'abc'\\n */\\n function padStart(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n return (length && strLength < length)\\n ? (createPadding(length - strLength, chars) + string)\\n : string;\\n }\\n\\n /**\\n * Converts `string` to an integer of the specified radix. If `radix` is\\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\\n * hexadecimal, in which case a `radix` of `16` is used.\\n *\\n * **Note:** This method aligns with the\\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category String\\n * @param {string} string The string to convert.\\n * @param {number} [radix=10] The radix to interpret `value` by.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.parseInt('08');\\n * // => 8\\n *\\n * _.map(['6', '08', '10'], _.parseInt);\\n * // => [6, 8, 10]\\n */\\n function parseInt(string, radix, guard) {\\n if (guard || radix == null) {\\n radix = 0;\\n } else if (radix) {\\n radix = +radix;\\n }\\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\\n }\\n\\n /**\\n * Repeats the given string `n` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to repeat.\\n * @param {number} [n=1] The number of times to repeat the string.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {string} Returns the repeated string.\\n * @example\\n *\\n * _.repeat('*', 3);\\n * // => '***'\\n *\\n * _.repeat('abc', 2);\\n * // => 'abcabc'\\n *\\n * _.repeat('abc', 0);\\n * // => ''\\n */\\n function repeat(string, n, guard) {\\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\\n n = 1;\\n } else {\\n n = toInteger(n);\\n }\\n return baseRepeat(toString(string), n);\\n }\\n\\n /**\\n * Replaces matches for `pattern` in `string` with `replacement`.\\n *\\n * **Note:** This method is based on\\n * [`String#replace`](https://mdn.io/String/replace).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to modify.\\n * @param {RegExp|string} pattern The pattern to replace.\\n * @param {Function|string} replacement The match replacement.\\n * @returns {string} Returns the modified string.\\n * @example\\n *\\n * _.replace('Hi Fred', 'Fred', 'Barney');\\n * // => 'Hi Barney'\\n */\\n function replace() {\\n var args = arguments,\\n string = toString(args[0]);\\n\\n return args.length < 3 ? string : string.replace(args[1], args[2]);\\n }\\n\\n /**\\n * Converts `string` to\\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the snake cased string.\\n * @example\\n *\\n * _.snakeCase('Foo Bar');\\n * // => 'foo_bar'\\n *\\n * _.snakeCase('fooBar');\\n * // => 'foo_bar'\\n *\\n * _.snakeCase('--FOO-BAR--');\\n * // => 'foo_bar'\\n */\\n var snakeCase = createCompounder(function(result, word, index) {\\n return result + (index ? '_' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Splits `string` by `separator`.\\n *\\n * **Note:** This method is based on\\n * [`String#split`](https://mdn.io/String/split).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to split.\\n * @param {RegExp|string} separator The separator pattern to split by.\\n * @param {number} [limit] The length to truncate results to.\\n * @returns {Array} Returns the string segments.\\n * @example\\n *\\n * _.split('a-b-c', '-', 2);\\n * // => ['a', 'b']\\n */\\n function split(string, separator, limit) {\\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\\n separator = limit = undefined;\\n }\\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\\n if (!limit) {\\n return [];\\n }\\n string = toString(string);\\n if (string && (\\n typeof separator == 'string' ||\\n (separator != null && !isRegExp(separator))\\n )) {\\n separator = baseToString(separator);\\n if (!separator && hasUnicode(string)) {\\n return castSlice(stringToArray(string), 0, limit);\\n }\\n }\\n return string.split(separator, limit);\\n }\\n\\n /**\\n * Converts `string` to\\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.1.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the start cased string.\\n * @example\\n *\\n * _.startCase('--foo-bar--');\\n * // => 'Foo Bar'\\n *\\n * _.startCase('fooBar');\\n * // => 'Foo Bar'\\n *\\n * _.startCase('__FOO_BAR__');\\n * // => 'FOO BAR'\\n */\\n var startCase = createCompounder(function(result, word, index) {\\n return result + (index ? ' ' : '') + upperFirst(word);\\n });\\n\\n /**\\n * Checks if `string` starts with the given target string.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to inspect.\\n * @param {string} [target] The string to search for.\\n * @param {number} [position=0] The position to search from.\\n * @returns {boolean} Returns `true` if `string` starts with `target`,\\n * else `false`.\\n * @example\\n *\\n * _.startsWith('abc', 'a');\\n * // => true\\n *\\n * _.startsWith('abc', 'b');\\n * // => false\\n *\\n * _.startsWith('abc', 'b', 1);\\n * // => true\\n */\\n function startsWith(string, target, position) {\\n string = toString(string);\\n position = position == null\\n ? 0\\n : baseClamp(toInteger(position), 0, string.length);\\n\\n target = baseToString(target);\\n return string.slice(position, position + target.length) == target;\\n }\\n\\n /**\\n * Creates a compiled template function that can interpolate data properties\\n * in \\\"interpolate\\\" delimiters, HTML-escape interpolated data properties in\\n * \\\"escape\\\" delimiters, and execute JavaScript in \\\"evaluate\\\" delimiters. Data\\n * properties may be accessed as free variables in the template. If a setting\\n * object is given, it takes precedence over `_.templateSettings` values.\\n *\\n * **Note:** In the development build `_.template` utilizes\\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\\n * for easier debugging.\\n *\\n * For more information on precompiling templates see\\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\\n *\\n * For more information on Chrome extension sandboxes see\\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category String\\n * @param {string} [string=''] The template string.\\n * @param {Object} [options={}] The options object.\\n * @param {RegExp} [options.escape=_.templateSettings.escape]\\n * The HTML \\\"escape\\\" delimiter.\\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\\n * The \\\"evaluate\\\" delimiter.\\n * @param {Object} [options.imports=_.templateSettings.imports]\\n * An object to import into the template as free variables.\\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\\n * The \\\"interpolate\\\" delimiter.\\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\\n * The sourceURL of the compiled template.\\n * @param {string} [options.variable='obj']\\n * The data object variable name.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the compiled template function.\\n * @example\\n *\\n * // Use the \\\"interpolate\\\" delimiter to create a compiled template.\\n * var compiled = _.template('hello <%= user %>!');\\n * compiled({ 'user': 'fred' });\\n * // => 'hello fred!'\\n *\\n * // Use the HTML \\\"escape\\\" delimiter to escape data property values.\\n * var compiled = _.template('<%- value %>');\\n * compiled({ 'value': '\\\\r\\\\n\\\\r\\\\n\\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 78 */\\n/***/ function(module, exports) {\\n\\n\\t/*\\r\\n\\t\\tMIT License http://www.opensource.org/licenses/mit-license.php\\r\\n\\t\\tAuthor Tobias Koppers @sokra\\r\\n\\t*/\\r\\n\\t// css base code, injected by the css-loader\\r\\n\\tmodule.exports = function() {\\r\\n\\t\\tvar list = [];\\r\\n\\t\\r\\n\\t\\t// return the list of modules as css string\\r\\n\\t\\tlist.toString = function toString() {\\r\\n\\t\\t\\tvar result = [];\\r\\n\\t\\t\\tfor(var i = 0; i < this.length; i++) {\\r\\n\\t\\t\\t\\tvar item = this[i];\\r\\n\\t\\t\\t\\tif(item[2]) {\\r\\n\\t\\t\\t\\t\\tresult.push(\\\"@media \\\" + item[2] + \\\"{\\\" + item[1] + \\\"}\\\");\\r\\n\\t\\t\\t\\t} else {\\r\\n\\t\\t\\t\\t\\tresult.push(item[1]);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\treturn result.join(\\\"\\\");\\r\\n\\t\\t};\\r\\n\\t\\r\\n\\t\\t// import a list of modules into the list\\r\\n\\t\\tlist.i = function(modules, mediaQuery) {\\r\\n\\t\\t\\tif(typeof modules === \\\"string\\\")\\r\\n\\t\\t\\t\\tmodules = [[null, modules, \\\"\\\"]];\\r\\n\\t\\t\\tvar alreadyImportedModules = {};\\r\\n\\t\\t\\tfor(var i = 0; i < this.length; i++) {\\r\\n\\t\\t\\t\\tvar id = this[i][0];\\r\\n\\t\\t\\t\\tif(typeof id === \\\"number\\\")\\r\\n\\t\\t\\t\\t\\talreadyImportedModules[id] = true;\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tfor(i = 0; i < modules.length; i++) {\\r\\n\\t\\t\\t\\tvar item = modules[i];\\r\\n\\t\\t\\t\\t// skip already imported module\\r\\n\\t\\t\\t\\t// this implementation is not 100% perfect for weird media query combinations\\r\\n\\t\\t\\t\\t// when a module is imported multiple times with different media queries.\\r\\n\\t\\t\\t\\t// I hope this will never occur (Hey this way we have smaller bundles)\\r\\n\\t\\t\\t\\tif(typeof item[0] !== \\\"number\\\" || !alreadyImportedModules[item[0]]) {\\r\\n\\t\\t\\t\\t\\tif(mediaQuery && !item[2]) {\\r\\n\\t\\t\\t\\t\\t\\titem[2] = mediaQuery;\\r\\n\\t\\t\\t\\t\\t} else if(mediaQuery) {\\r\\n\\t\\t\\t\\t\\t\\titem[2] = \\\"(\\\" + item[2] + \\\") and (\\\" + mediaQuery + \\\")\\\";\\r\\n\\t\\t\\t\\t\\t}\\r\\n\\t\\t\\t\\t\\tlist.push(item);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t};\\r\\n\\t\\treturn list;\\r\\n\\t};\\r\\n\\n\\n/***/ },\\n/* 79 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t/*\\n\\t\\tMIT License http://www.opensource.org/licenses/mit-license.php\\n\\t\\tAuthor Tobias Koppers @sokra\\n\\t*/\\n\\tvar stylesInDom = {},\\n\\t\\tmemoize = function(fn) {\\n\\t\\t\\tvar memo;\\n\\t\\t\\treturn function () {\\n\\t\\t\\t\\tif (typeof memo === \\\"undefined\\\") memo = fn.apply(this, arguments);\\n\\t\\t\\t\\treturn memo;\\n\\t\\t\\t};\\n\\t\\t},\\n\\t\\tisOldIE = memoize(function() {\\n\\t\\t\\treturn /msie [6-9]\\\\b/.test(window.navigator.userAgent.toLowerCase());\\n\\t\\t}),\\n\\t\\tgetHeadElement = memoize(function () {\\n\\t\\t\\treturn document.head || document.getElementsByTagName(\\\"head\\\")[0];\\n\\t\\t}),\\n\\t\\tsingletonElement = null,\\n\\t\\tsingletonCounter = 0,\\n\\t\\tstyleElementsInsertedAtTop = [];\\n\\t\\n\\tmodule.exports = function(list, options) {\\n\\t\\tif(false) {\\n\\t\\t\\tif(typeof document !== \\\"object\\\") throw new Error(\\\"The style-loader cannot be used in a non-browser environment\\\");\\n\\t\\t}\\n\\t\\n\\t\\toptions = options || {};\\n\\t\\t// Force single-tag solution on IE6-9, which has a hard limit on the # of \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 85 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t header: { type: String },\\n\\t placement: { type: String, default: 'right' },\\n\\t show: { type: Boolean, required: true },\\n\\t width: { type: Number, default: 320 }\\n\\t },\\n\\t watch: {\\n\\t show: function show(val, old) {\\n\\t var _this = this;\\n\\t\\n\\t this.$emit('input', val);\\n\\t this.$emit(this.show ? 'open' : 'close');\\n\\t var body = document.body;\\n\\t var scrollBarWidth = (0, _utils.getScrollBarWidth)();\\n\\t if (val) {\\n\\t if (!this._backdrop) {\\n\\t this._backdrop = document.createElement('div');\\n\\t }\\n\\t this._backdrop.className = 'aside-backdrop';\\n\\t body.appendChild(this._backdrop);\\n\\t body.classList.add('modal-open');\\n\\t if (scrollBarWidth !== 0) {\\n\\t body.style.paddingRight = scrollBarWidth + 'px';\\n\\t }\\n\\t // request property that requires layout to force a layout\\n\\t var x = this._backdrop.clientHeight;\\n\\t this._backdrop.classList.add('in');\\n\\t (0, _NodeList2.default)(this._backdrop).on('click', function () {\\n\\t return _this.trigger_close();\\n\\t });\\n\\t } else {\\n\\t (0, _NodeList2.default)(this._backdrop).on('transitionend', function () {\\n\\t (0, _NodeList2.default)(_this._backdrop).off();\\n\\t try {\\n\\t body.classList.remove('modal-open');\\n\\t body.style.paddingRight = '0';\\n\\t body.removeChild(_this._backdrop);\\n\\t _this._backdrop = null;\\n\\t } catch (e) {}\\n\\t });\\n\\t this._backdrop.className = 'aside-backdrop';\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t trigger: function trigger() {\\n\\t var _this2 = this;\\n\\t\\n\\t return {\\n\\t close: function close() {\\n\\t return _this2.trigger_close();\\n\\t },\\n\\t open: function open() {\\n\\t return _this2.trigger_open();\\n\\t }\\n\\t };\\n\\t },\\n\\t trigger_close: function trigger_close() {\\n\\t this.$emit('close');\\n\\t },\\n\\t trigger_open: function trigger_open() {\\n\\t this.$emit('open');\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this3 = this;\\n\\t\\n\\t this.$emit('trigger', function () {\\n\\t return _this3.trigger;\\n\\t });\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 86 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": 'slide' + _vm.placement\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t staticClass: \\\"aside\\\",\\n\\t class: _vm.placement,\\n\\t style: ({\\n\\t width: _vm.width + 'px'\\n\\t })\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-dialog\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-content\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-header\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.trigger_close\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]), _vm._v(\\\" \\\"), _vm._c('h4', {\\n\\t staticClass: \\\"aside-title\\\"\\n\\t }, [_vm._t(\\\"header\\\", [_vm._v(_vm._s(_vm.header))])], 2)]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"aside-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])])]) : _vm._e()])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-3a4bde27\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 87 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(88)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(89)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\ButtonGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-125eb0c8\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-125eb0c8\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] ButtonGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 88 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t buttons: { default: true },\\n\\t justified: { type: Boolean, default: false },\\n\\t type: { type: String, default: 'default' },\\n\\t value: { default: null },\\n\\t vertical: { type: Boolean, default: false }\\n\\t },\\n\\t data: function data() {\\n\\t this._btnGroup = true;\\n\\t return {\\n\\t val: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t val: function val(_val) {\\n\\t this.$emit('input', _val);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 89 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: {\\n\\t 'btn-group': _vm.buttons, 'btn-group-justified': _vm.justified, 'btn-group-vertical': _vm.vertical\\n\\t },\\n\\t attrs: {\\n\\t \\\"data-toggle\\\": _vm.buttons && 'buttons'\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-125eb0c8\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 90 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(91)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(93)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(94)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Carousel.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-322dee41\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-322dee41\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-322dee41\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Carousel.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 91 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 93 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t// let coerce = {\\n\\t// interval: 'number'\\n\\t// }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t indicators: {\\n\\t type: Boolean,\\n\\t default: true\\n\\t },\\n\\t controls: {\\n\\t type: Boolean,\\n\\t default: true\\n\\t },\\n\\t interval: {\\n\\t type: Number,\\n\\t default: 5000\\n\\t }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t indicator_list: [],\\n\\t index: 0,\\n\\t isAnimating: false\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t index: function index(newVal, oldVal) {\\n\\t this.slide(newVal > oldVal ? 'left' : 'right', newVal, oldVal);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t indicatorClick: function indicatorClick(index) {\\n\\t if (this.isAnimating || this.index === index) return false;\\n\\t this.isAnimating = true;\\n\\t this.index = index;\\n\\t },\\n\\t slide: function slide(direction, next, prev) {\\n\\t var _this = this;\\n\\t\\n\\t if (!this.$el) {\\n\\t return;\\n\\t }\\n\\t var $slider = (0, _NodeList2.default)('.item', this.$el);\\n\\t if (!$slider.length) {\\n\\t return;\\n\\t }\\n\\t var selected = $slider[next] || $slider[0];\\n\\t (0, _NodeList2.default)(selected).addClass(direction === 'left' ? 'next' : 'prev');\\n\\t // request property that requires layout to force a layout\\n\\t var x = selected.clientHeight;\\n\\t (0, _NodeList2.default)([$slider[prev], selected]).addClass(direction).on('transitionend', function () {\\n\\t $slider.off('transitionend').className = 'item';\\n\\t (0, _NodeList2.default)(selected).addClass('active');\\n\\t _this.isAnimating = false;\\n\\t });\\n\\t },\\n\\t next: function next() {\\n\\t if (!this.$el || this.isAnimating) {\\n\\t return false;\\n\\t }\\n\\t this.isAnimating = true;\\n\\t this.index + 1 < (0, _NodeList2.default)('.item', this.$el).length ? this.index += 1 : this.index = 0;\\n\\t },\\n\\t prev: function prev() {\\n\\t if (!this.$el || this.isAnimating) {\\n\\t return false;\\n\\t }\\n\\t this.isAnimating = true;\\n\\t this.index === 0 ? this.index = (0, _NodeList2.default)('.item', this.$el).length - 1 : this.index -= 1;\\n\\t },\\n\\t toggleInterval: function toggleInterval(val) {\\n\\t if (val === undefined) {\\n\\t val = this._intervalID;\\n\\t }\\n\\t if (this._intervalID) {\\n\\t clearInterval(this._intervalID);\\n\\t delete this._intervalID;\\n\\t }\\n\\t if (val && this.interval > 0) {\\n\\t this._intervalID = setInterval(this.next, this.interval);\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this2 = this;\\n\\t\\n\\t this.toggleInterval(true);\\n\\t (0, _NodeList2.default)(this.$el).on('mouseenter', function () {\\n\\t return _this2.toggleInterval(false);\\n\\t }).on('mouseleave', function () {\\n\\t return _this2.toggleInterval(true);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t this.toggleInterval(false);\\n\\t (0, _NodeList2.default)(this.$el).off('mouseenter mouseleave');\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 94 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"carousel slide\\\",\\n\\t attrs: {\\n\\t \\\"data-ride\\\": \\\"carousel\\\"\\n\\t }\\n\\t }, [_vm._c('ol', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.indicators),\\n\\t expression: \\\"indicators\\\"\\n\\t }],\\n\\t staticClass: \\\"carousel-indicators\\\"\\n\\t }, _vm._l((_vm.indicator_list), function(indicator, i) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t active: i === _vm.index\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.indicatorClick(i)\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span')])\\n\\t })), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"carousel-inner\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"listbox\\\"\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.controls),\\n\\t expression: \\\"controls\\\"\\n\\t }],\\n\\t staticClass: \\\"carousel-controls hidden-xs\\\"\\n\\t }, [_vm._c('a', {\\n\\t staticClass: \\\"left carousel-control\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.prev\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"glyphicon glyphicon-chevron-left\\\",\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t })]), _vm._v(\\\" \\\"), _vm._c('a', {\\n\\t staticClass: \\\"right carousel-control\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.next\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"glyphicon glyphicon-chevron-right\\\",\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t })])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-322dee41\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 95 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(96)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(98)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(99)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Checkbox.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-6922bf24\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-6922bf24\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-6922bf24\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Checkbox.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 96 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 98 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t button: { type: Boolean, default: false },\\n\\t disabled: { type: Boolean, default: false },\\n\\t falseValue: { default: false },\\n\\t name: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t trueValue: { default: true },\\n\\t type: { type: String, default: null },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t checked: this.value === this.trueValue\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t isButton: function isButton() {\\n\\t return this.button || this._inGroup && this.$parent.buttons;\\n\\t },\\n\\t isFalse: function isFalse() {\\n\\t return this.value === this.falseValue;\\n\\t },\\n\\t isTrue: function isTrue() {\\n\\t return this.value === this.trueValue;\\n\\t },\\n\\t parentValue: function parentValue() {\\n\\t return this._ingroup && this.$parent.val;\\n\\t },\\n\\t typeColor: function typeColor() {\\n\\t return this.type || this.$parent && this.$parent.type || 'default';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t checked: function checked(val, old) {\\n\\t var value = val ? this.trueValue : this.falseValue;\\n\\t this.$emit('checked', val);\\n\\t this.$emit('input', value);\\n\\t this.eval();\\n\\t },\\n\\t parentValue: function parentValue(val) {\\n\\t var checked = val === this.trueValue;\\n\\t if (this.checked !== checked) {\\n\\t this.checked = checked;\\n\\t }\\n\\t },\\n\\t value: function value(val, old) {\\n\\t var checked = val === this.trueValue;\\n\\t if (this.checked !== checked) {\\n\\t this.checked = checked;\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t var parent = this.$parent;\\n\\t if (parent && parent._btnGroup && !parent._radioGroup) {\\n\\t this._inGroup = true;\\n\\t parent._checkboxGroup = true;\\n\\t if (!(parent.val instanceof Array)) {\\n\\t parent.val = [];\\n\\t }\\n\\t this.eval();\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (!this.$parent._checkboxGroup || typeof this.value === 'boolean') {\\n\\t return;\\n\\t }\\n\\t if (this.$parent.val.length) {\\n\\t // this.checked = ~this.$parent.val.indexOf(this.value)\\n\\t this.$emit('checked', ~this.$parent.val.indexOf(this.value));\\n\\t } else if (this.checked) {\\n\\t this.$parent.val.push(this.value);\\n\\t }\\n\\t },\\n\\t\\n\\t methods: {\\n\\t eval: function _eval() {\\n\\t if (this._inGroup) {\\n\\t var value = this.checked ? this.isTrue : this.isFalse;\\n\\t var index = this.$parent.val.indexOf(value);\\n\\t if (this.checked && !~index) this.$parent.val.push(value);\\n\\t if (!this.checked && ~index) this.$parent.val.splice(index, 1);\\n\\t }\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (this.disabled || this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.checked = !this.checked;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 99 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.isButton ? 'a' : 'label', {\\n\\t tag: \\\"a\\\",\\n\\t class: [_vm.isButton ? 'btn btn-' + _vm.typeColor : 'open checkbox ' + _vm.typeColor, {\\n\\t active: _vm.checked,\\n\\t disabled: _vm.disabled,\\n\\t readonly: _vm.readonly\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggle\\n\\t }\\n\\t }, [(_vm.name) ? _vm._c('input', {\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"hidden\\\",\\n\\t \\\"name\\\": _vm.name\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.checked ? _vm.trueValue : _vm.falseValue\\n\\t }\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), (!_vm.isButton) ? _vm._c('span', {\\n\\t staticClass: \\\"icon dropdown-toggle\\\",\\n\\t class: [_vm.checked ? 'btn-' + _vm.typeColor : '', {\\n\\t bg: _vm.typeColor === 'default'\\n\\t }]\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), (!_vm.isButton && _vm.checked && _vm.typeColor === 'default') ? _vm._c('span', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-6922bf24\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 100 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(101)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(103)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(104)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Datepicker.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-477b8e5d\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-477b8e5d\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Datepicker.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 101 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 103 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\t// import $ from './utils/NodeList.js'\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t value: { type: String },\\n\\t format: { default: 'MM/dd/yyyy' },\\n\\t disabledDaysOfWeek: { type: Array, default: function _default() {\\n\\t return [];\\n\\t }\\n\\t },\\n\\t width: { type: String /*, default: '200px'*/ },\\n\\t clearButton: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t placeholder: { type: String },\\n\\t iconsFont: { type: String, default: 'glyphicon' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t currDate: new Date(),\\n\\t dateRange: [],\\n\\t decadeRange: [],\\n\\t displayDayView: false,\\n\\t displayMonthView: false,\\n\\t displayYearView: false\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t currDate: function currDate() {\\n\\t this.getDateRange();\\n\\t },\\n\\t format: function format() {\\n\\t this.$emit('input', this.stringify(this.currDate));\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t preBtnClasses: function preBtnClasses() {\\n\\t return 'datepicker-preBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-left';\\n\\t },\\n\\t nextBtnClasses: function nextBtnClasses() {\\n\\t return 'datepicker-nextBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-right';\\n\\t },\\n\\t disabledDaysArray: function disabledDaysArray() {\\n\\t return this.disabledDaysOfWeek.map(function (d) {\\n\\t return parseInt(d, 10);\\n\\t });\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t close: function close() {\\n\\t this.displayDayView = this.displayMonthView = this.displayYearView = false;\\n\\t },\\n\\t inputClick: function inputClick() {\\n\\t this.currDate = this.parse(this.value) || this.parse(new Date());\\n\\t if (this.displayMonthView || this.displayYearView) {\\n\\t this.displayDayView = false;\\n\\t } else {\\n\\t this.displayDayView = !this.displayDayView;\\n\\t }\\n\\t },\\n\\t preNextDecadeClick: function preNextDecadeClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var months = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t this.currDate = new Date(year - 10, months, date);\\n\\t } else {\\n\\t this.currDate = new Date(year + 10, months, date);\\n\\t }\\n\\t },\\n\\t preNextMonthClick: function preNextMonthClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var month = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t var preMonth = this.getYearMonth(year, month - 1);\\n\\t this.currDate = new Date(preMonth.year, preMonth.month, date);\\n\\t } else {\\n\\t var nextMonth = this.getYearMonth(year, month + 1);\\n\\t this.currDate = new Date(nextMonth.year, nextMonth.month, date);\\n\\t }\\n\\t },\\n\\t preNextYearClick: function preNextYearClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var months = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t this.currDate = new Date(year - 1, months, date);\\n\\t } else {\\n\\t this.currDate = new Date(year + 1, months, date);\\n\\t }\\n\\t },\\n\\t yearSelect: function yearSelect(year) {\\n\\t this.displayYearView = false;\\n\\t this.displayMonthView = true;\\n\\t this.currDate = new Date(year, this.currDate.getMonth(), this.currDate.getDate());\\n\\t },\\n\\t daySelect: function daySelect(day) {\\n\\t if (day.sclass === 'datepicker-item-disable') {\\n\\t return false;\\n\\t } else {\\n\\t this.currDate = day.date;\\n\\t this.$emit('input', this.stringify(this.currDate));\\n\\t this.displayDayView = false;\\n\\t }\\n\\t },\\n\\t switchMonthView: function switchMonthView() {\\n\\t this.displayDayView = false;\\n\\t this.displayMonthView = true;\\n\\t },\\n\\t switchDecadeView: function switchDecadeView() {\\n\\t this.displayMonthView = false;\\n\\t this.displayYearView = true;\\n\\t },\\n\\t monthSelect: function monthSelect(index) {\\n\\t this.displayMonthView = false;\\n\\t this.displayDayView = true;\\n\\t this.currDate = new Date(this.currDate.getFullYear(), index, this.currDate.getDate());\\n\\t },\\n\\t getYearMonth: function getYearMonth(year, month) {\\n\\t if (month > 11) {\\n\\t year++;\\n\\t month = 0;\\n\\t } else if (month < 0) {\\n\\t year--;\\n\\t month = 11;\\n\\t }\\n\\t return { year: year, month: month };\\n\\t },\\n\\t stringifyDecadeHeader: function stringifyDecadeHeader(date) {\\n\\t var yearStr = date.getFullYear().toString();\\n\\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0;\\n\\t var lastYearOfDecade = parseInt(firstYearOfDecade, 10) + 10;\\n\\t return firstYearOfDecade + '-' + lastYearOfDecade;\\n\\t },\\n\\t stringifyDayHeader: function stringifyDayHeader(date) {\\n\\t return this.text.months[date.getMonth()] + ' ' + date.getFullYear();\\n\\t },\\n\\t parseMonth: function parseMonth(date) {\\n\\t return this.text.months[date.getMonth()];\\n\\t },\\n\\t stringifyYearHeader: function stringifyYearHeader(date) {\\n\\t return date.getFullYear();\\n\\t },\\n\\t stringify: function stringify(date) {\\n\\t var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.format;\\n\\t\\n\\t if (!date) date = this.parse();\\n\\t if (!date) return '';\\n\\t var year = date.getFullYear();\\n\\t var month = date.getMonth() + 1;\\n\\t var day = date.getDate();\\n\\t var monthName = this.parseMonth(date);\\n\\t\\n\\t return format.replace(/yyyy/g, year).replace(/MMMM/g, monthName).replace(/MMM/g, monthName.substring(0, 3)).replace(/MM/g, ('0' + month).slice(-2)).replace(/dd/g, ('0' + day).slice(-2)).replace(/yy/g, year).replace(/M(?!a)/g, month).replace(/d/g, day);\\n\\t },\\n\\t parse: function parse() {\\n\\t var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.value;\\n\\t\\n\\t var date = void 0;\\n\\t if (str.length === 10 && (this.format === 'dd-MM-yyyy' || this.format === 'dd/MM/yyyy')) {\\n\\t date = new Date(str.substring(6, 10), str.substring(3, 5) - 1, str.substring(0, 2));\\n\\t } else {\\n\\t date = new Date(str);\\n\\t }\\n\\t return isNaN(date.getFullYear()) ? new Date() : date;\\n\\t },\\n\\t getDayCount: function getDayCount(year, month) {\\n\\t var dict = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\\n\\t if (month === 1) {\\n\\t if (year % 400 === 0 || year % 4 === 0 && year % 100 !== 0) {\\n\\t return 29;\\n\\t }\\n\\t }\\n\\t return dict[month];\\n\\t },\\n\\t getDateRange: function getDateRange() {\\n\\t this.dateRange = [];\\n\\t this.decadeRange = [];\\n\\t var time = {\\n\\t year: this.currDate.getFullYear(),\\n\\t month: this.currDate.getMonth(),\\n\\t day: this.currDate.getDate()\\n\\t };\\n\\t var yearStr = time.year.toString();\\n\\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0 - 1;\\n\\t for (var i = 0; i < 12; i++) {\\n\\t this.decadeRange.push({\\n\\t text: firstYearOfDecade + i\\n\\t });\\n\\t }\\n\\t\\n\\t var currMonthFirstDay = new Date(time.year, time.month, 1);\\n\\t var firstDayWeek = currMonthFirstDay.getDay() + 1;\\n\\t if (firstDayWeek === 0) {\\n\\t firstDayWeek = 7;\\n\\t }\\n\\t var dayCount = this.getDayCount(time.year, time.month);\\n\\t if (firstDayWeek > 1) {\\n\\t var preMonth = this.getYearMonth(time.year, time.month - 1);\\n\\t var prevMonthDayCount = this.getDayCount(preMonth.year, preMonth.month);\\n\\t for (var _i = 1; _i < firstDayWeek; _i++) {\\n\\t var dayText = prevMonthDayCount - firstDayWeek + _i + 1;\\n\\t var date = new Date(preMonth.year, preMonth.month, dayText);\\n\\t var sclass = 'datepicker-item-gray';\\n\\t if (this.disabledDaysArray.indexOf(date.getDay()) > -1) {\\n\\t sclass = 'datepicker-item-disable';\\n\\t }\\n\\t this.dateRange.push({\\n\\t text: dayText,\\n\\t date: date,\\n\\t sclass: 'datepicker-item-gray'\\n\\t });\\n\\t }\\n\\t }\\n\\t\\n\\t for (var _i2 = 1; _i2 <= dayCount; _i2++) {\\n\\t var _date = new Date(time.year, time.month, _i2);\\n\\t var _sclass = '';\\n\\t if (this.disabledDaysArray.indexOf(_date.getDay()) > -1) {\\n\\t _sclass = 'datepicker-item-disable';\\n\\t }\\n\\t if (_i2 == time.day && _date.getFullYear() == time.year && _date.getMonth() == time.month) {\\n\\t _sclass = 'datepicker-dateRange-item-active';\\n\\t }\\n\\t this.dateRange.push({\\n\\t text: _i2,\\n\\t date: _date,\\n\\t sclass: _sclass\\n\\t });\\n\\t }\\n\\t\\n\\t if (this.dateRange.length < 42) {\\n\\t var nextMonthNeed = 42 - this.dateRange.length;\\n\\t var nextMonth = this.getYearMonth(time.year, time.month + 1);\\n\\t\\n\\t for (var _i3 = 1; _i3 <= nextMonthNeed; _i3++) {\\n\\t var _date2 = new Date(nextMonth.year, nextMonth.month, _i3);\\n\\t var _sclass2 = 'datepicker-item-gray';\\n\\t if (this.disabledDaysArray.indexOf(_date2.getDay()) > -1) {\\n\\t _sclass2 = 'datepicker-item-disable';\\n\\t }\\n\\t this.dateRange.push({\\n\\t text: _i3,\\n\\t date: _date2,\\n\\t sclass: _sclass2\\n\\t });\\n\\t }\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t var el = this.$el;\\n\\t this._blur = function (e) {\\n\\t if (!el.contains(e.target)) _this.close();\\n\\t };\\n\\t this.$emit('child-created', this);\\n\\t this.currDate = this.parse(this.value) || this.parse(new Date());\\n\\t window.addEventListener('click', this._blur);\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t window.removeEventListener('click', this._blur);\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 104 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"datepicker\\\"\\n\\t }, [_vm._c('input', {\\n\\t staticClass: \\\"form-control datepicker-input\\\",\\n\\t class: {\\n\\t 'with-reset-button': _vm.clearButton\\n\\t },\\n\\t style: ({\\n\\t width: _vm.width\\n\\t }),\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"text\\\",\\n\\t \\\"placeholder\\\": _vm.placeholder\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.value\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.inputClick,\\n\\t \\\"input\\\": function($event) {\\n\\t _vm.$emit('input', $event.target.value)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.value) ? _vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.$emit('input', '')\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayDayView),\\n\\t expression: \\\"displayDayView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextMonthClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextMonthClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', {\\n\\t on: {\\n\\t \\\"click\\\": _vm.switchMonthView\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.stringifyDayHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-weekRange\\\"\\n\\t }, _vm._l((_vm.text.daysOfWeek), function(w) {\\n\\t return _vm._c('span', [_vm._v(_vm._s(w))])\\n\\t })), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-dateRange\\\"\\n\\t }, _vm._l((_vm.dateRange), function(d) {\\n\\t return _vm._c('span', {\\n\\t class: d.sclass,\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.daySelect(d)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(d.text))])\\n\\t }))])])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayMonthView),\\n\\t expression: \\\"displayMonthView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextYearClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextYearClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', {\\n\\t on: {\\n\\t \\\"click\\\": _vm.switchDecadeView\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.stringifyYearHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-monthRange\\\"\\n\\t }, [_vm._l((_vm.text.months), function(m, index) {\\n\\t return [_vm._c('span', {\\n\\t class: {\\n\\t 'datepicker-dateRange-item-active':\\n\\t (_vm.text.months[_vm.parse(_vm.value).getMonth()] === m) &&\\n\\t _vm.currDate.getFullYear() === _vm.parse(_vm.value).getFullYear()\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.monthSelect(index)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(m.substr(0, 3)))])]\\n\\t })], 2)])])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayYearView),\\n\\t expression: \\\"displayYearView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextDecadeClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextDecadeClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', [_vm._v(_vm._s(_vm.stringifyDecadeHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-monthRange decadeRange\\\"\\n\\t }, [_vm._l((_vm.decadeRange), function(decade) {\\n\\t return [_vm._c('span', {\\n\\t class: {\\n\\t 'datepicker-dateRange-item-active': _vm.parse(this.value).getFullYear() === decade.text\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.stopPropagation();\\n\\t _vm.yearSelect(decade.text)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(decade.text))])]\\n\\t })], 2)])])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-477b8e5d\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 105 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(106)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(107)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Dropdown.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-39be1072\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-39be1072\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Dropdown.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 106 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tvar _ClickOutside = __webpack_require__(66);\\n\\t\\n\\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t directives: {\\n\\t ClickOutside: _ClickOutside2.default\\n\\t },\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t size: { type: String, default: null },\\n\\t text: { type: String, default: null },\\n\\t type: { type: String, default: 'default' },\\n\\t value: { type: Boolean, default: false }\\n\\t },\\n\\t data: function data() {\\n\\t var show = this.value;\\n\\t return { show: show };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t show: function show(val) {\\n\\t this.$emit('input', val);\\n\\t },\\n\\t value: function value(val) {\\n\\t this.show = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t buttonSize: function buttonSize() {\\n\\t return ~['lg', 'sm', 'xs'].indexOf(this.size) ? 'btn-' + this.size : '';\\n\\t },\\n\\t inInput: function inInput() {\\n\\t return this.$parent._input;\\n\\t },\\n\\t isLi: function isLi() {\\n\\t return this.$parent._isTabs || this.$parent._navbar || this.$parent.menu;\\n\\t },\\n\\t menu: function menu() {\\n\\t return !this.$parent || this.$parent.navbar;\\n\\t },\\n\\t slots: function slots() {\\n\\t return this._slotContents;\\n\\t },\\n\\t submenu: function submenu() {\\n\\t return this.$parent && (this.$parent.menu || this.$parent.submenu);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t blur: function blur() {\\n\\t this.show = false;\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (!this.disabled) {\\n\\t this.show = !this.show;\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t (0, _NodeList2.default)('ul', this.$el).on('click', 'li>a', function (e) {\\n\\t _this.show = false;\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t (0, _NodeList2.default)('ul', this.$el).off();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 107 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.isLi ? 'li' : 'div', {\\n\\t directives: [{\\n\\t name: \\\"click-outside\\\",\\n\\t rawName: \\\"v-click-outside\\\",\\n\\t value: (_vm.blur),\\n\\t expression: \\\"blur\\\"\\n\\t }],\\n\\t tag: \\\"div\\\",\\n\\t class: [{\\n\\t open: _vm.show,\\n\\t disabled: _vm.disabled,\\n\\t dropdown: _vm.isLi,\\n\\t 'input-group-btn': _vm.inInput,\\n\\t 'btn-group': !_vm.isLi && !_vm.inInput\\n\\t }]\\n\\t }, [_vm._t(\\\"before\\\"), _vm._v(\\\" \\\"), (_vm.isLi) ? _vm._c('a', {\\n\\t class: ['dropdown-toggle', _vm.buttonSize, {\\n\\t disabled: _vm.disabled\\n\\t }],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.show = false\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"button\\\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"caret\\\"\\n\\t })], 2) : _vm._c('button', {\\n\\t class: ['btn btn-' + _vm.type, _vm.buttonSize, 'dropdown-toggle'],\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\",\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.show = false\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"button\\\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"caret\\\"\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._t(\\\"dropdown-menu\\\", [_vm._c('ul', {\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-39be1072\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 108 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(109)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(110)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\FormGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-79eb400a\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-79eb400a\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] FormGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 109 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t// let coerce = {\\n\\t// enterSubmit: 'boolean',\\n\\t// icon: 'boolean'\\n\\t// }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t enterSubmit: {\\n\\t type: Boolean,\\n\\t default: false\\n\\t },\\n\\t icon: {\\n\\t type: Boolean,\\n\\t default: false\\n\\t },\\n\\t lang: {\\n\\t type: String,\\n\\t default: navigator.language\\n\\t }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t children: [],\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t validate: function validate() {\\n\\t var valid = true;\\n\\t this.children.some(function (el) {\\n\\t var v = el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\\n\\t if (!v) valid = false;\\n\\t return !valid;\\n\\t });\\n\\t this.valid = valid;\\n\\t return valid === true;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._formGroup = true;\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formGroup) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formGroup) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.validate();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\n/***/ },\\n/* 110 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-79eb400a\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 111 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(112)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(113)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\FormValidator.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-b9f57c46\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-b9f57c46\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] FormValidator.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 112 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t enterSubmit: { type: Boolean, default: false },\\n\\t icon: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t value: null\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t children: [],\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit('input', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t validate: function validate() {\\n\\t var invalid = !this.children.every(function (el) {\\n\\t return el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\\n\\t });\\n\\t this.valid = !invalid;\\n\\t return !invalid;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._formValidator = true;\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.validate();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\n/***/ },\\n/* 113 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-b9f57c46\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 114 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(115)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(117)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(118)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Input.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-652ad7b9\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-652ad7b9\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-652ad7b9\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Input.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 115 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 117 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\tvar DELAY = 300;\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t clearButton: { type: Boolean, default: false },\\n\\t cols: { type: Number, default: null },\\n\\t datalist: { type: Array, default: null },\\n\\t disabled: { type: Boolean, default: false },\\n\\t enterSubmit: { type: Boolean, default: false },\\n\\t error: { type: String, default: null },\\n\\t help: { type: String, default: null },\\n\\t hideHelp: { type: Boolean, default: true },\\n\\t icon: { type: Boolean, default: false },\\n\\t label: { type: String, default: null },\\n\\t lang: { type: String, default: navigator.language },\\n\\t mask: null,\\n\\t maskDelay: { type: Number, default: 100 },\\n\\t match: { type: String, default: null },\\n\\t max: { type: String, default: null },\\n\\t maxlength: { type: Number, default: null },\\n\\t min: { type: String, default: null },\\n\\t minlength: { type: Number, default: 0 },\\n\\t name: { type: String, default: null },\\n\\t pattern: { default: null },\\n\\t placeholder: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t required: { type: Boolean, default: false },\\n\\t rows: { type: Number, default: 3 },\\n\\t step: { type: Number, default: null },\\n\\t type: { type: String, default: 'text' },\\n\\t url: { type: String, default: null },\\n\\t urlMap: { type: Function, default: null },\\n\\t validationDelay: { type: Number, default: 250 },\\n\\t value: { default: null }\\n\\t },\\n\\t data: function data() {\\n\\t var val = this.value;\\n\\t return {\\n\\t options: this.datalist,\\n\\t val: val,\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t canValidate: function canValidate() {\\n\\t return !this.disabled && !this.readonly && (this.required || this.regex || this.nativeValidate || this.match !== null);\\n\\t },\\n\\t errorText: function errorText() {\\n\\t var value = this.value;\\n\\t var error = [this.error];\\n\\t if (!value && this.required) error.push('(' + this.text.required.toLowerCase() + ')');\\n\\t if (value && value.length < this.minlength) error.push('(' + this.text.minLength.toLowerCase() + ': ' + this.minlength + ')');\\n\\t return error.join(' ');\\n\\t },\\n\\t id_datalist: function id_datalist() {\\n\\t if (this.type !== 'textarea' && this.datalist instanceof Array) {\\n\\t if (!this._id_datalist) {\\n\\t if (!this.$root.id_datalist) {\\n\\t this.$root.id_datalist = 0;\\n\\t }\\n\\t this._id_datalist = 'input-datalist' + this.$root.id_datalist++;\\n\\t }\\n\\t return this._id_datalist;\\n\\t }\\n\\t return null;\\n\\t },\\n\\t input: function input() {\\n\\t return this.$refs.input;\\n\\t },\\n\\t nativeValidate: function nativeValidate() {\\n\\t return (this.input || {}).checkValidity && (~['url', 'email'].indexOf(this.type.toLowerCase()) || this.min || this.max);\\n\\t },\\n\\t regex: function regex() {\\n\\t return _utils.coerce.pattern(this.pattern);\\n\\t },\\n\\t showError: function showError() {\\n\\t return this.error && this.valid === false;\\n\\t },\\n\\t showHelp: function showHelp() {\\n\\t return this.help && (!this.showError || !this.hideHelp);\\n\\t },\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t title: function title() {\\n\\t return this.errorText || this.help || '';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t datalist: function datalist(val, old) {\\n\\t if (val !== old && val instanceof Array) {\\n\\t this.options = val;\\n\\t }\\n\\t },\\n\\t match: function match(val) {\\n\\t this.eval();\\n\\t },\\n\\t options: function options(val, old) {\\n\\t if (val !== old) this.$emit('options', val);\\n\\t },\\n\\t url: function url(val) {\\n\\t this._url();\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t var _this = this;\\n\\t\\n\\t this.$emit('input', _val);\\n\\t if (_val !== old) {\\n\\t if (this.mask instanceof Function) {\\n\\t _val = this.mask(_val || '');\\n\\t if (this.val !== _val) {\\n\\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\\n\\t this._timeout.mask = setTimeout(function () {\\n\\t _this.val = _val;\\n\\t }, isNaN(this.maskDelay) ? 0 : this.maskDelay);\\n\\t }\\n\\t }\\n\\t this.eval();\\n\\t }\\n\\t },\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (this._parent) this._parent.validate();\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.val !== val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t attr: function attr(value) {\\n\\t return ~['', null, undefined].indexOf(value) || value instanceof Function ? null : value;\\n\\t },\\n\\t emit: function emit(e) {\\n\\t this.$emit(e.type, e.type == 'input' ? e.target.value : e);\\n\\t if (e.type === 'blur' && this.canValidate) {\\n\\t this.valid = this.validate();\\n\\t }\\n\\t },\\n\\t eval: function _eval() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\\n\\t if (!this.canValidate) {\\n\\t this.valid = true;\\n\\t } else {\\n\\t this._timeout.eval = setTimeout(function () {\\n\\t _this2.valid = _this2.validate();\\n\\t _this2._timeout.eval = null;\\n\\t }, this.validationDelay);\\n\\t }\\n\\t },\\n\\t focus: function focus() {\\n\\t this.input.focus();\\n\\t },\\n\\t submit: function submit() {\\n\\t if (this.$parent._formValidator) {\\n\\t return this.$parent.validate();\\n\\t }\\n\\t if (this.input.form) {\\n\\t var invalids = (0, _NodeList2.default)('.form-group.validate:not(.has-success)', this.input.form);\\n\\t if (invalids.length) {\\n\\t invalids.find('input,textarea,select')[0].focus();\\n\\t } else {\\n\\t this.input.form.submit();\\n\\t }\\n\\t }\\n\\t },\\n\\t validate: function validate() {\\n\\t if (!this.canValidate) {\\n\\t return true;\\n\\t }\\n\\t var value = (this.val || '').trim();\\n\\t if (!value) {\\n\\t return !this.required;\\n\\t }\\n\\t if (this.match !== null) {\\n\\t return this.match === value;\\n\\t }\\n\\t if (value.length < this.minlength) {\\n\\t return false;\\n\\t }\\n\\t if (this.nativeValidate && !this.input.checkValidity()) {\\n\\t return false;\\n\\t }\\n\\t if (this.regex) {\\n\\t if (!(this.regex instanceof Function ? this.regex(this.value) : this.regex.test(this.value))) {\\n\\t return false;\\n\\t }\\n\\t }\\n\\t return true;\\n\\t },\\n\\t reset: function reset() {\\n\\t this.value = '';\\n\\t this.valid = null;\\n\\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\\n\\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._input = true;\\n\\t this._timeout = {};\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t this._url = (0, _utils.delayer)(function () {\\n\\t var _this3 = this;\\n\\t\\n\\t if (!this.url || !this.$http || this._loading) {\\n\\t return;\\n\\t }\\n\\t this._loading = true;\\n\\t this.$http.get(this.url).then(function (response) {\\n\\t var data = response.data instanceof Array ? response.data : [];\\n\\t try {\\n\\t data = JSON.parse(data);\\n\\t } catch (e) {}\\n\\t if (_this3.urlMap) {\\n\\t data = data.map(_this3.urlMap);\\n\\t }\\n\\t _this3.options = data;\\n\\t _this3.loading = false;\\n\\t }, function (response) {\\n\\t _this3.loading = false;\\n\\t });\\n\\t }, DELAY);\\n\\t if (this.url) this._url();\\n\\t },\\n\\t mounted: function mounted() {\\n\\t // $(this.input).on('focus', e => { this.$emit('focus', e) }).on('blur', e => {\\n\\t // if (this.canValidate) { this.valid = this.validate() }\\n\\t // this.$emit('blur', e)\\n\\t // })\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t // $(this.input).off()\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 118 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"form-group\\\",\\n\\t class: {\\n\\t validate: _vm.canValidate, 'has-feedback': _vm.icon, 'has-error': _vm.canValidate && _vm.valid === false, 'has-success': _vm.canValidate && _vm.valid\\n\\t }\\n\\t }, [_vm._t(\\\"label\\\", [(_vm.label) ? _vm._c('label', {\\n\\t staticClass: \\\"control-label\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.label))]) : _vm._e()]), _vm._v(\\\" \\\"), (_vm.$slots.before || _vm.$slots.after) ? _vm._c('div', {\\n\\t staticClass: \\\"input-group\\\"\\n\\t }, [_vm._t(\\\"before\\\"), _vm._v(\\\" \\\"), _vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t tag: \\\"textarea\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"cols\\\": _vm.cols,\\n\\t \\\"disabled\\\": _vm.disabled,\\n\\t \\\"list\\\": _vm.id_datalist,\\n\\t \\\"max\\\": _vm.attr(_vm.max),\\n\\t \\\"maxlength\\\": _vm.maxlength,\\n\\t \\\"min\\\": _vm.attr(_vm.min),\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"placeholder\\\": _vm.placeholder,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"rows\\\": _vm.rows,\\n\\t \\\"step\\\": _vm.step,\\n\\t \\\"title\\\": _vm.attr(_vm.title),\\n\\t \\\"type\\\": _vm.type == 'textarea' ? null : _vm.type\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": _vm.emit,\\n\\t \\\"focus\\\": _vm.emit,\\n\\t \\\"input\\\": [function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }, _vm.emit],\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.value) ? _vm._c('div', {\\n\\t class: {\\n\\t icon: _vm.icon\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.value = ''\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.icon) ? _vm._c('div', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }, [(_vm.icon && _vm.valid !== null) ? _vm._c('span', {\\n\\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t }) : _vm._e()]) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"after\\\")], 2) : [_vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t tag: \\\"textarea\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"cols\\\": _vm.cols,\\n\\t \\\"disabled\\\": _vm.disabled,\\n\\t \\\"list\\\": _vm.id_datalist,\\n\\t \\\"max\\\": _vm.attr(_vm.max),\\n\\t \\\"maxlength\\\": _vm.maxlength,\\n\\t \\\"min\\\": _vm.attr(_vm.min),\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"placeholder\\\": _vm.placeholder,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"rows\\\": _vm.rows,\\n\\t \\\"step\\\": _vm.step,\\n\\t \\\"title\\\": _vm.attr(_vm.title),\\n\\t \\\"type\\\": _vm.type == 'textarea' ? null : _vm.type\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": _vm.emit,\\n\\t \\\"focus\\\": _vm.emit,\\n\\t \\\"input\\\": [function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }, _vm.emit],\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.val) ? _vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.val = ''\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.icon && _vm.valid !== null) ? _vm._c('span', {\\n\\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t }) : _vm._e()], _vm._v(\\\" \\\"), (_vm.id_datalist) ? _vm._c('datalist', {\\n\\t attrs: {\\n\\t \\\"id\\\": _vm.id_datalist\\n\\t }\\n\\t }, _vm._l((_vm.options), function(opc) {\\n\\t return _vm._c('option', {\\n\\t domProps: {\\n\\t \\\"value\\\": opc\\n\\t }\\n\\t })\\n\\t })) : _vm._e(), _vm._v(\\\" \\\"), (_vm.showHelp) ? _vm._c('div', {\\n\\t staticClass: \\\"help-block\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.help))]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.showError) ? _vm._c('div', {\\n\\t staticClass: \\\"help-block with-errors\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.errorText))]) : _vm._e()], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-652ad7b9\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 119 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(120)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(122)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(127)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Modal.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-fe7d5dc8\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-fe7d5dc8\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Modal.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 120 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 122 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _isInteger = __webpack_require__(123);\\n\\t\\n\\tvar _isInteger2 = _interopRequireDefault(_isInteger);\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t backdrop: { type: Boolean, default: true },\\n\\t callback: { type: Function, default: null },\\n\\t cancelText: { type: String, default: 'Close' },\\n\\t effect: { type: String, default: null },\\n\\t large: { type: Boolean, default: false },\\n\\t okText: { type: String, default: 'Save changes' },\\n\\t small: { type: Boolean, default: false },\\n\\t title: { type: String, default: '' },\\n\\t value: { type: Boolean, required: true },\\n\\t width: { default: null }\\n\\t },\\n\\t computed: {\\n\\t optionalWidth: function optionalWidth() {\\n\\t if (this.width === null) {\\n\\t return null;\\n\\t } else if ((0, _isInteger2.default)(this.width)) {\\n\\t return this.width + 'px';\\n\\t }\\n\\t return this.width;\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t value: function value(val) {\\n\\t this.transitionstart();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t backClose: function backClose(e) {\\n\\t if (this.backdrop && e.target === this.$el) {\\n\\t this.close();\\n\\t }\\n\\t },\\n\\t close: function close() {\\n\\t this.$emit('cancel');\\n\\t this.$emit('input', false);\\n\\t },\\n\\t ok: function ok() {\\n\\t if (this.callback instanceof Function) this.callback();\\n\\t this.$emit('ok');\\n\\t this.$emit('input', true);\\n\\t },\\n\\t transitionstart: function transitionstart() {\\n\\t var el = this.$el;\\n\\t var body = document.body;\\n\\t var scrollBarWidth = (0, _utils.getScrollBarWidth)();\\n\\t if (this.value) {\\n\\t el.querySelector('.modal-content').focus();\\n\\t el.style.display = 'block';\\n\\t setTimeout(function () {\\n\\t return el.classList.add('in');\\n\\t }, 0);\\n\\t body.classList.add('modal-open');\\n\\t if (scrollBarWidth !== 0) {\\n\\t body.style.paddingRight = scrollBarWidth + 'px';\\n\\t }\\n\\t } else {\\n\\t el.classList.remove('in');\\n\\t }\\n\\t },\\n\\t transitionend: function transitionend() {\\n\\t if (!this.value) {\\n\\t this.$el.style.display = 'none';\\n\\t var body = document.body;\\n\\t body.style.paddingRight = null;\\n\\t body.classList.remove('modal-open');\\n\\t }\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 123 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports = { \\\"default\\\": __webpack_require__(124), __esModule: true };\\n\\n/***/ },\\n/* 124 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(125);\\n\\tmodule.exports = __webpack_require__(7).Number.isInteger;\\n\\n/***/ },\\n/* 125 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 20.1.2.3 Number.isInteger(number)\\n\\tvar $export = __webpack_require__(5);\\n\\t\\n\\t$export($export.S, 'Number', {isInteger: __webpack_require__(126)});\\n\\n/***/ },\\n/* 126 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 20.1.2.3 Number.isInteger(number)\\n\\tvar isObject = __webpack_require__(13)\\n\\t , floor = Math.floor;\\n\\tmodule.exports = function isInteger(it){\\n\\t return !isObject(it) && isFinite(it) && floor(it) === it;\\n\\t};\\n\\n/***/ },\\n/* 127 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['modal', _vm.effect],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"dialog\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.backClose,\\n\\t \\\"transitionend\\\": _vm.transitionend\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t class: {\\n\\t 'modal-dialog': true, 'modal-lg': _vm.large, 'modal-sm': _vm.small\\n\\t },\\n\\t style: ({\\n\\t width: _vm.optionalWidth\\n\\t }),\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"document\\\"\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"modal-content\\\"\\n\\t }, [_vm._t(\\\"modal-header\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-header\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.close\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]), _vm._v(\\\" \\\"), _vm._c('h4', {\\n\\t staticClass: \\\"modal-title\\\"\\n\\t }, [_vm._t(\\\"title\\\", [_vm._v(_vm._s(_vm.title))])], 2)])]), _vm._v(\\\" \\\"), _vm._t(\\\"modal-body\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)]), _vm._v(\\\" \\\"), _vm._t(\\\"modal-footer\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-footer\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"btn btn-default\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.close\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.cancelText))]), _vm._v(\\\" \\\"), _vm._c('button', {\\n\\t staticClass: \\\"btn btn-primary\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.ok\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.okText))])])])], 2)])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-fe7d5dc8\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 128 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(129)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(130)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Navbar.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-38f0619e\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-38f0619e\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Navbar.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 129 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t type: { type: String, default: 'default' },\\n\\t placement: { type: String, default: '' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t id: 'bs-example-navbar-collapse-1',\\n\\t collapsed: true,\\n\\t styles: {}\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t slots: function slots() {\\n\\t return this._slotContents;\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggleCollapse: function toggleCollapse(e) {\\n\\t e && e.preventDefault();\\n\\t this.collapsed = !this.collapsed;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._navbar = true;\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t try {\\n\\t (function () {\\n\\t var $dropdown = (0, _NodeList2.default)('.dropdown>[data-toggle=\\\"dropdown\\\"]', _this.$el).parent();\\n\\t if ($dropdown) {\\n\\t $dropdown.on('click', '.dropdown-toggle', function (e) {\\n\\t e.preventDefault();\\n\\t $dropdown.each(function (content) {\\n\\t if (content.contains(e.target)) content.classList.toggle('open');\\n\\t });\\n\\t }).on('click', '.dropdown-menu>li>a', function (e) {\\n\\t $dropdown.each(function (content) {\\n\\t if (content.contains(e.target)) content.classList.remove('open');\\n\\t });\\n\\t }).onBlur(function (e) {\\n\\t $dropdown.each(function (content) {\\n\\t if (!content.contains(e.target)) content.classList.remove('open');\\n\\t });\\n\\t });\\n\\t }\\n\\t })();\\n\\t } catch (ex) {\\n\\t console.log('error finding dropdown');\\n\\t }\\n\\t\\n\\t (0, _NodeList2.default)(this.$el).on('click touchstart', 'li:not(.dropdown)>a', function (e) {\\n\\t setTimeout(function () {\\n\\t _this.collapsed = true;\\n\\t }, 200);\\n\\t }).onBlur(function (e) {\\n\\t if (!_this.$el.contains(e.target)) {\\n\\t _this.collapsed = true;\\n\\t }\\n\\t });\\n\\t var height = this.$el.offsetHeight;\\n\\t if (this.placement === 'top') {\\n\\t document.body.style.paddingTop = height + 'px';\\n\\t }\\n\\t if (this.placement === 'bottom') {\\n\\t document.body.style.paddingBottom = height + 'px';\\n\\t }\\n\\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\\\"collapse\\\"]', this.$el).on('click', function (e) {\\n\\t return _this.toggleCollapse(e);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t (0, _NodeList2.default)('.dropdown', this.$el).off('click').offBlur();\\n\\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\\\"collapse\\\"]', this.$el).off('click');\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 130 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('nav', {\\n\\t class: ['navbar', 'navbar-' + _vm.type, _vm.placement === 'static' ? 'navbar-static-top' : 'navbar-fixed-' + _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"container-fluid\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"navbar-header\\\"\\n\\t }, [(!_vm.$slots.collapse) ? _vm._c('button', {\\n\\t staticClass: \\\"navbar-toggle collapsed\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\",\\n\\t \\\"aria-expanded\\\": \\\"false\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggleCollapse\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"sr-only\\\"\\n\\t }, [_vm._v(\\\"Toggle navigation\\\")]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t })]) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"collapse\\\"), _vm._v(\\\" \\\"), _vm._t(\\\"brand\\\")], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t class: ['navbar-collapse', {\\n\\t collapse: _vm.collapsed\\n\\t }]\\n\\t }, [_vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2), _vm._v(\\\" \\\"), (_vm.$slots.left) ? _vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav navbar-left\\\"\\n\\t }, [_vm._t(\\\"left\\\")], 2) : _vm._e(), _vm._v(\\\" \\\"), (_vm.$slots.right) ? _vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav navbar-right\\\"\\n\\t }, [_vm._t(\\\"right\\\")], 2) : _vm._e()])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-38f0619e\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 131 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(132)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(133)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Option.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-42088116\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-42088116\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Option.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 132 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: { value: null },\\n\\t data: function data() {\\n\\t return { loading: true };\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this.$parent._select) {\\n\\t if (!this.$parent.options) {\\n\\t this.$parent.options = [];\\n\\t }\\n\\t var el = {};\\n\\t el[this.$parent.optionsLabel] = this.$el.innerHTML;\\n\\t el[this.$parent.optionsValue] = this.value;\\n\\t this.$parent.options.push(el);\\n\\t this.loading = false;\\n\\t } else {\\n\\t console.warn('options only work inside a select component');\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 133 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return (_vm.loading) ? _vm._c('li', [_vm._t(\\\"default\\\")], 2) : _vm._e()\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-42088116\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 134 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(135)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(137)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(138)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Panel.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-b1e0461a\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-b1e0461a\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Panel.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 135 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 137 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t header: { type: String },\\n\\t isOpen: { type: Boolean, default: null },\\n\\t type: { type: String, default: null }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t open: this.isOpen\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t isOpen: function isOpen(val) {\\n\\t this.open = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t inAccordion: function inAccordion() {\\n\\t return this.$parent && this.$parent._isAccordion;\\n\\t },\\n\\t panelType: function panelType() {\\n\\t return 'panel-' + (this.type || this.$parent && this.$parent.type || 'default');\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggle: function toggle() {\\n\\t this.open = !this.open;\\n\\t if (this.inAccordion) {\\n\\t this.$parent.openChild(this);\\n\\t }\\n\\t },\\n\\t enter: function enter(el) {\\n\\t el.style.height = 'auto';\\n\\t var endWidth = getComputedStyle(el).height;\\n\\t el.style.height = '0px';\\n\\t el.offsetHeight; // force repaint\\n\\t el.style.height = endWidth;\\n\\t },\\n\\t afterEnter: function afterEnter(el) {\\n\\t el.style.height = 'auto';\\n\\t },\\n\\t beforeLeave: function beforeLeave(el) {\\n\\t el.style.height = getComputedStyle(el).height;\\n\\t el.offsetHeight; // force repaint\\n\\t el.style.height = '0px';\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t if (this.isOpen === null) {\\n\\t this.open = !this.inAccordion;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 138 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['panel', _vm.panelType]\\n\\t }, [_vm._c('div', {\\n\\t class: ['panel-heading', {\\n\\t 'accordion-toggle': _vm.inAccordion\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.inAccordion && _vm.toggle()\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"header\\\", [_vm._c('h4', {\\n\\t staticClass: \\\"panel-title\\\"\\n\\t }, [_vm._v(_vm._s(_vm.header))])])], 2), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"collapse\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"enter\\\": _vm.enter,\\n\\t \\\"after-enter\\\": _vm.afterEnter,\\n\\t \\\"before-leave\\\": _vm.beforeLeave\\n\\t }\\n\\t }, [(_vm.open) ? _vm._c('div', {\\n\\t staticClass: \\\"panel-collapse\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"panel-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)]) : _vm._e()])], 1)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-b1e0461a\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 139 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(140)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(142)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(144)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Popover.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-2465bf54\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-2465bf54\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Popover.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 140 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 142 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _popoverMixins = __webpack_require__(143);\\n\\t\\n\\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t mixins: [_popoverMixins2.default],\\n\\t props: {\\n\\t trigger: { type: String, default: 'click' }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 143 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t content: { type: String },\\n\\t effect: { type: String, default: 'fade' },\\n\\t header: { type: Boolean, default: true },\\n\\t placement: { type: String, default: 'top' },\\n\\t title: { type: String },\\n\\t trigger: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t top: 0,\\n\\t left: 0,\\n\\t show: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t events: function events() {\\n\\t return { contextmenu: ['contextmenu'], hover: ['mouseleave', 'mouseenter'], focus: ['blur', 'focus'] }[this.trigger] || ['click'];\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t beforeEnter: function beforeEnter() {\\n\\t var _this = this;\\n\\t\\n\\t this.position();\\n\\t setTimeout(function () {\\n\\t return _this.position();\\n\\t }, 30);\\n\\t },\\n\\t position: function position() {\\n\\t var _this2 = this;\\n\\t\\n\\t this.$nextTick(function () {\\n\\t var popover = _this2.$refs.popover;\\n\\t var trigger = _this2.$refs.trigger.children[0];\\n\\t switch (_this2.placement) {\\n\\t case 'top':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\\n\\t _this2.top = trigger.offsetTop - popover.offsetHeight;\\n\\t break;\\n\\t case 'left':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\\n\\t break;\\n\\t case 'right':\\n\\t _this2.left = trigger.offsetLeft + trigger.offsetWidth;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\\n\\t break;\\n\\t case 'bottom':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight;\\n\\t break;\\n\\t default:\\n\\t console.warn('Wrong placement prop');\\n\\t }\\n\\t popover.style.top = _this2.top + 'px';\\n\\t popover.style.left = _this2.left + 'px';\\n\\t });\\n\\t },\\n\\t toggle: function toggle(e) {\\n\\t if (e && this.trigger === 'contextmenu') e.preventDefault();\\n\\t this.show = !this.show;\\n\\t if (this.show) this.beforeEnter();\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this3 = this;\\n\\t\\n\\t var trigger = this.$refs.trigger.children[0];\\n\\t if (!trigger) return console.error('Could not find trigger v-el in your component that uses popoverMixin.');\\n\\t\\n\\t if (this.trigger === 'focus' && !~trigger.tabIndex) {\\n\\t trigger = (0, _NodeList2.default)('a,input,select,textarea,button', trigger);\\n\\t if (!trigger.length) {\\n\\t return;\\n\\t }\\n\\t }\\n\\t this.events.forEach(function (event) {\\n\\t (0, _NodeList2.default)(trigger).on(event, _this3.toggle);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._trigger) (0, _NodeList2.default)(this._trigger).off();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 144 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', {\\n\\t ref: \\\"trigger\\\"\\n\\t }, [_vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.effect\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t ref: \\\"popover\\\",\\n\\t class: ['popover', _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"arrow\\\"\\n\\t }), _vm._v(\\\" \\\"), (_vm.title) ? _vm._c('h3', {\\n\\t staticClass: \\\"popover-title\\\"\\n\\t }, [_vm._t(\\\"title\\\", [_vm._v(_vm._s(_vm.title))])], 2) : _vm._e(), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"popover-content\\\"\\n\\t }, [_vm._t(\\\"content\\\", [_vm._c('span', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.content)\\n\\t }\\n\\t })])], 2)]) : _vm._e()])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-2465bf54\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 145 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(146)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(147)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Progressbar.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-68aa3375\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-68aa3375\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Progressbar.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 146 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t animated: { type: Boolean, default: false },\\n\\t label: { default: false },\\n\\t now: { required: true },\\n\\t striped: { type: Boolean, default: false },\\n\\t type: { type: String }\\n\\t },\\n\\t computed: {\\n\\t labelBool: function labelBool() {\\n\\t return _utils.coerce.boolean(this.label);\\n\\t },\\n\\t nowNum: function nowNum() {\\n\\t return _utils.coerce.number(this.now);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 147 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['progress-bar', 'progress-bar-' + _vm.type, {\\n\\t active: _vm.animated,\\n\\t 'progress-bar-striped': _vm.striped\\n\\t }],\\n\\t style: ({\\n\\t width: _vm.nowNum + '%'\\n\\t }),\\n\\t domProps: {\\n\\t \\\"textContent\\\": _vm._s(_vm.labelBool ? _vm.nowNum + '%' : null)\\n\\t }\\n\\t })\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-68aa3375\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 148 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(149)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(151)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(152)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Radio.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-74cfd92c\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-74cfd92c\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Radio.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 149 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 151 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t button: { type: Boolean, default: false },\\n\\t checkedValue: { default: true },\\n\\t disabled: { type: Boolean, default: false },\\n\\t name: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t type: { type: String, default: null },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t check: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t return this.check === this.checkedValue;\\n\\t },\\n\\t parentValue: function parentValue() {\\n\\t return this._inGroup ? this.$parent.val === this.value : null;\\n\\t },\\n\\t buttonStyle: function buttonStyle() {\\n\\t return this.button || this._inGroup && this.$parent.buttons;\\n\\t },\\n\\t typeColor: function typeColor() {\\n\\t return this.type || this.$parent && this.$parent.type || 'default';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t check: function check(val) {\\n\\t if (this.checkedValue === val) {\\n\\t this.$emit('input', val);\\n\\t this.$emit('checked', true);\\n\\t if (this._inGroup) {\\n\\t this.$parent.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t parentValue: function parentValue(val) {\\n\\t if (this.check !== val && this.checkedValue === val) {\\n\\t this.check = val;\\n\\t }\\n\\t },\\n\\t value: function value(val) {\\n\\t this.check = this.checkedValue === val ? val : null;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t var parent = this.$parent;\\n\\t if (parent && parent._btnGroup && !parent._checkboxGroup) {\\n\\t this._inGroup = true;\\n\\t parent._radioGroup = true;\\n\\t }\\n\\t if (this.$parent._radioGroup) {\\n\\t if (this.$parent.val) {\\n\\t this.check = this.$parent.val === this.checkedValue;\\n\\t } else if (this.check) {\\n\\t this.$parent.val = this.checkedValue;\\n\\t }\\n\\t }\\n\\t },\\n\\t\\n\\t methods: {\\n\\t focus: function focus() {\\n\\t this.$refs.input.focus();\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (this.disabled) {\\n\\t return;\\n\\t }\\n\\t this.focus();\\n\\t if (this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.check = this.checkedValue;\\n\\t if (this._inGroup) {\\n\\t this.$parent.val = this.checkedValue;\\n\\t }\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 152 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.buttonStyle ? 'label' : 'div', {\\n\\t tag: \\\"div\\\",\\n\\t class: [(_vm.buttonStyle ? 'btn btn-' + _vm.typeColor : 'radio ' + _vm.typeColor), {\\n\\t active: _vm.active,\\n\\t disabled: _vm.disabled,\\n\\t readonly: _vm.readonly\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [(_vm.buttonStyle) ? [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (!_vm.readonly),\\n\\t expression: \\\"!readonly\\\"\\n\\t }, {\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.check),\\n\\t expression: \\\"check\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"radio\\\",\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.checkedValue,\\n\\t \\\"checked\\\": _vm._q(_vm.check, _vm.checkedValue)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.check = _vm.checkedValue\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")] : _vm._c('label', {\\n\\t staticClass: \\\"open\\\"\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.check),\\n\\t expression: \\\"check\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"radio\\\",\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.checkedValue,\\n\\t \\\"checked\\\": _vm._q(_vm.check, _vm.checkedValue)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.check = _vm.checkedValue\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon dropdown-toggle\\\",\\n\\t class: [_vm.active ? 'btn-' + _vm.typeColor : '', {\\n\\t bg: _vm.typeColor === 'default'\\n\\t }]\\n\\t }), _vm._v(\\\" \\\"), (_vm.active && _vm.typeColor === 'default') ? _vm._c('span', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")], 2)], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-74cfd92c\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 153 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(154)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(156)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(157)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Select.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-e514dbc6\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-e514dbc6\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-e514dbc6\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Select.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 154 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 156 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _ClickOutside = __webpack_require__(66);\\n\\t\\n\\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\tvar timeout = {};\\n\\texports.default = {\\n\\t directives: {\\n\\t ClickOutside: _ClickOutside2.default\\n\\t },\\n\\t props: {\\n\\t clearButton: { type: Boolean, default: false },\\n\\t closeOnSelect: { type: Boolean, default: false },\\n\\t disabled: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t limit: { type: Number, default: 1024 },\\n\\t minSearch: { type: Number, default: 0 },\\n\\t multiple: { type: Boolean, default: false },\\n\\t name: { type: String, default: null },\\n\\t options: { type: Array, default: function _default() {\\n\\t return [];\\n\\t }\\n\\t },\\n\\t optionsLabel: { type: String, default: 'label' },\\n\\t optionsValue: { type: String, default: 'value' },\\n\\t parent: { default: true },\\n\\t placeholder: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: null },\\n\\t required: { type: Boolean, default: null },\\n\\t search: { type: Boolean, default: false },\\n\\t searchText: { type: String, default: null },\\n\\t url: { type: String, default: null },\\n\\t value: null\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t list: [],\\n\\t loading: null,\\n\\t searchValue: null,\\n\\t show: false,\\n\\t notify: false,\\n\\t val: null,\\n\\t valid: null\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t canSearch: function canSearch() {\\n\\t return this.minSearch ? this.list.length >= this.minSearch : this.search;\\n\\t },\\n\\t classes: function classes() {\\n\\t return [{ open: this.show, disabled: this.disabled }, this.class, this.isLi ? 'dropdown' : this.inInput ? 'input-group-btn' : 'btn-group'];\\n\\t },\\n\\t filteredOptions: function filteredOptions() {\\n\\t var _this = this;\\n\\t\\n\\t var search = (this.searchValue || '').toLowerCase();\\n\\t return !search ? this.list : this.list.filter(function (el) {\\n\\t return ~el[_this.optionsLabel].toLowerCase().search(search);\\n\\t });\\n\\t },\\n\\t hasParent: function hasParent() {\\n\\t return this.parent instanceof Array ? this.parent.length : this.parent;\\n\\t },\\n\\t inInput: function inInput() {\\n\\t return this.$parent._input;\\n\\t },\\n\\t isLi: function isLi() {\\n\\t return this.$parent._navbar || this.$parent.menu || this.$parent._tabset;\\n\\t },\\n\\t limitText: function limitText() {\\n\\t return this.text.limit.replace('{{limit}}', this.limit);\\n\\t },\\n\\t selected: function selected() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this.list.length === 0) {\\n\\t return '';\\n\\t }\\n\\t var sel = this.values.map(function (val) {\\n\\t return (_this2.list.find(function (o) {\\n\\t return o[_this2.optionsValue] === val;\\n\\t }) || {})[_this2.optionsLabel];\\n\\t }).filter(function (val) {\\n\\t return val !== undefined;\\n\\t });\\n\\t this.$emit('selected', sel);\\n\\t return sel.join(', ');\\n\\t },\\n\\t showPlaceholder: function showPlaceholder() {\\n\\t return this.values.length === 0 || !this.hasParent ? this.placeholder || this.text.notSelected : null;\\n\\t },\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t values: function values() {\\n\\t return this.val instanceof Array ? this.val : ~[null, undefined].indexOf(this.val) ? [] : [this.val];\\n\\t },\\n\\t valOptions: function valOptions() {\\n\\t var _this3 = this;\\n\\t\\n\\t return this.list.map(function (el) {\\n\\t return el[_this3.optionsValue];\\n\\t });\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t options: function options(_options) {\\n\\t if (_options instanceof Array) this.setOptions(_options);\\n\\t },\\n\\t show: function show(val) {\\n\\t if (val) {\\n\\t this.$refs.search ? this.$refs.search.focus() : this.$refs.btn.focus();\\n\\t // onBlur(this.$refs.select, e => { this.show = false })\\n\\t } else {\\n\\t // offBlur(this.$refs.select)\\n\\t }\\n\\t },\\n\\t url: function url() {\\n\\t this.urlChanged();\\n\\t },\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this.val = val;\\n\\t }\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t var _this4 = this;\\n\\t\\n\\t if (_val === undefined) {\\n\\t this.val = _val = null;\\n\\t }\\n\\t if (_val !== old) {\\n\\t this.$emit('change', _val);\\n\\t this.$emit('input', _val);\\n\\t }\\n\\t if (_val instanceof Array && _val.length > this.limit) {\\n\\t this.val = _val.slice(0, this.limit);\\n\\t this.notify = true;\\n\\t if (timeout.limit) clearTimeout(timeout.limit);\\n\\t timeout.limit = setTimeout(function () {\\n\\t timeout.limit = false;\\n\\t _this4.notify = false;\\n\\t }, 1500);\\n\\t }\\n\\t this.valid = this.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t close: function close() {\\n\\t this.show = false;\\n\\t },\\n\\t checkData: function checkData() {\\n\\t if (this.multiple) {\\n\\t if (this.limit < 1) {\\n\\t this.limit = 1;\\n\\t }\\n\\t if (!(this.val instanceof Array)) {\\n\\t this.val = this.val === null || this.val === undefined ? [] : [this.val];\\n\\t }\\n\\t var values = this.valOptions;\\n\\t this.val = this.val.filter(function (el) {\\n\\t return ~values.indexOf(el);\\n\\t });\\n\\t if (this.values.length > this.limit) {\\n\\t this.val = this.val.slice(0, this.limit);\\n\\t }\\n\\t } else {\\n\\t if (!~this.valOptions.indexOf(this.val)) {\\n\\t this.val = null;\\n\\t }\\n\\t }\\n\\t },\\n\\t clear: function clear() {\\n\\t if (this.disabled || this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.val = this.val instanceof Array ? [] : null;\\n\\t this.toggle();\\n\\t },\\n\\t clearSearch: function clearSearch() {\\n\\t this.searchValue = '';\\n\\t this.$refs.search.focus();\\n\\t },\\n\\t isSelected: function isSelected(v) {\\n\\t return this.values.indexOf(v) > -1;\\n\\t },\\n\\t select: function select(v) {\\n\\t if (this.val instanceof Array) {\\n\\t var newVal = this.val.slice(0);\\n\\t if (~newVal.indexOf(v)) {\\n\\t newVal.splice(newVal.indexOf(v), 1);\\n\\t } else {\\n\\t newVal.push(v);\\n\\t }\\n\\t this.val = newVal;\\n\\t if (this.closeOnSelect) {\\n\\t this.toggle();\\n\\t }\\n\\t } else {\\n\\t this.val = v;\\n\\t this.toggle();\\n\\t }\\n\\t },\\n\\t setOptions: function setOptions(options) {\\n\\t var _this5 = this;\\n\\t\\n\\t this.list = options.map(function (el) {\\n\\t if (el instanceof Object) {\\n\\t return el;\\n\\t }\\n\\t var obj = {};\\n\\t obj[_this5.optionsLabel] = el;\\n\\t obj[_this5.optionsValue] = el;\\n\\t return obj;\\n\\t });\\n\\t this.$emit('options', this.list);\\n\\t },\\n\\t toggle: function toggle() {\\n\\t this.show = !this.show;\\n\\t if (!this.show) this.$refs.btn.focus();\\n\\t },\\n\\t urlChanged: function urlChanged() {\\n\\t var _this6 = this;\\n\\t\\n\\t if (!this.url || !this.$http) {\\n\\t return;\\n\\t }\\n\\t this.loading = true;\\n\\t this.$http.get(this.url).then(function (response) {\\n\\t var data = response.data instanceof Array ? response.data : [];\\n\\t try {\\n\\t data = JSON.parse(data);\\n\\t } catch (e) {}\\n\\t _this6.setOptions(data);\\n\\t _this6.loading = false;\\n\\t _this6.checkData();\\n\\t }, function (response) {\\n\\t _this6.loading = false;\\n\\t });\\n\\t },\\n\\t validate: function validate() {\\n\\t return !this.required ? true : this.val instanceof Array ? this.val.length > 0 : this.val !== null;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this.setOptions(this.options);\\n\\t this.val = this.value;\\n\\t this._select = true;\\n\\t if (this.val === undefined || !this.parent) {\\n\\t this.val = null;\\n\\t }\\n\\t if (!this.multiple && this.val instanceof Array) {\\n\\t this.val = this.val[0];\\n\\t }\\n\\t this.checkData();\\n\\t if (this.url) this.urlChanged();\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this._parent) this._parent.children.push(this);\\n\\t this.setOptions(this.options);\\n\\t this.val = this.value;\\n\\t this.checkData();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 157 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"click-outside\\\",\\n\\t rawName: \\\"v-click-outside\\\",\\n\\t value: (_vm.close),\\n\\t expression: \\\"close\\\"\\n\\t }],\\n\\t ref: \\\"select\\\",\\n\\t class: _vm.classes\\n\\t }, [_vm._c('div', {\\n\\t ref: \\\"btn\\\",\\n\\t staticClass: \\\"form-control dropdown-toggle\\\",\\n\\t attrs: {\\n\\t \\\"tabindex\\\": \\\"1\\\",\\n\\t \\\"disabled\\\": _vm.disabled || !_vm.hasParent,\\n\\t \\\"readonly\\\": _vm.readonly\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": function($event) {\\n\\t _vm.canSearch ? null : _vm.close()\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.toggle()\\n\\t },\\n\\t \\\"keydown\\\": [function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.close($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"space\\\", 32)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }]\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"btn-content\\\",\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.loading ? _vm.text.loading : _vm.showPlaceholder || _vm.selected)\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.values.length) ? _vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.clear()\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")]) : _vm._e()]), _vm._v(\\\" \\\"), _vm._c('select', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"sel\\\",\\n\\t staticClass: \\\"secret\\\",\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"multiple\\\": _vm.multiple,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"change\\\": function($event) {\\n\\t _vm.val = Array.prototype.filter.call($event.target.options, function(o) {\\n\\t return o.selected\\n\\t }).map(function(o) {\\n\\t var val = \\\"_value\\\" in o ? o._value : o.value;\\n\\t return val\\n\\t })[0]\\n\\t }\\n\\t }\\n\\t }, [(_vm.required) ? _vm._c('option', {\\n\\t attrs: {\\n\\t \\\"value\\\": \\\"\\\"\\n\\t }\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._l((_vm.list), function(option) {\\n\\t return _vm._c('option', {\\n\\t domProps: {\\n\\t \\\"value\\\": option[_vm.optionsValue]\\n\\t }\\n\\t }, [_vm._v(_vm._s(option[_vm.optionsLabel]))])\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._c('ul', {\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, [(_vm.list.length) ? [(_vm.canSearch) ? _vm._c('li', {\\n\\t staticClass: \\\"bs-searchbox\\\"\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.searchValue),\\n\\t expression: \\\"searchValue\\\"\\n\\t }],\\n\\t ref: \\\"search\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"text\\\",\\n\\t \\\"placeholder\\\": _vm.searchText || _vm.text.search,\\n\\t \\\"autocomplete\\\": \\\"off\\\"\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.searchValue)\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.close($event)\\n\\t },\\n\\t \\\"input\\\": function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.searchValue = $event.target.value\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.searchValue),\\n\\t expression: \\\"searchValue\\\"\\n\\t }],\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.clearSearch\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.required && !_vm.clearButton) ? _vm._c('li', [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.clear() && _vm.close()\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.placeholder || _vm.text.notSelected))])]) : _vm._e(), _vm._v(\\\" \\\"), _vm._l((_vm.filteredOptions), function(option) {\\n\\t return _vm._c('li', {\\n\\t attrs: {\\n\\t \\\"id\\\": option[_vm.optionsValue]\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(option[_vm.optionsValue])\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(option[_vm.optionsLabel])\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.isSelected(option[_vm.optionsValue])),\\n\\t expression: \\\"isSelected(option[optionsValue])\\\"\\n\\t }],\\n\\t staticClass: \\\"glyphicon glyphicon-ok check-mark\\\"\\n\\t })])])\\n\\t })] : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), (_vm.notify && !_vm.closeOnSelect) ? _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"fadein\\\"\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"notify in\\\"\\n\\t }, [_vm._v(_vm._s(_vm.limitText))])]) : _vm._e()], 2), _vm._v(\\\" \\\"), (_vm.notify && _vm.closeOnSelect) ? _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"fadein\\\"\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"notify out\\\"\\n\\t }, [_vm._c('div', [_vm._v(_vm._s(_vm.limitText))])])]) : _vm._e()], 1)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-e514dbc6\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 158 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(159)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(160)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Slider.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-32185b82\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-32185b82\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Slider.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 159 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t computed: {\\n\\t index: function index() {\\n\\t return this.$parent.$children.indexOf(this);\\n\\t },\\n\\t show: function show() {\\n\\t return this.$parent.index === this.index;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this.$parent.indicator_list) {\\n\\t this.$parent.indicator_list.push(this.index);\\n\\t }\\n\\t\\n\\t if (this.index === 0) {\\n\\t this.$el.classList.add('active');\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 160 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"item\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-32185b82\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 161 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(162)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(164)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(165)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Spinner.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-8b298e70\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-8b298e70\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Spinner.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 162 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 164 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar MIN_WAIT = 500; // in ms\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t fixed: { type: Boolean, default: false },\\n\\t global: { type: Boolean, default: false },\\n\\t size: { type: String, default: 'md' },\\n\\t text: { type: String, default: '' },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t active: this.value,\\n\\t locked: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t spinnerSize: function spinnerSize() {\\n\\t return 'spinner-' + (this.size ? this.size : 'sm');\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t active: function active(val, old) {\\n\\t if (val !== old) this.$emit('input', val);\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this[val ? 'show' : 'hide']();\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t hide: function hide() {\\n\\t var delay = 0;\\n\\t this.active = false;\\n\\t },\\n\\t show: function show(options) {\\n\\t if (options) {\\n\\t if (options.text) {\\n\\t this.text = options.text;\\n\\t }\\n\\t if (options.size) {\\n\\t this.size = options.size;\\n\\t }\\n\\t if (options.fixed) {\\n\\t this.fixed = options.fixed;\\n\\t }\\n\\t }\\n\\t // block scrolling when spinner is on\\n\\t this._body.style.overflowY = 'hidden';\\n\\t // activate spinner\\n\\t this._started = new Date();\\n\\t this.active = true;\\n\\t this.locked = true;\\n\\t this._unlock();\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._body = document.body;\\n\\t this._bodyOverflow = document.body.style.overflowY;\\n\\t this._unlock = (0, _utils.delayer)(function () {\\n\\t this.locked = false;\\n\\t this._body.style.overflowY = this._bodyOverflow;\\n\\t }, MIN_WAIT);\\n\\t if (this.global) {\\n\\t if (!this.$root._globalSpinner) {\\n\\t this.$root._globalSpinner = true;\\n\\t var self = this;\\n\\t this._global = {\\n\\t hide: function hide() {\\n\\t self.hide();\\n\\t },\\n\\t show: function show() {\\n\\t self.show();\\n\\t }\\n\\t };\\n\\t this.$root.$on('spinner::show', this._global.show);\\n\\t this.$root.$on('spinner::hide', this._global.hide);\\n\\t }\\n\\t }\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._global) {\\n\\t this.$root.$off('spinner::show', this._global.show);\\n\\t this.$root.$off('spinner::hide', this._global.hide);\\n\\t delete this.$root._globalSpinner;\\n\\t }\\n\\t clearTimeout(this._spinnerAnimation);\\n\\t this._body.style.overflowY = this._bodyOverflow;\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 165 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.active || _vm.locked),\\n\\t expression: \\\"active||locked\\\"\\n\\t }],\\n\\t class: ['spinner spinner-gritcode', _vm.spinnerSize, {\\n\\t 'spinner-fixed': _vm.fixed\\n\\t }]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"spinner-wrapper\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"spinner-circle\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"spinner-text\\\"\\n\\t }, [_vm._v(_vm._s(_vm.text))])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-8b298e70\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 166 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(167)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(168)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tab.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-0985e878\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-0985e878\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tab.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 167 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t header: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t fadein: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t var _this = this;\\n\\t\\n\\t var active = !this._tabs || this._tabs.show === this;\\n\\t this.fadein = false;\\n\\t if (active) {\\n\\t setTimeout(function () {\\n\\t _this.fadein = true;\\n\\t }, 0);\\n\\t }\\n\\t return active;\\n\\t },\\n\\t index: function index() {\\n\\t return this._tabs.tabs.indexOf(this);\\n\\t },\\n\\t transition: function transition() {\\n\\t return this._tabs ? this._tabs.effect : null;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTab = true;\\n\\t var tabs = this;\\n\\t while (!this._tabs && tabs.$parent) {\\n\\t if (tabs._isTabGroup) {\\n\\t tabs.tabs.push(this);\\n\\t this._tabGroup = tabs;\\n\\t }\\n\\t if (tabs._isTabs) {\\n\\t tabs.tabs.push(this);\\n\\t this._tabs = tabs;\\n\\t if (!this._tabGroup) tabs.headers.push(this);\\n\\t }\\n\\t tabs = tabs.$parent;\\n\\t }\\n\\t if (!this._tabs) throw Error('tab depend on tabs.');\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this._tabGroup) {\\n\\t this._tabGroup.tabs = this._tabGroup.tabs.filter(function (el) {\\n\\t return el !== _this2;\\n\\t });\\n\\t }\\n\\t if (this._tabs) {\\n\\t this._tabs.tabs = this._tabs.tabs.filter(function (el) {\\n\\t return el !== _this2;\\n\\t });\\n\\t }\\n\\t if (this._tabs) {\\n\\t if (this._tabs.active === this.index) {\\n\\t this._tabs.index = 0;\\n\\t }\\n\\t if (this._ingroup) {\\n\\t var id = this.$parent.tabs.indexOf(this);\\n\\t if (~id) this.$parent.tabs.splice(id, 1);\\n\\t }\\n\\t }\\n\\t if (this._tabs) {\\n\\t var _id = this._tabs.tabs.indexOf(this);\\n\\t if (~_id) this._tabs.tabs.splice(_id, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 168 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t ref: \\\"panel\\\",\\n\\t class: ['tab-pane', {\\n\\t 'active fade': _vm.active,\\n\\t 'in': _vm.fadein\\n\\t }],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"tabpanel\\\"\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-0985e878\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 169 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(170)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(172)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(173)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\TabGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-55faf3cb\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-55faf3cb\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] TabGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 170 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 172 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t header: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t show: false,\\n\\t tabs: []\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t return ~this.tabs.indexOf(this._tabs.show);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t blur: function blur() {\\n\\t this.show = false;\\n\\t },\\n\\t toggle: function toggle() {\\n\\t this.show = !this.show;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTabGroup = true;\\n\\t if (this.$parent) {\\n\\t if (this.$parent._isTabGroup) throw Error('Can\\\\'t nest tab-groups.');\\n\\t if (!this.$parent._isTabs) throw Error('tab-group depend on tabs.');\\n\\t }\\n\\t this._tabs = this.$parent;\\n\\t this._tabs.headers.push(this);\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 173 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-55faf3cb\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 174 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(175)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(177)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(178)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tabs.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-70100ddf\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-70100ddf\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tabs.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 175 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 177 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _Dropdown = __webpack_require__(105);\\n\\t\\n\\tvar _Dropdown2 = _interopRequireDefault(_Dropdown);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t components: {\\n\\t dropdown: _Dropdown2.default\\n\\t },\\n\\t props: {\\n\\t // effect: {type: String, default: 'fadein'},\\n\\t justified: false,\\n\\t navStyle: { type: String, default: null },\\n\\t value: { type: Number, default: 0 }\\n\\t },\\n\\t data: function data() {\\n\\t var index = this.value || 0;\\n\\t return {\\n\\t index: index,\\n\\t headers: [],\\n\\t tabs: []\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t index: function index(val) {\\n\\t this.$emit('active', val);\\n\\t this.$emit('input', val);\\n\\t },\\n\\t value: function value(val) {\\n\\t this.index = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t navStyleClass: function navStyleClass() {\\n\\t return ['nav', ~['pills', 'stacked'].indexOf(this.navStyle) ? 'nav-' + this.navStyle : 'nav-tabs', {\\n\\t 'nav-justified': _utils.coerce.boolean(this.justified),\\n\\t 'nav-pills': this.navStyle === 'stacked'\\n\\t }];\\n\\t },\\n\\t show: function show() {\\n\\t return this.tabs[this.index] || this.tabs[0];\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t select: function select(tab) {\\n\\t if (!tab.disabled) {\\n\\t this.index = this.tabs.indexOf(tab);\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTabs = true;\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 178 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t attrs: {\\n\\t \\\"tabs\\\": \\\"\\\"\\n\\t }\\n\\t }, [_vm._c('ul', {\\n\\t class: _vm.navStyleClass,\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"tablist\\\"\\n\\t }\\n\\t }, [_vm._l((_vm.headers), function(header) {\\n\\t return [(header._isTab) ? _vm._c('li', {\\n\\t class: {\\n\\t active: header.active, disabled: header.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(header)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"header\\\", [_vm._c('a', {\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"#\\\"\\n\\t },\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(header.header)\\n\\t }\\n\\t })])], 2) : _vm._e(), _vm._v(\\\" \\\"), (header._isTabGroup) ? _vm._c('dropdown', {\\n\\t class: {\\n\\t active: header.active\\n\\t },\\n\\t attrs: {\\n\\t \\\"text\\\": header.header,\\n\\t \\\"disabled\\\": header.disabled\\n\\t }\\n\\t }, _vm._l((header.tabs), function(tab) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t disabled: tab.disabled\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"#\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(tab)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(tab.header))])])\\n\\t })) : _vm._e()]\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"tab-content\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-70100ddf\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 179 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(180)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(181)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\ToggleButton.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-f034a5f2\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-f034a5f2\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] ToggleButton.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 180 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { default: null },\\n\\t falseType: { default: null },\\n\\t name: null,\\n\\t readonly: { default: null },\\n\\t trueType: { default: 'primary' },\\n\\t value: false\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t active: _utils.coerce.boolean(this.value),\\n\\t types: {\\n\\t danger: 'btn-danger',\\n\\t info: 'btn-info',\\n\\t primary: 'btn-primary',\\n\\t success: 'btn-success',\\n\\t warning: 'btn-warning'\\n\\t }\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t active: function active(val, old) {\\n\\t if (val !== old) {\\n\\t this.$emit('changed', val);\\n\\t this.$emit(val ? 'enabled' : 'disabled');\\n\\t this.$emit('input', val);\\n\\t }\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this.active = _utils.coerce.boolean(this.value);\\n\\t }\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t boolDisabled: function boolDisabled() {\\n\\t return _utils.coerce.boolean(this.disabled);\\n\\t },\\n\\t boolReadonly: function boolReadonly() {\\n\\t return _utils.coerce.boolean(this.readonly);\\n\\t },\\n\\t type: function type() {\\n\\t return this.types[this.value ? this.trueType : this.falseType] || 'btn-default';\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggle: function toggle() {\\n\\t if (this.boolDisabled || this.boolReadonly) {\\n\\t return;\\n\\t }\\n\\t this.active = !this.active;\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 181 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('a', {\\n\\t class: ['btn', _vm.type, {\\n\\t readonly: _vm.boolReadonly\\n\\t }],\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"javascript:void(0)\\\",\\n\\t \\\"disabled\\\": _vm.boolDisabled\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggle\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t class: ['glyphicon', 'glyphicon-' + (_vm.value ? 'ok' : 'remove')]\\n\\t }), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), (_vm.name) ? _vm._c('input', {\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"hidden\\\",\\n\\t \\\"name\\\": _vm.name\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.active ? 1 : 0\\n\\t }\\n\\t }) : _vm._e()], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-f034a5f2\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 182 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(183)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(185)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(186)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tooltip.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-48fb51b2\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-48fb51b2\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tooltip.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 183 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 185 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _popoverMixins = __webpack_require__(143);\\n\\t\\n\\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t mixins: [_popoverMixins2.default],\\n\\t props: {\\n\\t effect: { type: String, default: 'scale' },\\n\\t trigger: { type: String, default: 'hover' }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 186 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', {\\n\\t ref: \\\"trigger\\\"\\n\\t }, [_vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.effect\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t ref: \\\"popover\\\",\\n\\t class: ['tooltip', _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"tooltip-arrow\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"tooltip-inner\\\"\\n\\t }, [_vm._t(\\\"content\\\", [_vm._c('div', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.content)\\n\\t }\\n\\t })])], 2)]) : _vm._e()])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-48fb51b2\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 187 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(188)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(190)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(206)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Typeahead.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-5b5f5e94\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-5b5f5e94\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Typeahead.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 188 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 190 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _typeof2 = __webpack_require__(191);\\n\\t\\n\\tvar _typeof3 = _interopRequireDefault(_typeof2);\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\tvar DELAY = 300; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t async: { type: String },\\n\\t data: { type: Array },\\n\\t delay: { type: Number, default: DELAY },\\n\\t asyncKey: { type: String, default: null },\\n\\t limit: { type: Number, default: 8 },\\n\\t matchCase: { type: Boolean, default: false },\\n\\t matchStart: { type: Boolean, default: false },\\n\\t onHit: {\\n\\t type: Function,\\n\\t default: function _default(item) {\\n\\t this.reset();\\n\\t this.value = item;\\n\\t }\\n\\t },\\n\\t placeholder: { type: String },\\n\\t template: { type: String },\\n\\t value: { type: String, default: '' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t showDropdown: false,\\n\\t noResults: true,\\n\\t current: 0,\\n\\t items: [],\\n\\t val: ''\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t templateHtml: function templateHtml() {\\n\\t return typeof this.template === 'string' ? '' + this.template + '' : null;\\n\\t },\\n\\t tmpl: function tmpl() {\\n\\t return this._tmpl;\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t val: function val(_val, old) {\\n\\t this.$emit('input', _val);\\n\\t if (_val !== old) this._update();\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.val !== val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t setItems: function setItems(data) {\\n\\t var _this = this;\\n\\t\\n\\t if (this.async) {\\n\\t this.items = this.asyncKey ? data[this.asyncKey] : data;\\n\\t this.items = this.items.slice(0, this.limit);\\n\\t } else {\\n\\t this.items = (data || []).filter(function (value) {\\n\\t if ((typeof value === 'undefined' ? 'undefined' : (0, _typeof3.default)(value)) === 'object') {\\n\\t return true;\\n\\t }\\n\\t value = _this.matchCase ? value : value.toLowerCase();\\n\\t var query = _this.matchCase ? _this.val : _this.val.toLowerCase();\\n\\t return _this.matchStart ? value.indexOf(query) === 0 : value.indexOf(query) !== -1;\\n\\t }).slice(0, this.limit);\\n\\t }\\n\\t this.showDropdown = this.items.length > 0;\\n\\t },\\n\\t reset: function reset() {\\n\\t this.items = [];\\n\\t this.val = '';\\n\\t this.loading = false;\\n\\t this.showDropdown = false;\\n\\t },\\n\\t setActive: function setActive(index) {\\n\\t this.current = index;\\n\\t },\\n\\t isActive: function isActive(index) {\\n\\t return this.current === index;\\n\\t },\\n\\t hit: function hit(e) {\\n\\t e.preventDefault();\\n\\t this.onHit(this.items[this.current], this);\\n\\t },\\n\\t up: function up() {\\n\\t if (this.current > 0) this.current--;\\n\\t },\\n\\t down: function down() {\\n\\t if (this.current < this.items.length - 1) this.current++;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this.val = this.value;\\n\\t this._tmpl = {\\n\\t template: this.templateHtml || '',\\n\\t props: {\\n\\t item: { default: null }\\n\\t }\\n\\t };\\n\\t this._update = (0, _utils.delayer)(function () {\\n\\t var _this2 = this;\\n\\t\\n\\t if (!this.val) {\\n\\t this.reset();\\n\\t return false;\\n\\t }\\n\\t if (this.async) {\\n\\t (0, _utils.getJSON)(this.async + this.val).then(function (data) {\\n\\t _this2.setItems(data);\\n\\t });\\n\\t } else if (this.data) {\\n\\t this.setItems(this.data);\\n\\t }\\n\\t }, 'delay', DELAY);\\n\\t this._update();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 191 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t\\\"use strict\\\";\\n\\t\\n\\texports.__esModule = true;\\n\\t\\n\\tvar _iterator = __webpack_require__(20);\\n\\t\\n\\tvar _iterator2 = _interopRequireDefault(_iterator);\\n\\t\\n\\tvar _symbol = __webpack_require__(192);\\n\\t\\n\\tvar _symbol2 = _interopRequireDefault(_symbol);\\n\\t\\n\\tvar _typeof = typeof _symbol2.default === \\\"function\\\" && typeof _iterator2.default === \\\"symbol\\\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === \\\"function\\\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \\\"symbol\\\" : typeof obj; };\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = typeof _symbol2.default === \\\"function\\\" && _typeof(_iterator2.default) === \\\"symbol\\\" ? function (obj) {\\n\\t return typeof obj === \\\"undefined\\\" ? \\\"undefined\\\" : _typeof(obj);\\n\\t} : function (obj) {\\n\\t return obj && typeof _symbol2.default === \\\"function\\\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \\\"symbol\\\" : typeof obj === \\\"undefined\\\" ? \\\"undefined\\\" : _typeof(obj);\\n\\t};\\n\\n/***/ },\\n/* 192 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports = { \\\"default\\\": __webpack_require__(193), __esModule: true };\\n\\n/***/ },\\n/* 193 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(194);\\n\\t__webpack_require__(203);\\n\\t__webpack_require__(204);\\n\\t__webpack_require__(205);\\n\\tmodule.exports = __webpack_require__(7).Symbol;\\n\\n/***/ },\\n/* 194 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t// ECMAScript 6 symbols shim\\n\\tvar global = __webpack_require__(6)\\n\\t , has = __webpack_require__(29)\\n\\t , DESCRIPTORS = __webpack_require__(15)\\n\\t , $export = __webpack_require__(5)\\n\\t , redefine = __webpack_require__(28)\\n\\t , META = __webpack_require__(195).KEY\\n\\t , $fails = __webpack_require__(16)\\n\\t , shared = __webpack_require__(43)\\n\\t , setToStringTag = __webpack_require__(47)\\n\\t , uid = __webpack_require__(44)\\n\\t , wks = __webpack_require__(48)\\n\\t , wksExt = __webpack_require__(55)\\n\\t , wksDefine = __webpack_require__(196)\\n\\t , keyOf = __webpack_require__(197)\\n\\t , enumKeys = __webpack_require__(198)\\n\\t , isArray = __webpack_require__(201)\\n\\t , anObject = __webpack_require__(12)\\n\\t , toIObject = __webpack_require__(36)\\n\\t , toPrimitive = __webpack_require__(18)\\n\\t , createDesc = __webpack_require__(19)\\n\\t , _create = __webpack_require__(32)\\n\\t , gOPNExt = __webpack_require__(60)\\n\\t , $GOPD = __webpack_require__(202)\\n\\t , $DP = __webpack_require__(11)\\n\\t , $keys = __webpack_require__(34)\\n\\t , gOPD = $GOPD.f\\n\\t , dP = $DP.f\\n\\t , gOPN = gOPNExt.f\\n\\t , $Symbol = global.Symbol\\n\\t , $JSON = global.JSON\\n\\t , _stringify = $JSON && $JSON.stringify\\n\\t , PROTOTYPE = 'prototype'\\n\\t , HIDDEN = wks('_hidden')\\n\\t , TO_PRIMITIVE = wks('toPrimitive')\\n\\t , isEnum = {}.propertyIsEnumerable\\n\\t , SymbolRegistry = shared('symbol-registry')\\n\\t , AllSymbols = shared('symbols')\\n\\t , OPSymbols = shared('op-symbols')\\n\\t , ObjectProto = Object[PROTOTYPE]\\n\\t , USE_NATIVE = typeof $Symbol == 'function'\\n\\t , QObject = global.QObject;\\n\\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\\n\\tvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\\n\\t\\n\\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\\n\\tvar setSymbolDesc = DESCRIPTORS && $fails(function(){\\n\\t return _create(dP({}, 'a', {\\n\\t get: function(){ return dP(this, 'a', {value: 7}).a; }\\n\\t })).a != 7;\\n\\t}) ? function(it, key, D){\\n\\t var protoDesc = gOPD(ObjectProto, key);\\n\\t if(protoDesc)delete ObjectProto[key];\\n\\t dP(it, key, D);\\n\\t if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);\\n\\t} : dP;\\n\\t\\n\\tvar wrap = function(tag){\\n\\t var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\\n\\t sym._k = tag;\\n\\t return sym;\\n\\t};\\n\\t\\n\\tvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){\\n\\t return typeof it == 'symbol';\\n\\t} : function(it){\\n\\t return it instanceof $Symbol;\\n\\t};\\n\\t\\n\\tvar $defineProperty = function defineProperty(it, key, D){\\n\\t if(it === ObjectProto)$defineProperty(OPSymbols, key, D);\\n\\t anObject(it);\\n\\t key = toPrimitive(key, true);\\n\\t anObject(D);\\n\\t if(has(AllSymbols, key)){\\n\\t if(!D.enumerable){\\n\\t if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));\\n\\t it[HIDDEN][key] = true;\\n\\t } else {\\n\\t if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;\\n\\t D = _create(D, {enumerable: createDesc(0, false)});\\n\\t } return setSymbolDesc(it, key, D);\\n\\t } return dP(it, key, D);\\n\\t};\\n\\tvar $defineProperties = function defineProperties(it, P){\\n\\t anObject(it);\\n\\t var keys = enumKeys(P = toIObject(P))\\n\\t , i = 0\\n\\t , l = keys.length\\n\\t , key;\\n\\t while(l > i)$defineProperty(it, key = keys[i++], P[key]);\\n\\t return it;\\n\\t};\\n\\tvar $create = function create(it, P){\\n\\t return P === undefined ? _create(it) : $defineProperties(_create(it), P);\\n\\t};\\n\\tvar $propertyIsEnumerable = function propertyIsEnumerable(key){\\n\\t var E = isEnum.call(this, key = toPrimitive(key, true));\\n\\t if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;\\n\\t return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\\n\\t};\\n\\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){\\n\\t it = toIObject(it);\\n\\t key = toPrimitive(key, true);\\n\\t if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;\\n\\t var D = gOPD(it, key);\\n\\t if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;\\n\\t return D;\\n\\t};\\n\\tvar $getOwnPropertyNames = function getOwnPropertyNames(it){\\n\\t var names = gOPN(toIObject(it))\\n\\t , result = []\\n\\t , i = 0\\n\\t , key;\\n\\t while(names.length > i){\\n\\t if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);\\n\\t } return result;\\n\\t};\\n\\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(it){\\n\\t var IS_OP = it === ObjectProto\\n\\t , names = gOPN(IS_OP ? OPSymbols : toIObject(it))\\n\\t , result = []\\n\\t , i = 0\\n\\t , key;\\n\\t while(names.length > i){\\n\\t if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);\\n\\t } return result;\\n\\t};\\n\\t\\n\\t// 19.4.1.1 Symbol([description])\\n\\tif(!USE_NATIVE){\\n\\t $Symbol = function Symbol(){\\n\\t if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');\\n\\t var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\\n\\t var $set = function(value){\\n\\t if(this === ObjectProto)$set.call(OPSymbols, value);\\n\\t if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;\\n\\t setSymbolDesc(this, tag, createDesc(1, value));\\n\\t };\\n\\t if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});\\n\\t return wrap(tag);\\n\\t };\\n\\t redefine($Symbol[PROTOTYPE], 'toString', function toString(){\\n\\t return this._k;\\n\\t });\\n\\t\\n\\t $GOPD.f = $getOwnPropertyDescriptor;\\n\\t $DP.f = $defineProperty;\\n\\t __webpack_require__(61).f = gOPNExt.f = $getOwnPropertyNames;\\n\\t __webpack_require__(200).f = $propertyIsEnumerable;\\n\\t __webpack_require__(199).f = $getOwnPropertySymbols;\\n\\t\\n\\t if(DESCRIPTORS && !__webpack_require__(27)){\\n\\t redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\\n\\t }\\n\\t\\n\\t wksExt.f = function(name){\\n\\t return wrap(wks(name));\\n\\t }\\n\\t}\\n\\t\\n\\t$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});\\n\\t\\n\\tfor(var symbols = (\\n\\t // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\\n\\t 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\\n\\t).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);\\n\\t\\n\\tfor(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);\\n\\t\\n\\t$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\\n\\t // 19.4.2.1 Symbol.for(key)\\n\\t 'for': function(key){\\n\\t return has(SymbolRegistry, key += '')\\n\\t ? SymbolRegistry[key]\\n\\t : SymbolRegistry[key] = $Symbol(key);\\n\\t },\\n\\t // 19.4.2.5 Symbol.keyFor(sym)\\n\\t keyFor: function keyFor(key){\\n\\t if(isSymbol(key))return keyOf(SymbolRegistry, key);\\n\\t throw TypeError(key + ' is not a symbol!');\\n\\t },\\n\\t useSetter: function(){ setter = true; },\\n\\t useSimple: function(){ setter = false; }\\n\\t});\\n\\t\\n\\t$export($export.S + $export.F * !USE_NATIVE, 'Object', {\\n\\t // 19.1.2.2 Object.create(O [, Properties])\\n\\t create: $create,\\n\\t // 19.1.2.4 Object.defineProperty(O, P, Attributes)\\n\\t defineProperty: $defineProperty,\\n\\t // 19.1.2.3 Object.defineProperties(O, Properties)\\n\\t defineProperties: $defineProperties,\\n\\t // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\\n\\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\\n\\t // 19.1.2.7 Object.getOwnPropertyNames(O)\\n\\t getOwnPropertyNames: $getOwnPropertyNames,\\n\\t // 19.1.2.8 Object.getOwnPropertySymbols(O)\\n\\t getOwnPropertySymbols: $getOwnPropertySymbols\\n\\t});\\n\\t\\n\\t// 24.3.2 JSON.stringify(value [, replacer [, space]])\\n\\t$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){\\n\\t var S = $Symbol();\\n\\t // MS Edge converts symbol values to JSON as {}\\n\\t // WebKit converts symbol values to JSON as null\\n\\t // V8 throws on boxed symbols\\n\\t return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';\\n\\t})), 'JSON', {\\n\\t stringify: function stringify(it){\\n\\t if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined\\n\\t var args = [it]\\n\\t , i = 1\\n\\t , replacer, $replacer;\\n\\t while(arguments.length > i)args.push(arguments[i++]);\\n\\t replacer = args[1];\\n\\t if(typeof replacer == 'function')$replacer = replacer;\\n\\t if($replacer || !isArray(replacer))replacer = function(key, value){\\n\\t if($replacer)value = $replacer.call(this, key, value);\\n\\t if(!isSymbol(value))return value;\\n\\t };\\n\\t args[1] = replacer;\\n\\t return _stringify.apply($JSON, args);\\n\\t }\\n\\t});\\n\\t\\n\\t// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\\n\\t$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(10)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\\n\\t// 19.4.3.5 Symbol.prototype[@@toStringTag]\\n\\tsetToStringTag($Symbol, 'Symbol');\\n\\t// 20.2.1.9 Math[@@toStringTag]\\n\\tsetToStringTag(Math, 'Math', true);\\n\\t// 24.3.3 JSON[@@toStringTag]\\n\\tsetToStringTag(global.JSON, 'JSON', true);\\n\\n/***/ },\\n/* 195 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar META = __webpack_require__(44)('meta')\\n\\t , isObject = __webpack_require__(13)\\n\\t , has = __webpack_require__(29)\\n\\t , setDesc = __webpack_require__(11).f\\n\\t , id = 0;\\n\\tvar isExtensible = Object.isExtensible || function(){\\n\\t return true;\\n\\t};\\n\\tvar FREEZE = !__webpack_require__(16)(function(){\\n\\t return isExtensible(Object.preventExtensions({}));\\n\\t});\\n\\tvar setMeta = function(it){\\n\\t setDesc(it, META, {value: {\\n\\t i: 'O' + ++id, // object ID\\n\\t w: {} // weak collections IDs\\n\\t }});\\n\\t};\\n\\tvar fastKey = function(it, create){\\n\\t // return primitive with prefix\\n\\t if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\\n\\t if(!has(it, META)){\\n\\t // can't set metadata to uncaught frozen object\\n\\t if(!isExtensible(it))return 'F';\\n\\t // not necessary to add metadata\\n\\t if(!create)return 'E';\\n\\t // add missing metadata\\n\\t setMeta(it);\\n\\t // return object ID\\n\\t } return it[META].i;\\n\\t};\\n\\tvar getWeak = function(it, create){\\n\\t if(!has(it, META)){\\n\\t // can't set metadata to uncaught frozen object\\n\\t if(!isExtensible(it))return true;\\n\\t // not necessary to add metadata\\n\\t if(!create)return false;\\n\\t // add missing metadata\\n\\t setMeta(it);\\n\\t // return hash weak collections IDs\\n\\t } return it[META].w;\\n\\t};\\n\\t// add metadata on freeze-family methods calling\\n\\tvar onFreeze = function(it){\\n\\t if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it);\\n\\t return it;\\n\\t};\\n\\tvar meta = module.exports = {\\n\\t KEY: META,\\n\\t NEED: false,\\n\\t fastKey: fastKey,\\n\\t getWeak: getWeak,\\n\\t onFreeze: onFreeze\\n\\t};\\n\\n/***/ },\\n/* 196 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar global = __webpack_require__(6)\\n\\t , core = __webpack_require__(7)\\n\\t , LIBRARY = __webpack_require__(27)\\n\\t , wksExt = __webpack_require__(55)\\n\\t , defineProperty = __webpack_require__(11).f;\\n\\tmodule.exports = function(name){\\n\\t var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\\n\\t if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});\\n\\t};\\n\\n/***/ },\\n/* 197 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar getKeys = __webpack_require__(34)\\n\\t , toIObject = __webpack_require__(36);\\n\\tmodule.exports = function(object, el){\\n\\t var O = toIObject(object)\\n\\t , keys = getKeys(O)\\n\\t , length = keys.length\\n\\t , index = 0\\n\\t , key;\\n\\t while(length > index)if(O[key = keys[index++]] === el)return key;\\n\\t};\\n\\n/***/ },\\n/* 198 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// all enumerable object keys, includes symbols\\n\\tvar getKeys = __webpack_require__(34)\\n\\t , gOPS = __webpack_require__(199)\\n\\t , pIE = __webpack_require__(200);\\n\\tmodule.exports = function(it){\\n\\t var result = getKeys(it)\\n\\t , getSymbols = gOPS.f;\\n\\t if(getSymbols){\\n\\t var symbols = getSymbols(it)\\n\\t , isEnum = pIE.f\\n\\t , i = 0\\n\\t , key;\\n\\t while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);\\n\\t } return result;\\n\\t};\\n\\n/***/ },\\n/* 199 */\\n/***/ function(module, exports) {\\n\\n\\texports.f = Object.getOwnPropertySymbols;\\n\\n/***/ },\\n/* 200 */\\n/***/ function(module, exports) {\\n\\n\\texports.f = {}.propertyIsEnumerable;\\n\\n/***/ },\\n/* 201 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 7.2.2 IsArray(argument)\\n\\tvar cof = __webpack_require__(38);\\n\\tmodule.exports = Array.isArray || function isArray(arg){\\n\\t return cof(arg) == 'Array';\\n\\t};\\n\\n/***/ },\\n/* 202 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar pIE = __webpack_require__(200)\\n\\t , createDesc = __webpack_require__(19)\\n\\t , toIObject = __webpack_require__(36)\\n\\t , toPrimitive = __webpack_require__(18)\\n\\t , has = __webpack_require__(29)\\n\\t , IE8_DOM_DEFINE = __webpack_require__(14)\\n\\t , gOPD = Object.getOwnPropertyDescriptor;\\n\\t\\n\\texports.f = __webpack_require__(15) ? gOPD : function getOwnPropertyDescriptor(O, P){\\n\\t O = toIObject(O);\\n\\t P = toPrimitive(P, true);\\n\\t if(IE8_DOM_DEFINE)try {\\n\\t return gOPD(O, P);\\n\\t } catch(e){ /* empty */ }\\n\\t if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);\\n\\t};\\n\\n/***/ },\\n/* 203 */\\n/***/ function(module, exports) {\\n\\n\\n\\n/***/ },\\n/* 204 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(196)('asyncIterator');\\n\\n/***/ },\\n/* 205 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(196)('observable');\\n\\n/***/ },\\n/* 206 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: {\\n\\t 'open': _vm.showDropdown\\n\\t },\\n\\t staticStyle: {\\n\\t \\\"position\\\": \\\"relative\\\"\\n\\t }\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"text\\\",\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"placeholder\\\": _vm.placeholder\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": function($event) {\\n\\t _vm.showDropdown = false\\n\\t },\\n\\t \\\"keydown\\\": [function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"down\\\", 40)) { return; }\\n\\t _vm.down($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.hit($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.reset($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"up\\\", 38)) { return; }\\n\\t _vm.up($event)\\n\\t }],\\n\\t \\\"input\\\": function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('ul', {\\n\\t ref: \\\"dropdown\\\",\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, _vm._l((_vm.items), function(item, i) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t 'active': _vm.isActive(i)\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.hit($event)\\n\\t },\\n\\t \\\"mousemove\\\": function($event) {\\n\\t _vm.setActive(i)\\n\\t }\\n\\t }\\n\\t }, [_vm._c(_vm.tmpl, {\\n\\t tag: \\\"component\\\",\\n\\t attrs: {\\n\\t \\\"item\\\": item\\n\\t }\\n\\t })], 1)])\\n\\t }))])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-5b5f5e94\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ }\\n/******/ ])\\n});\\n;\\n//# sourceMappingURL=vue-strap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3Z1ZS1zdHJhcC9kaXN0L3Z1ZS1zdHJhcC5qcz9lMTQ3Il0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlZ1ZVN0cmFwXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlZ1ZVN0cmFwXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge30sXG4vKioqKioqLyBcdFx0XHRpZDogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KTtcblx0XG5cdHZhciBfQ2xpY2tPdXRzaWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsaWNrT3V0c2lkZSk7XG5cdFxuXHR2YXIgX1Njcm9sbCA9IF9fd2VicGFja19yZXF1aXJlX18oNjgpO1xuXHRcblx0dmFyIF9TY3JvbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2Nyb2xsKTtcblx0XG5cdHZhciBfQWNjb3JkaW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OSk7XG5cdFxuXHR2YXIgX0FjY29yZGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BY2NvcmRpb24pO1xuXHRcblx0dmFyIF9BZmZpeCA9IF9fd2VicGFja19yZXF1aXJlX18oNzIpO1xuXHRcblx0dmFyIF9BZmZpeDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BZmZpeCk7XG5cdFxuXHR2YXIgX0FsZXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NSk7XG5cdFxuXHR2YXIgX0FsZXJ0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FsZXJ0KTtcblx0XG5cdHZhciBfQXNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyKTtcblx0XG5cdHZhciBfQXNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQXNpZGUpO1xuXHRcblx0dmFyIF9CdXR0b25Hcm91cCA9IF9fd2VicGFja19yZXF1aXJlX18oODcpO1xuXHRcblx0dmFyIF9CdXR0b25Hcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CdXR0b25Hcm91cCk7XG5cdFxuXHR2YXIgX0Nhcm91c2VsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MCk7XG5cdFxuXHR2YXIgX0Nhcm91c2VsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Nhcm91c2VsKTtcblx0XG5cdHZhciBfQ2hlY2tib3ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1KTtcblx0XG5cdHZhciBfQ2hlY2tib3gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2hlY2tib3gpO1xuXHRcblx0dmFyIF9EYXRlcGlja2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDApO1xuXHRcblx0dmFyIF9EYXRlcGlja2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0RhdGVwaWNrZXIpO1xuXHRcblx0dmFyIF9Ecm9wZG93biA9IF9fd2VicGFja19yZXF1aXJlX18oMTA1KTtcblx0XG5cdHZhciBfRHJvcGRvd24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRHJvcGRvd24pO1xuXHRcblx0dmFyIF9Gb3JtR3JvdXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwOCk7XG5cdFxuXHR2YXIgX0Zvcm1Hcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Gb3JtR3JvdXApO1xuXHRcblx0dmFyIF9Gb3JtVmFsaWRhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTEpO1xuXHRcblx0dmFyIF9Gb3JtVmFsaWRhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Zvcm1WYWxpZGF0b3IpO1xuXHRcblx0dmFyIF9JbnB1dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE0KTtcblx0XG5cdHZhciBfSW5wdXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfSW5wdXQpO1xuXHRcblx0dmFyIF9Nb2RhbCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE5KTtcblx0XG5cdHZhciBfTW9kYWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTW9kYWwpO1xuXHRcblx0dmFyIF9OYXZiYXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyOCk7XG5cdFxuXHR2YXIgX05hdmJhcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9OYXZiYXIpO1xuXHRcblx0dmFyIF9PcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMSk7XG5cdFxuXHR2YXIgX09wdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9PcHRpb24pO1xuXHRcblx0dmFyIF9QYW5lbCA9IF9fd2VicGFja19yZXF1aXJlX18oMTM0KTtcblx0XG5cdHZhciBfUGFuZWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFuZWwpO1xuXHRcblx0dmFyIF9Qb3BvdmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzkpO1xuXHRcblx0dmFyIF9Qb3BvdmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BvcG92ZXIpO1xuXHRcblx0dmFyIF9Qcm9ncmVzc2JhciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ1KTtcblx0XG5cdHZhciBfUHJvZ3Jlc3NiYXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUHJvZ3Jlc3NiYXIpO1xuXHRcblx0dmFyIF9SYWRpbyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ4KTtcblx0XG5cdHZhciBfUmFkaW8yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUmFkaW8pO1xuXHRcblx0dmFyIF9TZWxlY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1Myk7XG5cdFxuXHR2YXIgX1NlbGVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TZWxlY3QpO1xuXHRcblx0dmFyIF9TbGlkZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1OCk7XG5cdFxuXHR2YXIgX1NsaWRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TbGlkZXIpO1xuXHRcblx0dmFyIF9TcGlubmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjEpO1xuXHRcblx0dmFyIF9TcGlubmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NwaW5uZXIpO1xuXHRcblx0dmFyIF9UYWIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2Nik7XG5cdFxuXHR2YXIgX1RhYjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWIpO1xuXHRcblx0dmFyIF9UYWJHcm91cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTY5KTtcblx0XG5cdHZhciBfVGFiR3JvdXAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFiR3JvdXApO1xuXHRcblx0dmFyIF9UYWJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzQpO1xuXHRcblx0dmFyIF9UYWJzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYnMpO1xuXHRcblx0dmFyIF9Ub2dnbGVCdXR0b24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3OSk7XG5cdFxuXHR2YXIgX1RvZ2dsZUJ1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ub2dnbGVCdXR0b24pO1xuXHRcblx0dmFyIF9Ub29sdGlwID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODIpO1xuXHRcblx0dmFyIF9Ub29sdGlwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Rvb2x0aXApO1xuXHRcblx0dmFyIF9UeXBlYWhlYWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4Nyk7XG5cdFxuXHR2YXIgX1R5cGVhaGVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UeXBlYWhlYWQpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdC8vIENvbXBvbmVudHNcblx0XG5cdC8vIERpcmVjdGl2ZXNcblx0Ly8gVXRpbHNcblx0dmFyIFZ1ZVN0cmFwID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIENsaWNrT3V0c2lkZTogX0NsaWNrT3V0c2lkZTIuZGVmYXVsdCxcblx0ICAgIFNjcm9sbDogX1Njcm9sbDIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgdXRpbHM6IHtcblx0ICAgICQ6IF9Ob2RlTGlzdDIuZGVmYXVsdCxcblx0ICAgIGNvZXJjZTogX3V0aWxzLmNvZXJjZVxuXHQgIH0sXG5cdCAgLy9jb21wb25lbnRzXG5cdCAgYWNjb3JkaW9uOiBfQWNjb3JkaW9uMi5kZWZhdWx0LFxuXHQgIGFmZml4OiBfQWZmaXgyLmRlZmF1bHQsXG5cdCAgYWxlcnQ6IF9BbGVydDIuZGVmYXVsdCxcblx0ICBhc2lkZTogX0FzaWRlMi5kZWZhdWx0LFxuXHQgIGJ1dHRvbkdyb3VwOiBfQnV0dG9uR3JvdXAyLmRlZmF1bHQsXG5cdCAgY2Fyb3VzZWw6IF9DYXJvdXNlbDIuZGVmYXVsdCxcblx0ICBjaGVja2JveDogX0NoZWNrYm94Mi5kZWZhdWx0LFxuXHQgIGRhdGVwaWNrZXI6IF9EYXRlcGlja2VyMi5kZWZhdWx0LFxuXHQgIGRyb3Bkb3duOiBfRHJvcGRvd24yLmRlZmF1bHQsXG5cdCAgZm9ybUdyb3VwOiBfRm9ybUdyb3VwMi5kZWZhdWx0LFxuXHQgIGZvcm1WYWxpZGF0b3I6IF9Gb3JtVmFsaWRhdG9yMi5kZWZhdWx0LFxuXHQgIGlucHV0OiBfSW5wdXQyLmRlZmF1bHQsXG5cdCAgbW9kYWw6IF9Nb2RhbDIuZGVmYXVsdCxcblx0ICBuYXZiYXI6IF9OYXZiYXIyLmRlZmF1bHQsXG5cdCAgb3B0aW9uOiBfT3B0aW9uMi5kZWZhdWx0LFxuXHQgIHBhbmVsOiBfUGFuZWwyLmRlZmF1bHQsXG5cdCAgcG9wb3ZlcjogX1BvcG92ZXIyLmRlZmF1bHQsXG5cdCAgcHJvZ3Jlc3NiYXI6IF9Qcm9ncmVzc2JhcjIuZGVmYXVsdCxcblx0ICByYWRpbzogX1JhZGlvMi5kZWZhdWx0LFxuXHQgIHNlbGVjdDogX1NlbGVjdDIuZGVmYXVsdCxcblx0ICBzbGlkZXI6IF9TbGlkZXIyLmRlZmF1bHQsXG5cdCAgc3Bpbm5lcjogX1NwaW5uZXIyLmRlZmF1bHQsXG5cdCAgdGFiOiBfVGFiMi5kZWZhdWx0LFxuXHQgIHRhYkdyb3VwOiBfVGFiR3JvdXAyLmRlZmF1bHQsXG5cdCAgdGFiczogX1RhYnMyLmRlZmF1bHQsXG5cdCAgdG9nZ2xlQnV0dG9uOiBfVG9nZ2xlQnV0dG9uMi5kZWZhdWx0LFxuXHQgIHRvb2x0aXA6IF9Ub29sdGlwMi5kZWZhdWx0LFxuXHQgIHR5cGVhaGVhZDogX1R5cGVhaGVhZDIuZGVmYXVsdFxuXHR9O1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBWdWVTdHJhcDtcblxuLyoqKi8gfSxcbi8qIDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9kZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdFxuXHR2YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmluZVByb3BlcnR5KTtcblx0XG5cdHZhciBfaXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcblx0XG5cdHZhciBfaXRlcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXRlcmF0b3IpO1xuXHRcblx0dmFyIF9nZXRPd25Qcm9wZXJ0eU5hbWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Nik7XG5cdFxuXHR2YXIgX2dldE93blByb3BlcnR5TmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0T3duUHJvcGVydHlOYW1lcyk7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9fd2VicGFja19yZXF1aXJlX18oNjIpO1xuXHRcblx0dmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYzKTtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2xhc3MyKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDY0KTtcblx0XG5cdHZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXHR2YXIgbm9kZUVycm9yID0gbmV3IEVycm9yKCdQYXNzZWQgYXJndW1lbnRzIG11c3QgYmUgb2YgTm9kZScpO1xuXHR2YXIgYmx1ckV2ZW50O1xuXHR2YXIgYmx1ckxpc3QgPSBbXTtcblx0dmFyIEV2ZW50cyA9IFtdO1xuXHRcblx0ZnVuY3Rpb24gaXNOb2RlKHZhbCkge1xuXHQgIHJldHVybiB2YWwgaW5zdGFuY2VvZiB3aW5kb3cuTm9kZTtcblx0fVxuXHRmdW5jdGlvbiBpc05vZGVMaXN0KHZhbCkge1xuXHQgIHJldHVybiB2YWwgaW5zdGFuY2VvZiB3aW5kb3cuTm9kZUxpc3QgfHwgdmFsIGluc3RhbmNlb2YgTm9kZUxpc3QgfHwgdmFsIGluc3RhbmNlb2Ygd2luZG93LkhUTUxDb2xsZWN0aW9uIHx8IHZhbCBpbnN0YW5jZW9mIEFycmF5O1xuXHR9XG5cdFxuXHR2YXIgTm9kZUxpc3QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgZnVuY3Rpb24gTm9kZUxpc3QoYXJncykge1xuXHQgICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgTm9kZUxpc3QpO1xuXHRcblx0ICAgIHZhciBub2RlcyA9IGFyZ3M7XG5cdCAgICBpZiAoYXJnc1swXSA9PT0gd2luZG93KSB7XG5cdCAgICAgIG5vZGVzID0gW3dpbmRvd107XG5cdCAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuXHQgICAgICBub2RlcyA9IChhcmdzWzFdIHx8IGRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsKGFyZ3NbMF0pO1xuXHQgICAgICBpZiAoYXJnc1sxXSkge1xuXHQgICAgICAgIHRoaXMub3duZXIgPSBhcmdzWzFdO1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2UgaWYgKDAgaW4gYXJncyAmJiAhaXNOb2RlKGFyZ3NbMF0pICYmIGFyZ3NbMF0gJiYgJ2xlbmd0aCcgaW4gYXJnc1swXSkge1xuXHQgICAgICBub2RlcyA9IGFyZ3NbMF07XG5cdCAgICAgIGlmIChhcmdzWzFdKSB7XG5cdCAgICAgICAgdGhpcy5vd25lciA9IGFyZ3NbMV07XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGlmIChub2Rlcykge1xuXHQgICAgICBmb3IgKHZhciBpIGluIG5vZGVzKSB7XG5cdCAgICAgICAgdGhpc1tpXSA9IG5vZGVzW2ldO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMubGVuZ3RoID0gbm9kZXMubGVuZ3RoO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5sZW5ndGggPSAwO1xuXHQgICAgfVxuXHQgICAgd2luZG93LnBydWViYSA9IHRoaXM7XG5cdCAgfVxuXHRcblx0ICAoMCwgX2NyZWF0ZUNsYXNzMy5kZWZhdWx0KShOb2RlTGlzdCwgW3tcblx0ICAgIGtleTogJ2NvbmNhdCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gY29uY2F0KCkge1xuXHQgICAgICB2YXIgbm9kZXMgPSBBcnJheVByb3RvLnNsaWNlLmNhbGwodGhpcyk7XG5cdCAgICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYXJyKSB7XG5cdCAgICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJyLCBmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChpc05vZGUoZWwpKSB7XG5cdCAgICAgICAgICAgIGlmICghfm5vZGVzLmluZGV4T2YoZWwpKSBub2Rlcy5wdXNoKGVsKTtcblx0ICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlTGlzdChlbCkpIHtcblx0ICAgICAgICAgICAgZmxhdHRlbihlbCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJncywgZnVuY3Rpb24gKGFyZykge1xuXHQgICAgICAgIGlmIChpc05vZGUoYXJnKSkge1xuXHQgICAgICAgICAgaWYgKCF+bm9kZXMuaW5kZXhPZihhcmcpKSBub2Rlcy5wdXNoKGFyZyk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KGFyZykpIHtcblx0ICAgICAgICAgIGZsYXR0ZW4oYXJnKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhyb3cgRXJyb3IoJ0NvbmNhdCBhcmd1bWVudHMgbXVzdCBiZSBvZiBhIE5vZGUsIE5vZGVMaXN0LCBIVE1MQ29sbGVjdGlvbiwgb3IgQXJyYXkgb2YgKE5vZGUsIE5vZGVMaXN0LCBIVE1MQ29sbGVjdGlvbiwgQXJyYXkpJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIE5vZGVMaXN0SlMobm9kZXMsIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2RlbGV0ZScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZSgpIHtcblx0ICAgICAgdmFyIG5vdFJlbW92ZWQgPSBmbGF0dGVuKHRoaXMpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBpZiAoZWwucmVtb3ZlKSB7XG5cdCAgICAgICAgICBlbC5yZW1vdmUoKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGVsLnBhcmVudE5vZGUpIHtcblx0ICAgICAgICAgIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5jb250YWlucyhlbCk7XG5cdCAgICAgIH0pO1xuXHQgICAgICBpZiAobm90UmVtb3ZlZC5sZW5ndGgpIGNvbnNvbGUud2FybignTm9kZUxpc3Q6IFNvbWUgbm9kZXMgY291bGQgbm90IGJlIGRlbGV0ZWQuJyk7XG5cdCAgICAgIHJldHVybiBub3RSZW1vdmVkO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2VhY2gnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGVhY2goKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guYXBwbHkodGhpcywgYXJncyk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZpbHRlcicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZmlsdGVyKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIE5vZGVMaXN0SlMoQXJyYXlQcm90by5maWx0ZXIuYXBwbHkodGhpcywgYXJncyksIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZpbmQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmQoZWxlbWVudCkge1xuXHQgICAgICB2YXIgbm9kZXMgPSBbXTtcblx0ICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykgZmxhdHRlbih0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgbm9kZXMucHVzaChub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudCkpO1xuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKGlzTm9kZShlbGVtZW50KSkgZmxhdHRlbih0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgaWYgKG5vZGUgIT09IGVsZW1lbnQgJiYgbm9kZS5jb250YWlucyhlbGVtZW50KSkgbm9kZXMucHVzaChlbGVtZW50KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmIChpc05vZGVMaXN0KGVsZW1lbnQpKSB7XG5cdCAgICAgICAgdmFyIGVscyA9IGZsYXR0ZW4oZWxlbWVudCk7XG5cdCAgICAgICAgZmxhdHRlbih0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgICBlbHMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgICAgaWYgKG5vZGUgIT09IGVsICYmIG5vZGUuY29udGFpbnMoZWwpKSBub2Rlcy5wdXNoKGVsKTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBmbGF0dGVuKG5vZGVzLCB0aGlzLm93bmVyKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdmb3JFYWNoJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JFYWNoKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdpbmNsdWRlcycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gaW5jbHVkZXMoZWxlbWVudCwgaW5kZXgpIHtcblx0ICAgICAgcmV0dXJuIH50aGlzLmluZGV4T2YoZWxlbWVudCwgaW5kZXgpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ21hcCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuNSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNSksIF9rZXk1ID0gMDsgX2tleTUgPCBfbGVuNTsgX2tleTUrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTVdID0gYXJndW1lbnRzW19rZXk1XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIG1hcHBlZCA9IEFycmF5UHJvdG8ubWFwLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHQgICAgICByZXR1cm4gbWFwcGVkLnNvbWUoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgcmV0dXJuIGlzTm9kZShlbCkgfHwgaXNOb2RlTGlzdChlbCk7XG5cdCAgICAgIH0pID8gZmxhdHRlbihtYXBwZWQsIHRoaXMpIDogbWFwcGVkO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3BhcmVudCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcGFyZW50KCkge1xuXHQgICAgICByZXR1cm4gZmxhdHRlbih0aGlzLm1hcChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwucGFyZW50Tm9kZTtcblx0ICAgICAgfSksIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3BvcCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcG9wKGFtb3VudCkge1xuXHQgICAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHtcblx0ICAgICAgICBhbW91bnQgPSAxO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciBub2RlcyA9IFtdO1xuXHQgICAgICB2YXIgcG9wID0gQXJyYXlQcm90by5wb3AuYmluZCh0aGlzKTtcblx0ICAgICAgd2hpbGUgKGFtb3VudC0tKSB7XG5cdCAgICAgICAgbm9kZXMucHVzaChwb3AoKSk7XG5cdCAgICAgIH1yZXR1cm4gTm9kZUxpc3RKUyhub2RlcywgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncHVzaCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcHVzaCgpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIGZvciAodmFyIF9sZW42ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW42KSwgX2tleTYgPSAwOyBfa2V5NiA8IF9sZW42OyBfa2V5NisrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5Nl0gPSBhcmd1bWVudHNbX2tleTZdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guY2FsbChhcmdzLCBmdW5jdGlvbiAoYXJnKSB7XG5cdCAgICAgICAgaWYgKCFpc05vZGUoYXJnKSkgdGhyb3cgbm9kZUVycm9yO1xuXHQgICAgICAgIGlmICghfl90aGlzLmluZGV4T2YoYXJnKSkgQXJyYXlQcm90by5wdXNoLmNhbGwoX3RoaXMsIGFyZyk7XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzaGlmdCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoYW1vdW50KSB7XG5cdCAgICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgIGFtb3VudCA9IDE7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIG5vZGVzID0gW107XG5cdCAgICAgIHdoaWxlIChhbW91bnQtLSkge1xuXHQgICAgICAgIG5vZGVzLnB1c2goQXJyYXlQcm90by5zaGlmdC5jYWxsKHRoaXMpKTtcblx0ICAgICAgfXJldHVybiBub2Rlcy5sZW5ndGggPT0gMSA/IG5vZGVzWzBdIDogTm9kZUxpc3RKUyhub2RlcywgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnc2xpY2UnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWNlKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuNyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNyksIF9rZXk3ID0gMDsgX2tleTcgPCBfbGVuNzsgX2tleTcrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTddID0gYXJndW1lbnRzW19rZXk3XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIE5vZGVMaXN0SlMoQXJyYXlQcm90by5zbGljZS5hcHBseSh0aGlzLCBhcmdzKSwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnc3BsaWNlJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBzcGxpY2UoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW44ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW44KSwgX2tleTggPSAwOyBfa2V5OCA8IF9sZW44OyBfa2V5OCsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5OF0gPSBhcmd1bWVudHNbX2tleThdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBmb3IgKHZhciBpID0gMiwgbCA9IGFyZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdCAgICAgICAgaWYgKCFpc05vZGUoYXJnc1tpXSkpIHRocm93IG5vZGVFcnJvcjtcblx0ICAgICAgfVxuXHQgICAgICBBcnJheVByb3RvLnNwbGljZS5hcHBseSh0aGlzLCBhcmdzKTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAndW5zaGlmdCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdW5zaGlmdCgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICB2YXIgdW5zaGlmdCA9IEFycmF5UHJvdG8udW5zaGlmdC5iaW5kKHRoaXMpO1xuXHRcblx0ICAgICAgZm9yICh2YXIgX2xlbjkgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjkpLCBfa2V5OSA9IDA7IF9rZXk5IDwgX2xlbjk7IF9rZXk5KyspIHtcblx0ICAgICAgICBhcmdzW19rZXk5XSA9IGFyZ3VtZW50c1tfa2V5OV07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIEFycmF5UHJvdG8uZm9yRWFjaC5jYWxsKGFyZ3MsIGZ1bmN0aW9uIChhcmcpIHtcblx0ICAgICAgICBpZiAoIWlzTm9kZShhcmcpKSB0aHJvdyBub2RlRXJyb3I7XG5cdCAgICAgICAgaWYgKCF+X3RoaXMyLmluZGV4T2YoYXJnKSkgdW5zaGlmdChhcmcpO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnYWRkQ2xhc3MnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZENsYXNzKGNsYXNzZXMpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgdHJ1ZSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncmVtb3ZlQ2xhc3MnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGNsYXNzZXMpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgZmFsc2UpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3RvZ2dsZUNsYXNzJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b2dnbGVDbGFzcyhjbGFzc2VzKSB7XG5cdCAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcblx0XG5cdCAgICAgIHZhciBtZXRob2QgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsID8gJ3RvZ2dsZScgOiB2YWx1ZSA/ICdhZGQnIDogJ3JlbW92ZSc7XG5cdCAgICAgIGlmICh0eXBlb2YgY2xhc3NlcyA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy50cmltKCkucmVwbGFjZSgvXFxzKy8sICcgJykuc3BsaXQoJyAnKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBjbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcblx0ICAgICAgICAgIHJldHVybiBlbC5jbGFzc0xpc3RbbWV0aG9kXShjKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZ2V0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQocHJvcCkge1xuXHQgICAgICB2YXIgYXJyID0gW107XG5cdCAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBpZiAoZWwgIT09IG51bGwpIHtcblx0ICAgICAgICAgIGVsID0gZWxbcHJvcF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiBmbGF0dGVuKGFyciwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnc2V0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQocHJvcCwgdmFsdWUpIHtcblx0ICAgICAgaWYgKHByb3AuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuXHQgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChlbCkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcCkge1xuXHQgICAgICAgICAgICAgIGlmIChrZXkgaW4gZWwpIHtcblx0ICAgICAgICAgICAgICAgIGVsW2tleV0gPSBwcm9wW2tleV07XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKHByb3AgaW4gZWwpIHtcblx0ICAgICAgICAgICAgZWxbcHJvcF0gPSB2YWx1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdjYWxsJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxsKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuMTAgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjEwKSwgX2tleTEwID0gMDsgX2tleTEwIDwgX2xlbjEwOyBfa2V5MTArKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTEwXSA9IGFyZ3VtZW50c1tfa2V5MTBdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgbWV0aG9kID0gQXJyYXlQcm90by5zaGlmdC5jYWxsKGFyZ3MpO1xuXHQgICAgICB2YXIgYXJyID0gW107XG5cdCAgICAgIHZhciByZXR1cm5UaGlzID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbCAmJiBlbFttZXRob2RdIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgICAgICAgIGVsID0gZWxbbWV0aG9kXS5hcHBseShlbCwgYXJncyk7XG5cdCAgICAgICAgICBhcnIucHVzaChlbCk7XG5cdCAgICAgICAgICBpZiAocmV0dXJuVGhpcyAmJiBlbCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVyblRoaXMgPSBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgYXJyLnB1c2godW5kZWZpbmVkKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gcmV0dXJuVGhpcyA/IHRoaXMgOiBmbGF0dGVuKGFyciwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnaXRlbScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gaXRlbShpbmRleCkge1xuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhbdGhpc1tpbmRleF1dLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvbicsXG5cdFxuXHRcblx0ICAgIC8vIGV2ZW50IGhhbmRsZXJzXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb24oZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcblx0ICAgICAgaWYgKHR5cGVvZiBldmVudHMgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgZXZlbnRzID0gZXZlbnRzLnRyaW0oKS5yZXBsYWNlKC9cXHMrLywgJyAnKS5zcGxpdCgnICcpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghdGhpcyB8fCAhdGhpcy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXHQgICAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIGNhbGxiYWNrID0gc2VsZWN0b3I7XG5cdCAgICAgICAgc2VsZWN0b3IgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghY2FsbGJhY2spIHJldHVybiB0aGlzO1xuXHQgICAgICB2YXIgZm4gPSBjYWxsYmFjaztcblx0ICAgICAgY2FsbGJhY2sgPSBzZWxlY3RvciA/IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgdmFyIGVscyA9IE5vZGVMaXN0SlMoc2VsZWN0b3IsIHRoaXMpO1xuXHQgICAgICAgIGlmICghZWxzLmxlbmd0aCkge1xuXHQgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHMuc29tZShmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIHZhciB0YXJnZXQgPSBlbC5jb250YWlucyhlLnRhcmdldCk7XG5cdCAgICAgICAgICBpZiAodGFyZ2V0KSBmbi5jYWxsKGVsLCBlLCBlbCk7XG5cdCAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9IDogZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICBmbi5hcHBseSh0aGlzLCBbZSwgdGhpc10pO1xuXHQgICAgICB9O1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgICBpZiAoZWwgPT09IHdpbmRvdyB8fCBpc05vZGUoZWwpKSB7XG5cdCAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGNhbGxiYWNrLCBmYWxzZSk7XG5cdCAgICAgICAgICAgIEV2ZW50cy5wdXNoKHtcblx0ICAgICAgICAgICAgICBlbDogZWwsXG5cdCAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuXHQgICAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29mZicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb2ZmKGV2ZW50cywgY2FsbGJhY2spIHtcblx0ICAgICAgaWYgKGV2ZW50cyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdCAgICAgICAgY2FsbGJhY2sgPSBldmVudHM7XG5cdCAgICAgICAgZXZlbnRzID0gbnVsbDtcblx0ICAgICAgfVxuXHQgICAgICBldmVudHMgPSBldmVudHMgaW5zdGFuY2VvZiBBcnJheSA/IGV2ZW50cyA6IHR5cGVvZiBldmVudHMgPT09ICdzdHJpbmcnID8gZXZlbnRzLnRyaW0oKS5yZXBsYWNlKC9cXHMrLywgJyAnKS5zcGxpdCgnICcpIDogbnVsbDtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIEV2ZW50cyA9IEV2ZW50cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgIGlmIChlICYmIGUuZWwgPT09IGVsICYmICghY2FsbGJhY2sgfHwgY2FsbGJhY2sgPT09IGUuY2FsbGJhY2spICYmICghZXZlbnRzIHx8IH5ldmVudHMuaW5kZXhPZihlLmV2ZW50KSkpIHtcblx0ICAgICAgICAgICAgZS5lbC5yZW1vdmVFdmVudExpc3RlbmVyKGUuZXZlbnQsIGUuY2FsbGJhY2spO1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uQmx1cicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb25CbHVyKGNhbGxiYWNrKSB7XG5cdCAgICAgIGlmICghdGhpcyB8fCAhdGhpcy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXHQgICAgICBpZiAoIWNhbGxiYWNrKSByZXR1cm4gdGhpcztcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGJsdXJMaXN0LnB1c2goeyBlbDogZWwsIGNhbGxiYWNrOiBjYWxsYmFjayB9KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmICghYmx1ckV2ZW50KSB7XG5cdCAgICAgICAgYmx1ckV2ZW50ID0gZnVuY3Rpb24gYmx1ckV2ZW50KGUpIHtcblx0ICAgICAgICAgIGJsdXJMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcblx0ICAgICAgICAgICAgdmFyIHRhcmdldCA9IGl0ZW0uZWwuY29udGFpbnMoZS50YXJnZXQpIHx8IGl0ZW0uZWwgPT09IGUudGFyZ2V0O1xuXHQgICAgICAgICAgICBpZiAoIXRhcmdldCkgaXRlbS5jYWxsYmFjay5jYWxsKGl0ZW0uZWwsIGUsIGl0ZW0uZWwpO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGJsdXJFdmVudCwgZmFsc2UpO1xuXHQgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBibHVyRXZlbnQsIGZhbHNlKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvZmZCbHVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvZmZCbHVyKGNhbGxiYWNrKSB7XG5cdCAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBibHVyTGlzdCA9IGJsdXJMaXN0LmZpbHRlcihmdW5jdGlvbiAoYmx1cikge1xuXHQgICAgICAgICAgaWYgKGJsdXIgJiYgYmx1ci5lbCA9PT0gZWwgJiYgKCFjYWxsYmFjayB8fCBibHVyLmNhbGxiYWNrID09PSBjYWxsYmFjaykpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgcmV0dXJuIGVsO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnYXNBcnJheScsXG5cdCAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgICAgcmV0dXJuIEFycmF5UHJvdG8uc2xpY2UuY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0ICB9XSk7XG5cdCAgcmV0dXJuIE5vZGVMaXN0O1xuXHR9KCk7XG5cdFxuXHR2YXIgTkwgPSBOb2RlTGlzdC5wcm90b3R5cGU7XG5cdFxuXHRmdW5jdGlvbiBmbGF0dGVuKGFyciwgb3duZXIpIHtcblx0ICB2YXIgbGlzdCA9IFtdO1xuXHQgIEFycmF5UHJvdG8uZm9yRWFjaC5jYWxsKGFyciwgZnVuY3Rpb24gKGVsKSB7XG5cdCAgICBpZiAoaXNOb2RlKGVsKSkge1xuXHQgICAgICBpZiAoIX5saXN0LmluZGV4T2YoZWwpKSBsaXN0LnB1c2goZWwpO1xuXHQgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KGVsKSkge1xuXHQgICAgICBmb3IgKHZhciBpZCBpbiBlbCkge1xuXHQgICAgICAgIGlmICghfmxpc3QuaW5kZXhPZihlbFtpZF0pKSBsaXN0LnB1c2goZWxbaWRdKTtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIGlmIChlbCAhPT0gbnVsbCkge1xuXHQgICAgICBhcnIuZ2V0ID0gTkwuZ2V0O1xuXHQgICAgICBhcnIuc2V0ID0gTkwuc2V0O1xuXHQgICAgICBhcnIuY2FsbCA9IE5MLmNhbGw7XG5cdCAgICAgIGFyci5vd25lciA9IG93bmVyO1xuXHQgICAgICByZXR1cm4gYXJyO1xuXHQgICAgfVxuXHQgIH0pO1xuXHQgIHJldHVybiBOb2RlTGlzdEpTKGxpc3QsIG93bmVyKTtcblx0fVxuXHRcblx0dmFyIGV4Y2VwdGlvbnMgPSBbJ2pvaW4nLCAnY29weVdpdGhpbicsICdmaWxsJywgJ2ZpbmQnLCAnZm9yRWFjaCddO1xuXHQoMCwgX2dldE93blByb3BlcnR5TmFtZXMyLmRlZmF1bHQpKEFycmF5UHJvdG8pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuXHQgIGlmICghfmV4Y2VwdGlvbnMuaW5kZXhPZihrZXkpICYmIE5MW2tleV0gPT09IHVuZGVmaW5lZCkge1xuXHQgICAgTkxba2V5XSA9IEFycmF5UHJvdG9ba2V5XTtcblx0ICB9XG5cdH0pO1xuXHRpZiAod2luZG93LlN5bWJvbCAmJiBfaXRlcmF0b3IyLmRlZmF1bHQpIHtcblx0ICBOTFtfaXRlcmF0b3IyLmRlZmF1bHRdID0gTkwudmFsdWVzID0gQXJyYXlQcm90b1tfaXRlcmF0b3IyLmRlZmF1bHRdO1xuXHR9XG5cdHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0ZnVuY3Rpb24gc2V0dGVyR2V0dGVyKHByb3ApIHtcblx0ICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgaWYgKE5MW3Byb3BdKSByZXR1cm47XG5cdCAgaWYgKGRpdltwcm9wXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdCAgICBOTFtwcm9wXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgZm9yICh2YXIgX2xlbjExID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4xMSksIF9rZXkxMSA9IDA7IF9rZXkxMSA8IF9sZW4xMTsgX2tleTExKyspIHtcblx0ICAgICAgICBhcmdzW19rZXkxMV0gPSBhcmd1bWVudHNbX2tleTExXTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIGFyciA9IFtdO1xuXHQgICAgICB2YXIgcmV0dXJuVGhpcyA9IHRydWU7XG5cdCAgICAgIGZvciAodmFyIGkgaW4gTkwpIHtcblx0ICAgICAgICB2YXIgZWwgPSBOTFtpXTtcblx0ICAgICAgICBpZiAoZWwgJiYgZWxbcHJvcF0gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHQgICAgICAgICAgZWwgPSBlbFtwcm9wXS5hcHBseShlbCwgYXJncyk7XG5cdCAgICAgICAgICBhcnIucHVzaChlbCk7XG5cdCAgICAgICAgICBpZiAocmV0dXJuVGhpcyAmJiBlbCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVyblRoaXMgPSBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgYXJyLnB1c2godW5kZWZpbmVkKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHJldHVyblRoaXMgPyBfdGhpczMgOiBmbGF0dGVuKGFyciwgX3RoaXMzKTtcblx0ICAgIH07XG5cdCAgfSBlbHNlIHtcblx0ICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKE5MLCBwcm9wLCB7XG5cdCAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgICAgIHZhciBhcnIgPSBbXTtcblx0ICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgICBpZiAoZWwgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgZWwgPSBlbFtwcm9wXTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm4gZmxhdHRlbihhcnIsIHRoaXMpO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuXHQgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChlbCAmJiBwcm9wIGluIGVsKSB7XG5cdCAgICAgICAgICAgIGVsW3Byb3BdID0gdmFsdWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHQgIH1cblx0fVxuXHRmb3IgKHZhciBwcm9wIGluIGRpdikge1xuXHQgIHNldHRlckdldHRlcihwcm9wKTtcblx0fWZ1bmN0aW9uIE5vZGVMaXN0SlMoKSB7XG5cdCAgZm9yICh2YXIgX2xlbjEyID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4xMiksIF9rZXkxMiA9IDA7IF9rZXkxMiA8IF9sZW4xMjsgX2tleTEyKyspIHtcblx0ICAgIGFyZ3NbX2tleTEyXSA9IGFyZ3VtZW50c1tfa2V5MTJdO1xuXHQgIH1cblx0XG5cdCAgcmV0dXJuIG5ldyBOb2RlTGlzdChhcmdzKTtcblx0fVxuXHR3aW5kb3cuTkwgPSBOb2RlTGlzdEpTO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gTm9kZUxpc3RKUztcblxuLyoqKi8gfSxcbi8qIDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX193ZWJwYWNrX3JlcXVpcmVfXygzKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0dmFyICRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpLk9iamVjdDtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKXtcblx0ICByZXR1cm4gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0Ly8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcblx0JGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhX193ZWJwYWNrX3JlcXVpcmVfXygxNSksICdPYmplY3QnLCB7ZGVmaW5lUHJvcGVydHk6IF9fd2VicGFja19yZXF1aXJlX18oMTEpLmZ9KTtcblxuLyoqKi8gfSxcbi8qIDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnbG9iYWwgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBjb3JlICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpXG5cdCAgLCBjdHggICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpXG5cdCAgLCBoaWRlICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKVxuXHQgICwgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cdFxuXHR2YXIgJGV4cG9ydCA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHNvdXJjZSl7XG5cdCAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkZcblx0ICAgICwgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuR1xuXHQgICAgLCBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TXG5cdCAgICAsIElTX1BST1RPICA9IHR5cGUgJiAkZXhwb3J0LlBcblx0ICAgICwgSVNfQklORCAgID0gdHlwZSAmICRleHBvcnQuQlxuXHQgICAgLCBJU19XUkFQICAgPSB0eXBlICYgJGV4cG9ydC5XXG5cdCAgICAsIGV4cG9ydHMgICA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pXG5cdCAgICAsIGV4cFByb3RvICA9IGV4cG9ydHNbUFJPVE9UWVBFXVxuXHQgICAgLCB0YXJnZXQgICAgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG5cdCAgICAsIGtleSwgb3duLCBvdXQ7XG5cdCAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG5cdCAgZm9yKGtleSBpbiBzb3VyY2Upe1xuXHQgICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG5cdCAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuXHQgICAgaWYob3duICYmIGtleSBpbiBleHBvcnRzKWNvbnRpbnVlO1xuXHQgICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcblx0ICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG5cdCAgICAvLyBwcmV2ZW50IGdsb2JhbCBwb2xsdXRpb24gZm9yIG5hbWVzcGFjZXNcblx0ICAgIGV4cG9ydHNba2V5XSA9IElTX0dMT0JBTCAmJiB0eXBlb2YgdGFyZ2V0W2tleV0gIT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZVtrZXldXG5cdCAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuXHQgICAgOiBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbClcblx0ICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2UgdGhlbSBpbiBsaWJyYXJ5XG5cdCAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uKEMpe1xuXHQgICAgICB2YXIgRiA9IGZ1bmN0aW9uKGEsIGIsIGMpe1xuXHQgICAgICAgIGlmKHRoaXMgaW5zdGFuY2VvZiBDKXtcblx0ICAgICAgICAgIHN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtcblx0ICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEM7XG5cdCAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDKGEpO1xuXHQgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQyhhLCBiKTtcblx0ICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuXHQgICAgICAgIH0gcmV0dXJuIEMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgfTtcblx0ICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuXHQgICAgICByZXR1cm4gRjtcblx0ICAgIC8vIG1ha2Ugc3RhdGljIHZlcnNpb25zIGZvciBwcm90b3R5cGUgbWV0aG9kc1xuXHQgICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuXHQgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLm1ldGhvZHMuJU5BTUUlXG5cdCAgICBpZihJU19QUk9UTyl7XG5cdCAgICAgIChleHBvcnRzLnZpcnR1YWwgfHwgKGV4cG9ydHMudmlydHVhbCA9IHt9KSlba2V5XSA9IG91dDtcblx0ICAgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSVcblx0ICAgICAgaWYodHlwZSAmICRleHBvcnQuUiAmJiBleHBQcm90byAmJiAhZXhwUHJvdG9ba2V5XSloaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXHQvLyB0eXBlIGJpdG1hcFxuXHQkZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuXHQkZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuXHQkZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuXHQkZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG5cdCRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuXHQkZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcblx0JGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG5cdCRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YCBcblx0bW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuXG4vKioqLyB9LFxuLyogNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcblx0dmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG5cdCAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHRpZih0eXBlb2YgX19nID09ICdudW1iZXInKV9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4vKioqLyB9LFxuLyogNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHt2ZXJzaW9uOiAnMi40LjAnfTtcblx0aWYodHlwZW9mIF9fZSA9PSAnbnVtYmVyJylfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbi8qKiovIH0sXG4vKiA4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcblx0dmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCl7XG5cdCAgYUZ1bmN0aW9uKGZuKTtcblx0ICBpZih0aGF0ID09PSB1bmRlZmluZWQpcmV0dXJuIGZuO1xuXHQgIHN3aXRjaChsZW5ndGgpe1xuXHQgICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYSl7XG5cdCAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuXHQgICAgfTtcblx0ICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEsIGIpe1xuXHQgICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcblx0ICAgIH07XG5cdCAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbihhLCBiLCBjKXtcblx0ICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG5cdCAgICB9O1xuXHQgIH1cblx0ICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7XG5cdCAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgaWYodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGRQICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuXHQgICwgY3JlYXRlRGVzYyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpID8gZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcblx0ICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuXHR9IDogZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcblx0ICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuXHQgIHJldHVybiBvYmplY3Q7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGFuT2JqZWN0ICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcblx0ICAsIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNClcblx0ICAsIHRvUHJpbWl0aXZlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0ICAsIGRQICAgICAgICAgICAgID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXHRcblx0ZXhwb3J0cy5mID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKXtcblx0ICBhbk9iamVjdChPKTtcblx0ICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG5cdCAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG5cdCAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcblx0ICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcblx0ICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG5cdCAgaWYoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKXRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG5cdCAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKU9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuXHQgIHJldHVybiBPO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9ICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXygxNikoZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19yZXF1aXJlX18oMTcpKCdkaXYnKSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcblx0fSk7XG5cbi8qKiovIH0sXG4vKiAxNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxuXHRtb2R1bGUuZXhwb3J0cyA9ICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KShmdW5jdGlvbigpe1xuXHQgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG5cdH0pO1xuXG4vKioqLyB9LFxuLyogMTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYyl7XG5cdCAgdHJ5IHtcblx0ICAgIHJldHVybiAhIWV4ZWMoKTtcblx0ICB9IGNhdGNoKGUpe1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpXG5cdCAgLCBkb2N1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNikuZG9jdW1lbnRcblx0ICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcblx0ICAsIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuXHR2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblx0Ly8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcblx0Ly8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XG5cdCAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gaXQ7XG5cdCAgdmFyIGZuLCB2YWw7XG5cdCAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuXHQgIGlmKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcblx0ICBpZighUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuXHQgIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuXHQgIHJldHVybiB7XG5cdCAgICBlbnVtZXJhYmxlICA6ICEoYml0bWFwICYgMSksXG5cdCAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG5cdCAgICB3cml0YWJsZSAgICA6ICEoYml0bWFwICYgNCksXG5cdCAgICB2YWx1ZSAgICAgICA6IHZhbHVlXG5cdCAgfTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDIwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oMjEpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cbi8qKiovIH0sXG4vKiAyMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMik7XG5cdF9fd2VicGFja19yZXF1aXJlX18oNTEpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTUpLmYoJ2l0ZXJhdG9yJyk7XG5cbi8qKiovIH0sXG4vKiAyMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgJGF0ICA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpKHRydWUpO1xuXHRcblx0Ly8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbihpdGVyYXRlZCl7XG5cdCAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuXHQgIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG5cdC8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcblx0fSwgZnVuY3Rpb24oKXtcblx0ICB2YXIgTyAgICAgPSB0aGlzLl90XG5cdCAgICAsIGluZGV4ID0gdGhpcy5faVxuXHQgICAgLCBwb2ludDtcblx0ICBpZihpbmRleCA+PSBPLmxlbmd0aClyZXR1cm4ge3ZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWV9O1xuXHQgIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcblx0ICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcblx0ICByZXR1cm4ge3ZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2V9O1xuXHR9KTtcblxuLyoqKi8gfSxcbi8qIDIzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNClcblx0ICAsIGRlZmluZWQgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpO1xuXHQvLyB0cnVlICAtPiBTdHJpbmcjYXRcblx0Ly8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVE9fU1RSSU5HKXtcblx0ICByZXR1cm4gZnVuY3Rpb24odGhhdCwgcG9zKXtcblx0ICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpXG5cdCAgICAgICwgaSA9IHRvSW50ZWdlcihwb3MpXG5cdCAgICAgICwgbCA9IHMubGVuZ3RoXG5cdCAgICAgICwgYSwgYjtcblx0ICAgIGlmKGkgPCAwIHx8IGkgPj0gbClyZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG5cdCAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuXHQgICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcblx0ICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcblx0ICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG5cdCAgfTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDI0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyA3LjEuNCBUb0ludGVnZXJcblx0dmFyIGNlaWwgID0gTWF0aC5jZWlsXG5cdCAgLCBmbG9vciA9IE1hdGguZmxvb3I7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIGlmKGl0ID09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG5cdCAgcmV0dXJuIGl0O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0dmFyIExJQlJBUlkgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNylcblx0ICAsICRleHBvcnQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KVxuXHQgICwgcmVkZWZpbmUgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KVxuXHQgICwgaGlkZSAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKVxuXHQgICwgaGFzICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgSXRlcmF0b3JzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKVxuXHQgICwgJGl0ZXJDcmVhdGUgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMxKVxuXHQgICwgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KVxuXHQgICwgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5KVxuXHQgICwgSVRFUkFUT1IgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgnaXRlcmF0b3InKVxuXHQgICwgQlVHR1kgICAgICAgICAgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSkgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuXHQgICwgRkZfSVRFUkFUT1IgICAgPSAnQEBpdGVyYXRvcidcblx0ICAsIEtFWVMgICAgICAgICAgID0gJ2tleXMnXG5cdCAgLCBWQUxVRVMgICAgICAgICA9ICd2YWx1ZXMnO1xuXHRcblx0dmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKXtcblx0ICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cdCAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpe1xuXHQgICAgaWYoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pcmV0dXJuIHByb3RvW2tpbmRdO1xuXHQgICAgc3dpdGNoKGtpbmQpe1xuXHQgICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG5cdCAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG5cdCAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG5cdCAgfTtcblx0ICB2YXIgVEFHICAgICAgICA9IE5BTUUgKyAnIEl0ZXJhdG9yJ1xuXHQgICAgLCBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVNcblx0ICAgICwgVkFMVUVTX0JVRyA9IGZhbHNlXG5cdCAgICAsIHByb3RvICAgICAgPSBCYXNlLnByb3RvdHlwZVxuXHQgICAgLCAkbmF0aXZlICAgID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdXG5cdCAgICAsICRkZWZhdWx0ICAgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKVxuXHQgICAgLCAkZW50cmllcyAgID0gREVGQVVMVCA/ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKSA6IHVuZGVmaW5lZFxuXHQgICAgLCAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZVxuXHQgICAgLCBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuXHQgIC8vIEZpeCBuYXRpdmVcblx0ICBpZigkYW55TmF0aXZlKXtcblx0ICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKSk7XG5cdCAgICBpZihJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSl7XG5cdCAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcblx0ICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG5cdCAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuXHQgICAgICBpZighTElCUkFSWSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuXHQgICAgfVxuXHQgIH1cblx0ICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG5cdCAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKXtcblx0ICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuXHQgICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcblx0ICB9XG5cdCAgLy8gRGVmaW5lIGl0ZXJhdG9yXG5cdCAgaWYoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpe1xuXHQgICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcblx0ICB9XG5cdCAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuXHQgIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuXHQgIEl0ZXJhdG9yc1tUQUddICA9IHJldHVyblRoaXM7XG5cdCAgaWYoREVGQVVMVCl7XG5cdCAgICBtZXRob2RzID0ge1xuXHQgICAgICB2YWx1ZXM6ICBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcblx0ICAgICAga2V5czogICAgSVNfU0VUICAgICA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuXHQgICAgICBlbnRyaWVzOiAkZW50cmllc1xuXHQgICAgfTtcblx0ICAgIGlmKEZPUkNFRClmb3Ioa2V5IGluIG1ldGhvZHMpe1xuXHQgICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcblx0ICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG5cdCAgfVxuXHQgIHJldHVybiBtZXRob2RzO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gdHJ1ZTtcblxuLyoqKi8gfSxcbi8qIDI4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXG4vKioqLyB9LFxuLyogMjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdHZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuXHQgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8qKiovIH0sXG4vKiAzMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgY3JlYXRlICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyKVxuXHQgICwgZGVzY3JpcHRvciAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KVxuXHQgICwgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KVxuXHQgICwgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblx0XG5cdC8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTApKEl0ZXJhdG9yUHJvdG90eXBlLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgnaXRlcmF0b3InKSwgZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH0pO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCl7XG5cdCAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7bmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KX0pO1xuXHQgIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuXHR2YXIgYW5PYmplY3QgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKVxuXHQgICwgZFBzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzKVxuXHQgICwgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1KVxuXHQgICwgSUVfUFJPVE8gICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyKSgnSUVfUFJPVE8nKVxuXHQgICwgRW1wdHkgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XG5cdCAgLCBQUk9UT1RZUEUgICA9ICdwcm90b3R5cGUnO1xuXHRcblx0Ly8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxuXHR2YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XG5cdCAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcblx0ICB2YXIgaWZyYW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNykoJ2lmcmFtZScpXG5cdCAgICAsIGkgICAgICA9IGVudW1CdWdLZXlzLmxlbmd0aFxuXHQgICAgLCBsdCAgICAgPSAnPCdcblx0ICAgICwgZ3QgICAgID0gJz4nXG5cdCAgICAsIGlmcmFtZURvY3VtZW50O1xuXHQgIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHQgIF9fd2VicGFja19yZXF1aXJlX18oNDYpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG5cdCAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuXHQgIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG5cdCAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuXHQgIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG5cdCAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuXHQgIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcblx0ICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuXHQgIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuXHQgIHdoaWxlKGktLSlkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcblx0ICByZXR1cm4gY3JlYXRlRGljdCgpO1xuXHR9O1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKXtcblx0ICB2YXIgcmVzdWx0O1xuXHQgIGlmKE8gIT09IG51bGwpe1xuXHQgICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuXHQgICAgcmVzdWx0ID0gbmV3IEVtcHR5O1xuXHQgICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG5cdCAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG5cdCAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcblx0ICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuXHQgIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMzMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBkUCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG5cdCAgLCBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpXG5cdCAgLCBnZXRLZXlzICA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKXtcblx0ICBhbk9iamVjdChPKTtcblx0ICB2YXIga2V5cyAgID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKVxuXHQgICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuXHQgICAgLCBpID0gMFxuXHQgICAgLCBQO1xuXHQgIHdoaWxlKGxlbmd0aCA+IGkpZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcblx0ICByZXR1cm4gTztcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcblx0dmFyICRrZXlzICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNSlcblx0ICAsIGVudW1CdWdLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NSk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTyl7XG5cdCAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgaGFzICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIHRvSU9iamVjdCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCBhcnJheUluZGV4T2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM5KShmYWxzZSlcblx0ICAsIElFX1BST1RPICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpKCdJRV9QUk9UTycpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIG5hbWVzKXtcblx0ICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcblx0ICAgICwgaSAgICAgID0gMFxuXHQgICAgLCByZXN1bHQgPSBbXVxuXHQgICAgLCBrZXk7XG5cdCAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuXHQgIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcblx0ICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XG5cdCAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuXHQgIH1cblx0ICByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xuXHR2YXIgSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzcpXG5cdCAgLCBkZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xuXHR2YXIgY29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOCk7XG5cdG1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdHZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG5cdC8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG5cdHZhciB0b0lPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2KVxuXHQgICwgdG9MZW5ndGggID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MClcblx0ICAsIHRvSW5kZXggICA9IF9fd2VicGFja19yZXF1aXJlX18oNDEpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcblx0ICByZXR1cm4gZnVuY3Rpb24oJHRoaXMsIGVsLCBmcm9tSW5kZXgpe1xuXHQgICAgdmFyIE8gICAgICA9IHRvSU9iamVjdCgkdGhpcylcblx0ICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcblx0ICAgICAgLCBpbmRleCAgPSB0b0luZGV4KGZyb21JbmRleCwgbGVuZ3RoKVxuXHQgICAgICAsIHZhbHVlO1xuXHQgICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuXHQgICAgaWYoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpd2hpbGUobGVuZ3RoID4gaW5kZXgpe1xuXHQgICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG5cdCAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuXHQgICAgLy8gQXJyYXkjdG9JbmRleCBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuXHQgICAgfSBlbHNlIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTyl7XG5cdCAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcblx0ICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMS4xNSBUb0xlbmd0aFxuXHR2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNClcblx0ICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxuXHR9O1xuXG4vKioqLyB9LFxuLyogNDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KVxuXHQgICwgbWF4ICAgICAgID0gTWF0aC5tYXhcblx0ICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGluZGV4LCBsZW5ndGgpe1xuXHQgIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcblx0ICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MykoJ2tleXMnKVxuXHQgICwgdWlkICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcblx0ICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJ1xuXHQgICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG5cdCAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB7fSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA0NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIGlkID0gMFxuXHQgICwgcHggPSBNYXRoLnJhbmRvbSgpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG5cdCAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQ1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5cdG1vZHVsZS5leHBvcnRzID0gKFxuXHQgICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG5cdCkuc3BsaXQoJywnKTtcblxuLyoqKi8gfSxcbi8qIDQ2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNikuZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4vKioqLyB9LFxuLyogNDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBkZWYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKS5mXG5cdCAgLCBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgVEFHID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OCkoJ3RvU3RyaW5nVGFnJyk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuXHQgIGlmKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpZGVmKGl0LCBUQUcsIHtjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWd9KTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQ4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgc3RvcmUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDMpKCd3a3MnKVxuXHQgICwgdWlkICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDQpXG5cdCAgLCBTeW1ib2wgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KS5TeW1ib2xcblx0ICAsIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cdFxuXHR2YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuXHQgIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuXHQgICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcblx0fTtcblx0XG5cdCRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG5cbi8qKiovIH0sXG4vKiA0OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcblx0dmFyIGhhcyAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIHRvT2JqZWN0ICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MClcblx0ICAsIElFX1BST1RPICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MikoJ0lFX1BST1RPJylcblx0ICAsIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uKE8pe1xuXHQgIE8gPSB0b09iamVjdChPKTtcblx0ICBpZihoYXMoTywgSUVfUFJPVE8pKXJldHVybiBPW0lFX1BST1RPXTtcblx0ICBpZih0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKXtcblx0ICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblx0ICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcblx0dmFyIGRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1Mik7XG5cdHZhciBnbG9iYWwgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KVxuXHQgICwgaGlkZSAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG5cdCAgLCBJdGVyYXRvcnMgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMClcblx0ICAsIFRPX1NUUklOR19UQUcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgndG9TdHJpbmdUYWcnKTtcblx0XG5cdGZvcih2YXIgY29sbGVjdGlvbnMgPSBbJ05vZGVMaXN0JywgJ0RPTVRva2VuTGlzdCcsICdNZWRpYUxpc3QnLCAnU3R5bGVTaGVldExpc3QnLCAnQ1NTUnVsZUxpc3QnXSwgaSA9IDA7IGkgPCA1OyBpKyspe1xuXHQgIHZhciBOQU1FICAgICAgID0gY29sbGVjdGlvbnNbaV1cblx0ICAgICwgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXVxuXHQgICAgLCBwcm90byAgICAgID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcblx0ICBpZihwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10paGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG5cdCAgSXRlcmF0b3JzW05BTUVdID0gSXRlcmF0b3JzLkFycmF5O1xuXHR9XG5cbi8qKiovIH0sXG4vKiA1MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oNTMpXG5cdCAgLCBzdGVwICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NClcblx0ICAsIEl0ZXJhdG9ycyAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKVxuXHQgICwgdG9JT2JqZWN0ICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpO1xuXHRcblx0Ly8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuXHQvLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuXHQvLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG5cdC8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG5cdCAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuXHQgIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG5cdCAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcblx0Ly8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG5cdH0sIGZ1bmN0aW9uKCl7XG5cdCAgdmFyIE8gICAgID0gdGhpcy5fdFxuXHQgICAgLCBraW5kICA9IHRoaXMuX2tcblx0ICAgICwgaW5kZXggPSB0aGlzLl9pKys7XG5cdCAgaWYoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpe1xuXHQgICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcblx0ICAgIHJldHVybiBzdGVwKDEpO1xuXHQgIH1cblx0ICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGluZGV4KTtcblx0ICBpZihraW5kID09ICd2YWx1ZXMnKXJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcblx0ICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG5cdH0sICd2YWx1ZXMnKTtcblx0XG5cdC8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcblx0SXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblx0XG5cdGFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcblx0YWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5cdGFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcblxuLyoqKi8gfSxcbi8qIDUzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH07XG5cbi8qKiovIH0sXG4vKiA1NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkb25lLCB2YWx1ZSl7XG5cdCAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cy5mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OCk7XG5cbi8qKiovIH0sXG4vKiA1NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3KSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogNTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oNTgpO1xuXHR2YXIgJE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNykuT2JqZWN0O1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuXHQgIHJldHVybiAkT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG5cdF9fd2VicGFja19yZXF1aXJlX18oNTkpKCdnZXRPd25Qcm9wZXJ0eU5hbWVzJywgZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg2MCkuZjtcblx0fSk7XG5cbi8qKiovIH0sXG4vKiA1OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG5cdHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KVxuXHQgICwgY29yZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcblx0ICAsIGZhaWxzICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVksIGV4ZWMpe1xuXHQgIHZhciBmbiAgPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV1cblx0ICAgICwgZXhwID0ge307XG5cdCAgZXhwW0tFWV0gPSBleGVjKGZuKTtcblx0ICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uKCl7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA2MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xuXHR2YXIgdG9JT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIGdPUE4gICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNjEpLmZcblx0ICAsIHRvU3RyaW5nICA9IHt9LnRvU3RyaW5nO1xuXHRcblx0dmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcblx0ICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblx0XG5cdHZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uKGl0KXtcblx0ICB0cnkge1xuXHQgICAgcmV0dXJuIGdPUE4oaXQpO1xuXHQgIH0gY2F0Y2goZSl7XG5cdCAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcblx0ICB9XG5cdH07XG5cdFxuXHRtb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG5cdCAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogZ09QTih0b0lPYmplY3QoaXQpKTtcblx0fTtcblxuXG4vKioqLyB9LFxuLyogNjEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcblx0dmFyICRrZXlzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1KVxuXHQgICwgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXHRcblx0ZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKXtcblx0ICByZXR1cm4gJGtleXMoTywgaGlkZGVuS2V5cyk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA2MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuXHQgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG5cdCAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDYzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdFxuXHR2YXIgX2RlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0XG5cdHZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcblx0ICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcblx0ICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuXHQgICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG5cdCAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG5cdCAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuXHQgICAgfVxuXHQgIH1cblx0XG5cdCAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcblx0ICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG5cdCAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcblx0ICAgIHJldHVybiBDb25zdHJ1Y3Rvcjtcblx0ICB9O1xuXHR9KCk7XG5cbi8qKiovIH0sXG4vKiA2NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0LyoqXHJcblx0ICogQXJyYXkuZmluZFxyXG5cdCAqL1xuXHRpZiAoIUFycmF5LnByb3RvdHlwZS5maW5kKSB7XG5cdCAgQXJyYXkucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG5cdCAgICAndXNlIHN0cmljdCc7XG5cdFxuXHQgICAgaWYgKHRoaXMgPT0gbnVsbCkge1xuXHQgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUuZmluZCBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQnKTtcblx0ICAgIH1cblx0ICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblx0ICAgIH1cblx0ICAgIHZhciBsaXN0ID0gT2JqZWN0KHRoaXMpO1xuXHQgICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoID4+PiAwO1xuXHQgICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07XG5cdCAgICB2YXIgdmFsdWU7XG5cdFxuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuXHQgICAgICB2YWx1ZSA9IGxpc3RbaV07XG5cdCAgICAgIGlmIChwcmVkaWNhdGUuY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaSwgbGlzdCkpIHtcblx0ICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiB1bmRlZmluZWQ7XG5cdCAgfTtcblx0fVxuXHRcblx0LypcclxuXHQgKiBjbGFzc0xpc3QuanM6IENyb3NzLWJyb3dzZXIgZnVsbCBlbGVtZW50LmNsYXNzTGlzdCBpbXBsZW1lbnRhdGlvbi5cclxuXHQgKiAxLjEuMjAxNTAzMTJcclxuXHQgKlxyXG5cdCAqIEJ5IEVsaSBHcmV5LCBodHRwOi8vZWxpZ3JleS5jb21cclxuXHQgKiBMaWNlbnNlOiBEZWRpY2F0ZWQgdG8gdGhlIHB1YmxpYyBkb21haW4uXHJcblx0ICogICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvY2xhc3NMaXN0LmpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UubWRcclxuXHQgKi9cblx0LypnbG9iYWwgc2VsZiwgZG9jdW1lbnQsIERPTUV4Y2VwdGlvbiAqL1xuXHQvKiEgQHNvdXJjZSBodHRwOi8vcHVybC5lbGlncmV5LmNvbS9naXRodWIvY2xhc3NMaXN0LmpzL2Jsb2IvbWFzdGVyL2NsYXNzTGlzdC5qcyAqL1xuXHRpZiAoXCJkb2N1bWVudFwiIGluIHNlbGYpIHtcblx0ICAvLyBGdWxsIHBvbHlmaWxsIGZvciBicm93c2VycyB3aXRoIG5vIGNsYXNzTGlzdCBzdXBwb3J0XG5cdCAgLy8gSW5jbHVkaW5nIElFIDwgRWRnZSBtaXNzaW5nIFNWR0VsZW1lbnQuY2xhc3NMaXN0XG5cdCAgaWYgKCEoXCJjbGFzc0xpc3RcIiBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiX1wiKSkgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TICYmICEoXCJjbGFzc0xpc3RcIiBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIikpKSB7XG5cdFxuXHQgICAgKGZ1bmN0aW9uICh2aWV3KSB7XG5cdFxuXHQgICAgICBcInVzZSBzdHJpY3RcIjtcblx0XG5cdCAgICAgIGlmICghKCdFbGVtZW50JyBpbiB2aWV3KSkgcmV0dXJuO1xuXHRcblx0ICAgICAgdmFyIGNsYXNzTGlzdFByb3AgPSBcImNsYXNzTGlzdFwiLFxuXHQgICAgICAgICAgcHJvdG9Qcm9wID0gXCJwcm90b3R5cGVcIixcblx0ICAgICAgICAgIGVsZW1DdHJQcm90byA9IHZpZXcuRWxlbWVudFtwcm90b1Byb3BdLFxuXHQgICAgICAgICAgb2JqQ3RyID0gT2JqZWN0LFxuXHQgICAgICAgICAgc3RyVHJpbSA9IFN0cmluZ1twcm90b1Byb3BdLnRyaW0gfHwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoL15cXHMrfFxccyskL2csIFwiXCIpO1xuXHQgICAgICB9LFxuXHQgICAgICAgICAgYXJySW5kZXhPZiA9IEFycmF5W3Byb3RvUHJvcF0uaW5kZXhPZiB8fCBmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgICAgIHZhciBpID0gMCxcblx0ICAgICAgICAgICAgbGVuID0gdGhpcy5sZW5ndGg7XG5cdCAgICAgICAgZm9yICg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgaWYgKGkgaW4gdGhpcyAmJiB0aGlzW2ldID09PSBpdGVtKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gLTE7XG5cdCAgICAgIH1cblx0ICAgICAgLy8gVmVuZG9yczogcGxlYXNlIGFsbG93IGNvbnRlbnQgY29kZSB0byBpbnN0YW50aWF0ZSBET01FeGNlcHRpb25zXG5cdCAgICAgICxcblx0ICAgICAgICAgIERPTUV4ID0gZnVuY3Rpb24gRE9NRXgodHlwZSwgbWVzc2FnZSkge1xuXHQgICAgICAgIHRoaXMubmFtZSA9IHR5cGU7XG5cdCAgICAgICAgdGhpcy5jb2RlID0gRE9NRXhjZXB0aW9uW3R5cGVdO1xuXHQgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBjaGVja1Rva2VuQW5kR2V0SW5kZXggPSBmdW5jdGlvbiBjaGVja1Rva2VuQW5kR2V0SW5kZXgoY2xhc3NMaXN0LCB0b2tlbikge1xuXHQgICAgICAgIGlmICh0b2tlbiA9PT0gXCJcIikge1xuXHQgICAgICAgICAgdGhyb3cgbmV3IERPTUV4KFwiU1lOVEFYX0VSUlwiLCBcIkFuIGludmFsaWQgb3IgaWxsZWdhbCBzdHJpbmcgd2FzIHNwZWNpZmllZFwiKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKC9cXHMvLnRlc3QodG9rZW4pKSB7XG5cdCAgICAgICAgICB0aHJvdyBuZXcgRE9NRXgoXCJJTlZBTElEX0NIQVJBQ1RFUl9FUlJcIiwgXCJTdHJpbmcgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXJcIik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBhcnJJbmRleE9mLmNhbGwoY2xhc3NMaXN0LCB0b2tlbik7XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBDbGFzc0xpc3QgPSBmdW5jdGlvbiBDbGFzc0xpc3QoZWxlbSkge1xuXHQgICAgICAgIHZhciB0cmltbWVkQ2xhc3NlcyA9IHN0clRyaW0uY2FsbChlbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpLFxuXHQgICAgICAgICAgICBjbGFzc2VzID0gdHJpbW1lZENsYXNzZXMgPyB0cmltbWVkQ2xhc3Nlcy5zcGxpdCgvXFxzKy8pIDogW10sXG5cdCAgICAgICAgICAgIGkgPSAwLFxuXHQgICAgICAgICAgICBsZW4gPSBjbGFzc2VzLmxlbmd0aDtcblx0ICAgICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICB0aGlzLnB1c2goY2xhc3Nlc1tpXSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy50b1N0cmluZygpKTtcblx0ICAgICAgICB9O1xuXHQgICAgICB9LFxuXHQgICAgICAgICAgY2xhc3NMaXN0UHJvdG8gPSBDbGFzc0xpc3RbcHJvdG9Qcm9wXSA9IFtdLFxuXHQgICAgICAgICAgY2xhc3NMaXN0R2V0dGVyID0gZnVuY3Rpb24gY2xhc3NMaXN0R2V0dGVyKCkge1xuXHQgICAgICAgIHJldHVybiBuZXcgQ2xhc3NMaXN0KHRoaXMpO1xuXHQgICAgICB9O1xuXHQgICAgICAvLyBNb3N0IERPTUV4Y2VwdGlvbiBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgYWxsb3cgY2FsbGluZyBET01FeGNlcHRpb24ncyB0b1N0cmluZygpXG5cdCAgICAgIC8vIG9uIG5vbi1ET01FeGNlcHRpb25zLiBFcnJvcidzIHRvU3RyaW5nKCkgaXMgc3VmZmljaWVudCBoZXJlLlxuXHQgICAgICBET01FeFtwcm90b1Byb3BdID0gRXJyb3JbcHJvdG9Qcm9wXTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8uaXRlbSA9IGZ1bmN0aW9uIChpKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXNbaV0gfHwgbnVsbDtcblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8uY29udGFpbnMgPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICB0b2tlbiArPSBcIlwiO1xuXHQgICAgICAgIHJldHVybiBjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pICE9PSAtMTtcblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8uYWRkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0b2tlbnMgPSBhcmd1bWVudHMsXG5cdCAgICAgICAgICAgIGkgPSAwLFxuXHQgICAgICAgICAgICBsID0gdG9rZW5zLmxlbmd0aCxcblx0ICAgICAgICAgICAgdG9rZW4sXG5cdCAgICAgICAgICAgIHVwZGF0ZWQgPSBmYWxzZTtcblx0ICAgICAgICBkbyB7XG5cdCAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXSArIFwiXCI7XG5cdCAgICAgICAgICBpZiAoY2hlY2tUb2tlbkFuZEdldEluZGV4KHRoaXMsIHRva2VuKSA9PT0gLTEpIHtcblx0ICAgICAgICAgICAgdGhpcy5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSB3aGlsZSAoKytpIDwgbCk7XG5cdFxuXHQgICAgICAgIGlmICh1cGRhdGVkKSB7XG5cdCAgICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIGNsYXNzTGlzdFByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgdG9rZW5zID0gYXJndW1lbnRzLFxuXHQgICAgICAgICAgICBpID0gMCxcblx0ICAgICAgICAgICAgbCA9IHRva2Vucy5sZW5ndGgsXG5cdCAgICAgICAgICAgIHRva2VuLFxuXHQgICAgICAgICAgICB1cGRhdGVkID0gZmFsc2UsXG5cdCAgICAgICAgICAgIGluZGV4O1xuXHQgICAgICAgIGRvIHtcblx0ICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldICsgXCJcIjtcblx0ICAgICAgICAgIGluZGV4ID0gY2hlY2tUb2tlbkFuZEdldEluZGV4KHRoaXMsIHRva2VuKTtcblx0ICAgICAgICAgIHdoaWxlIChpbmRleCAhPT0gLTEpIHtcblx0ICAgICAgICAgICAgdGhpcy5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gd2hpbGUgKCsraSA8IGwpO1xuXHRcblx0ICAgICAgICBpZiAodXBkYXRlZCkge1xuXHQgICAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by50b2dnbGUgPSBmdW5jdGlvbiAodG9rZW4sIGZvcmNlKSB7XG5cdCAgICAgICAgdG9rZW4gKz0gXCJcIjtcblx0XG5cdCAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuY29udGFpbnModG9rZW4pLFxuXHQgICAgICAgICAgICBtZXRob2QgPSByZXN1bHQgPyBmb3JjZSAhPT0gdHJ1ZSAmJiBcInJlbW92ZVwiIDogZm9yY2UgIT09IGZhbHNlICYmIFwiYWRkXCI7XG5cdFxuXHQgICAgICAgIGlmIChtZXRob2QpIHtcblx0ICAgICAgICAgIHRoaXNbbWV0aG9kXSh0b2tlbik7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICBpZiAoZm9yY2UgPT09IHRydWUgfHwgZm9yY2UgPT09IGZhbHNlKSB7XG5cdCAgICAgICAgICByZXR1cm4gZm9yY2U7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHJldHVybiAhcmVzdWx0O1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuam9pbihcIiBcIik7XG5cdCAgICAgIH07XG5cdFxuXHQgICAgICBpZiAob2JqQ3RyLmRlZmluZVByb3BlcnR5KSB7XG5cdCAgICAgICAgdmFyIGNsYXNzTGlzdFByb3BEZXNjID0ge1xuXHQgICAgICAgICAgZ2V0OiBjbGFzc0xpc3RHZXR0ZXIsXG5cdCAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KGVsZW1DdHJQcm90bywgY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0UHJvcERlc2MpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG5cdCAgICAgICAgICAvLyBJRSA4IGRvZXNuJ3Qgc3VwcG9ydCBlbnVtZXJhYmxlOnRydWVcblx0ICAgICAgICAgIGlmIChleC5udW1iZXIgPT09IC0weDdGRjVFQzU0KSB7XG5cdCAgICAgICAgICAgIGNsYXNzTGlzdFByb3BEZXNjLmVudW1lcmFibGUgPSBmYWxzZTtcblx0ICAgICAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KGVsZW1DdHJQcm90bywgY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0UHJvcERlc2MpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIGlmIChvYmpDdHJbcHJvdG9Qcm9wXS5fX2RlZmluZUdldHRlcl9fKSB7XG5cdCAgICAgICAgZWxlbUN0clByb3RvLl9fZGVmaW5lR2V0dGVyX18oY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0R2V0dGVyKTtcblx0ICAgICAgfVxuXHQgICAgfSkoc2VsZik7XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vIFRoZXJlIGlzIGZ1bGwgb3IgcGFydGlhbCBuYXRpdmUgY2xhc3NMaXN0IHN1cHBvcnQsIHNvIGp1c3QgY2hlY2sgaWYgd2UgbmVlZFxuXHQgICAgLy8gdG8gbm9ybWFsaXplIHRoZSBhZGQvcmVtb3ZlIGFuZCB0b2dnbGUgQVBJcy5cblx0XG5cdCAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICBcInVzZSBzdHJpY3RcIjtcblx0XG5cdCAgICAgIHZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJfXCIpO1xuXHRcblx0ICAgICAgdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImMxXCIsIFwiYzJcIik7XG5cdFxuXHQgICAgICAvLyBQb2x5ZmlsbCBmb3IgSUUgMTAvMTEgYW5kIEZpcmVmb3ggPDI2LCB3aGVyZSBjbGFzc0xpc3QuYWRkIGFuZFxuXHQgICAgICAvLyBjbGFzc0xpc3QucmVtb3ZlIGV4aXN0IGJ1dCBzdXBwb3J0IG9ubHkgb25lIGFyZ3VtZW50IGF0IGEgdGltZS5cblx0ICAgICAgaWYgKCF0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjMlwiKSkge1xuXHQgICAgICAgIHZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiBjcmVhdGVNZXRob2QobWV0aG9kKSB7XG5cdCAgICAgICAgICB2YXIgb3JpZ2luYWwgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlW21ldGhvZF07XG5cdFxuXHQgICAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgIHZhciBpLFxuXHQgICAgICAgICAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblx0XG5cdCAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICAgIHRva2VuID0gYXJndW1lbnRzW2ldO1xuXHQgICAgICAgICAgICAgIG9yaWdpbmFsLmNhbGwodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgY3JlYXRlTWV0aG9kKCdhZGQnKTtcblx0ICAgICAgICBjcmVhdGVNZXRob2QoJ3JlbW92ZScpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKFwiYzNcIiwgZmFsc2UpO1xuXHRcblx0ICAgICAgLy8gUG9seWZpbGwgZm9yIElFIDEwIGFuZCBGaXJlZm94IDwyNCwgd2hlcmUgY2xhc3NMaXN0LnRvZ2dsZSBkb2VzIG5vdFxuXHQgICAgICAvLyBzdXBwb3J0IHRoZSBzZWNvbmQgYXJndW1lbnQuXG5cdCAgICAgIGlmICh0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjM1wiKSkge1xuXHQgICAgICAgIHZhciBfdG9nZ2xlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGU7XG5cdFxuXHQgICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKHRva2VuLCBmb3JjZSkge1xuXHQgICAgICAgICAgaWYgKDEgaW4gYXJndW1lbnRzICYmICF0aGlzLmNvbnRhaW5zKHRva2VuKSA9PT0gIWZvcmNlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmb3JjZTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiBfdG9nZ2xlLmNhbGwodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHRlc3RFbGVtZW50ID0gbnVsbDtcblx0ICAgIH0pKCk7XG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA2NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdGV4cG9ydHMuZ2V0SlNPTiA9IGdldEpTT047XG5cdGV4cG9ydHMuZ2V0U2Nyb2xsQmFyV2lkdGggPSBnZXRTY3JvbGxCYXJXaWR0aDtcblx0ZXhwb3J0cy50cmFuc2xhdGlvbnMgPSB0cmFuc2xhdGlvbnM7XG5cdGV4cG9ydHMuZGVsYXllciA9IGRlbGF5ZXI7XG5cdGV4cG9ydHMuVnVlRml4ZXIgPSBWdWVGaXhlcjtcblx0Ly8gY29lcmNlIGNvbnZlcnQgc29tIHR5cGVzIG9mIGRhdGEgaW50byBhbm90aGVyIHR5cGVcblx0dmFyIGNvZXJjZSA9IGV4cG9ydHMuY29lcmNlID0ge1xuXHQgIC8vIENvbnZlcnQgYSBzdHJpbmcgdG8gYm9vbGVhbS4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHZhbHVlIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBzbyBpZiBpcyBub3QgYm9vbGVhbiwgVnVlIHRocm93IGEgd2FybmluZy5cblx0ICBib29sZWFuOiBmdW5jdGlvbiBib29sZWFuKHZhbCkge1xuXHQgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gdmFsID09PSAnJyB8fCB2YWwgPT09ICd0cnVlJyA/IHRydWUgOiB2YWwgPT09ICdmYWxzZScgfHwgdmFsID09PSAnbnVsbCcgfHwgdmFsID09PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogdmFsIDogdmFsO1xuXHQgIH0sXG5cdCAgLy8gQXR0ZW1wdCB0byBjb252ZXJ0IGEgc3RyaW5nIHZhbHVlIHRvIGEgTnVtYmVyLiBPdGhlcndpc2UsIHJldHVybiAwLlxuXHQgIG51bWJlcjogZnVuY3Rpb24gbnVtYmVyKHZhbCkge1xuXHQgICAgdmFyIGFsdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcblx0ICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyA/IHZhbCA6IHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCB8fCBpc05hTihOdW1iZXIodmFsKSkgPyBhbHQgOiBOdW1iZXIodmFsKTtcblx0ICB9LFxuXHQgIC8vIEF0dGVtcHQgdG8gY29udmVydCB0byBzdHJpbmcgYW55IHZhbHVlLCBleGNlcHQgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuXHQgIHN0cmluZzogZnVuY3Rpb24gc3RyaW5nKHZhbCkge1xuXHQgICAgcmV0dXJuIHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCA/ICcnIDogdmFsICsgJyc7XG5cdCAgfSxcblx0ICAvLyBQYXR0ZXJuIGFjY2VwdCBSZWdFeHAsIGZ1bmN0aW9uLCBvciBzdHJpbmcgKGNvbnZlcnRlZCB0byBSZWdFeHApLiBPdGhlcndpc2UgcmV0dXJuIG51bGwuXG5cdCAgcGF0dGVybjogZnVuY3Rpb24gcGF0dGVybih2YWwpIHtcblx0ICAgIHJldHVybiB2YWwgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB2YWwgaW5zdGFuY2VvZiBSZWdFeHAgPyB2YWwgOiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IG5ldyBSZWdFeHAodmFsKSA6IG51bGw7XG5cdCAgfVxuXHR9O1xuXHRcblx0ZnVuY3Rpb24gZ2V0SlNPTih1cmwpIHtcblx0ICB2YXIgcmVxdWVzdCA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblx0ICB2YXIgZGF0YSA9IHt9O1xuXHQgIC8vIHAgKC1zaW11bGF0ZWQtIHByb21pc2UpXG5cdCAgdmFyIHAgPSB7XG5cdCAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKGZuMSwgZm4yKSB7XG5cdCAgICAgIHJldHVybiBwLmRvbmUoZm4xKS5mYWlsKGZuMik7XG5cdCAgICB9LFxuXHQgICAgY2F0Y2g6IGZ1bmN0aW9uIF9jYXRjaChmbikge1xuXHQgICAgICByZXR1cm4gcC5mYWlsKGZuKTtcblx0ICAgIH0sXG5cdCAgICBhbHdheXM6IGZ1bmN0aW9uIGFsd2F5cyhmbikge1xuXHQgICAgICByZXR1cm4gcC5kb25lKGZuKS5mYWlsKGZuKTtcblx0ICAgIH1cblx0ICB9O1xuXHQgIFsnZG9uZScsICdmYWlsJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuXHQgICAgZGF0YVtuYW1lXSA9IFtdO1xuXHQgICAgcFtuYW1lXSA9IGZ1bmN0aW9uIChmbikge1xuXHQgICAgICBpZiAoZm4gaW5zdGFuY2VvZiBGdW5jdGlvbikgZGF0YVtuYW1lXS5wdXNoKGZuKTtcblx0ICAgICAgcmV0dXJuIHA7XG5cdCAgICB9O1xuXHQgIH0pO1xuXHQgIHAuZG9uZShKU09OLnBhcnNlKTtcblx0ICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgPT09IDQpIHtcblx0ICAgICAgdmFyIHJlc3BvbnNlO1xuXHQgICAgICB2YXIgaTtcblx0ICAgICAgdmFyIHZhbHVlO1xuXHRcblx0ICAgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgZSA9IHsgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyB9O1xuXHQgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG5cdCAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICByZXNwb25zZSA9IHJlcXVlc3QucmVzcG9uc2VUZXh0O1xuXHRcblx0ICAgICAgICAgICAgZm9yIChpIGluIGRhdGEuZG9uZSkge1xuXHQgICAgICAgICAgICAgIHZhbHVlID0gZGF0YS5kb25lW2ldKHJlc3BvbnNlKTtcblx0XG5cdCAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgZGF0YS5mYWlsLmZvckVhY2goZnVuY3Rpb24gKGZhaWwpIHtcblx0ICAgICAgICAgICAgICByZXR1cm4gZmFpbChlcnIpO1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgZGF0YS5mYWlsLmZvckVhY2goZnVuY3Rpb24gKGZhaWwpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhaWwoZSk7XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pKCk7XG5cdCAgICB9XG5cdCAgfTtcblx0ICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHVybCk7XG5cdCAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuXHQgIHJlcXVlc3Quc2VuZCgpO1xuXHQgIHJldHVybiBwO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBnZXRTY3JvbGxCYXJXaWR0aCgpIHtcblx0ICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCA8PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7XG5cdCAgICByZXR1cm4gMDtcblx0ICB9XG5cdCAgdmFyIGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuXHQgIGlubmVyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuXHQgIGlubmVyLnN0eWxlLmhlaWdodCA9ICcyMDBweCc7XG5cdFxuXHQgIHZhciBvdXRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHQgIG91dGVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0ICBvdXRlci5zdHlsZS50b3AgPSAnMHB4Jztcblx0ICBvdXRlci5zdHlsZS5sZWZ0ID0gJzBweCc7XG5cdCAgb3V0ZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuXHQgIG91dGVyLnN0eWxlLndpZHRoID0gJzIwMHB4Jztcblx0ICBvdXRlci5zdHlsZS5oZWlnaHQgPSAnMTUwcHgnO1xuXHQgIG91dGVyLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cdCAgb3V0ZXIuYXBwZW5kQ2hpbGQoaW5uZXIpO1xuXHRcblx0ICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyKTtcblx0ICB2YXIgdzEgPSBpbm5lci5vZmZzZXRXaWR0aDtcblx0ICBvdXRlci5zdHlsZS5vdmVyZmxvdyA9ICdzY3JvbGwnO1xuXHQgIHZhciB3MiA9IGlubmVyLm9mZnNldFdpZHRoO1xuXHQgIGlmICh3MSA9PT0gdzIpIHcyID0gb3V0ZXIuY2xpZW50V2lkdGg7XG5cdFxuXHQgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQob3V0ZXIpO1xuXHRcblx0ICByZXR1cm4gdzEgLSB3Mjtcblx0fVxuXHRcblx0Ly8gcmV0dXJuIGFsbCB0aGUgdHJhbnNsYXRpb25zIG9yIHRoZSBkZWZhdWx0IGxhbmd1YWdlIChlbmdsaXNoKVxuXHRmdW5jdGlvbiB0cmFuc2xhdGlvbnMoKSB7XG5cdCAgdmFyIGxhbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdlbic7XG5cdFxuXHQgIHZhciB0ZXh0ID0ge1xuXHQgICAgZGF5c09mV2VlazogWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddLFxuXHQgICAgbGltaXQ6ICdMaW1pdCByZWFjaGVkICh7e2xpbWl0fX0gaXRlbXMgbWF4KS4nLFxuXHQgICAgbG9hZGluZzogJ0xvYWRpbmcuLi4nLFxuXHQgICAgbWluTGVuZ3RoOiAnTWluLiBMZW5ndGgnLFxuXHQgICAgbW9udGhzOiBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXSxcblx0ICAgIG5vdFNlbGVjdGVkOiAnTm90aGluZyBTZWxlY3RlZCcsXG5cdCAgICByZXF1aXJlZDogJ1JlcXVpcmVkJyxcblx0ICAgIHNlYXJjaDogJ1NlYXJjaCdcblx0ICB9O1xuXHQgIHJldHVybiB3aW5kb3cuVnVlU3RyYXBMYW5nID8gd2luZG93LlZ1ZVN0cmFwTGFuZyhsYW5nKSA6IHRleHQ7XG5cdH1cblx0XG5cdC8vIGRlbGF5ZXI6IHNldCBhIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZSBhZnRlciBhIGRlbGF5XG5cdC8vIEBwYXJhbXMgKGZ1bmN0aW9uLCBkZWxheV9wcm9wIG9yIHZhbHVlLCBkZWZhdWx0X3ZhbHVlKVxuXHRmdW5jdGlvbiBkZWxheWVyKGZuLCB2YXJUaW1lcikge1xuXHQgIHZhciBpZk5hTiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMTAwO1xuXHRcblx0ICBmdW5jdGlvbiB0b0ludChlbCkge1xuXHQgICAgcmV0dXJuICgvXlswLTldKyQvLnRlc3QoZWwpID8gTnVtYmVyKGVsKSB8fCAxIDogbnVsbFxuXHQgICAgKTtcblx0ICB9XG5cdCAgdmFyIHRpbWVySWQ7XG5cdCAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcblx0ICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcblx0ICAgIH1cblx0XG5cdCAgICBpZiAodGltZXJJZCkgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuXHQgICAgdGltZXJJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICBmbi5hcHBseShfdGhpcywgYXJncyk7XG5cdCAgICB9LCB0b0ludCh2YXJUaW1lcikgfHwgdG9JbnQodGhpc1t2YXJUaW1lcl0pIHx8IGlmTmFOKTtcblx0ICB9O1xuXHR9XG5cdFxuXHQvLyBGaXggYSB2dWUgaW5zdGFuY2UgTGlmZWN5Y2xlIHRvIHZ1ZSAxLzIgKGp1c3QgdGhlIGJhc2ljIGVsZW1lbnRzLCBpcyBub3QgYSByZWFsIHBhcnNlciwgc28gdGhpcyB3b3JrIG9ubHkgaWYgeW91ciBjb2RlIGlzIGNvbXBhdGlibGUgd2l0aCBib3RoKVxuXHQvLyAoV2FpdGluZyBmb3IgdGVzdGluZylcblx0ZnVuY3Rpb24gVnVlRml4ZXIodnVlKSB7XG5cdCAgdmFyIHZ1ZTIgPSAhd2luZG93LlZ1ZSB8fCAhd2luZG93LlZ1ZS5wYXJ0aWFsO1xuXHQgIHZhciBtaXhpbiA9IHtcblx0ICAgIGNvbXB1dGVkOiB7XG5cdCAgICAgIHZ1ZTI6IGZ1bmN0aW9uIHZ1ZTIoKSB7XG5cdCAgICAgICAgcmV0dXJuICF0aGlzLiRkaXNwYXRjaDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH07XG5cdCAgaWYgKCF2dWUyKSB7XG5cdCAgICAvL3RyYW5zbGF0ZSB2dWUyIGF0dHJpYnV0ZXMgdG8gdnVlMVxuXHQgICAgaWYgKHZ1ZS5iZWZvcmVDcmVhdGUpIHtcblx0ICAgICAgbWl4aW4uY3JlYXRlID0gdnVlLmJlZm9yZUNyZWF0ZTtcblx0ICAgICAgZGVsZXRlIHZ1ZS5iZWZvcmVDcmVhdGU7XG5cdCAgICB9XG5cdCAgICBpZiAodnVlLmJlZm9yZU1vdW50KSB7XG5cdCAgICAgIHZ1ZS5iZWZvcmVDb21waWxlID0gdnVlLmJlZm9yZU1vdW50O1xuXHQgICAgICBkZWxldGUgdnVlLmJlZm9yZU1vdW50O1xuXHQgICAgfVxuXHQgICAgaWYgKHZ1ZS5tb3VudGVkKSB7XG5cdCAgICAgIHZ1ZS5yZWFkeSA9IHZ1ZS5tb3VudGVkO1xuXHQgICAgICBkZWxldGUgdnVlLm1vdW50ZWQ7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vdHJhbnNsYXRlIHZ1ZTEgYXR0cmlidXRlcyB0byB2dWUyXG5cdCAgICBpZiAodnVlLmJlZm9yZUNvbXBpbGUpIHtcblx0ICAgICAgdnVlLmJlZm9yZU1vdW50ID0gdnVlLmJlZm9yZUNvbXBpbGU7XG5cdCAgICAgIGRlbGV0ZSB2dWUuYmVmb3JlQ29tcGlsZTtcblx0ICAgIH1cblx0ICAgIGlmICh2dWUuY29tcGlsZWQpIHtcblx0ICAgICAgbWl4aW4uY29tcGlsZWQgPSB2dWUuY29tcGlsZWQ7XG5cdCAgICAgIGRlbGV0ZSB2dWUuY29tcGlsZWQ7XG5cdCAgICB9XG5cdCAgICBpZiAodnVlLnJlYWR5KSB7XG5cdCAgICAgIHZ1ZS5tb3VudGVkID0gdnVlLnJlYWR5O1xuXHQgICAgICBkZWxldGUgdnVlLnJlYWR5O1xuXHQgICAgfVxuXHQgIH1cblx0ICBpZiAoIXZ1ZS5taXhpbnMpIHtcblx0ICAgIHZ1ZS5taXhpbnMgPSBbXTtcblx0ICB9XG5cdCAgdnVlLm1peGlucy51bnNoaWZ0KG1peGluKTtcblx0ICByZXR1cm4gdnVlO1xuXHR9XG5cbi8qKiovIH0sXG4vKiA2NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKHByb2Nlc3MpIHsndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0LyoqXHJcblx0ICogQ2xpY2sgb3V0c2lkZSBkaXJlY3RpdmVcclxuXHQgKi9cblx0dmFyIGJpbmRlZCA9IFtdO1xuXHRcblx0ZnVuY3Rpb24gaGFuZGxlcihlKSB7XG5cdCAgYmluZGVkLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICBpZiAoIWVsLm5vZGUuY29udGFpbnMoZS50YXJnZXQpKSBlbC5jYWxsYmFjayhlKTtcblx0ICB9KTtcblx0fVxuXHRcblx0ZnVuY3Rpb24gYWRkTGlzdGVuZXIobm9kZSwgY2FsbGJhY2spIHtcblx0ICBpZiAoIWJpbmRlZC5sZW5ndGgpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlciwgZmFsc2UpO1xuXHQgIGJpbmRlZC5wdXNoKHsgbm9kZTogbm9kZSwgY2FsbGJhY2s6IGNhbGxiYWNrIH0pO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihub2RlLCBjYWxsYmFjaykge1xuXHQgIGJpbmRlZCA9IGJpbmRlZC5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICByZXR1cm4gZWwubm9kZSAhPT0gbm9kZSA/IHRydWUgOiAhY2FsbGJhY2sgPyBmYWxzZSA6IGVsLmNhbGxiYWNrICE9PSBjYWxsYmFjaztcblx0ICB9KTtcblx0ICBpZiAoIWJpbmRlZC5sZW5ndGgpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlciwgZmFsc2UpO1xuXHR9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgYmluZDogZnVuY3Rpb24gYmluZChlbCwgYmluZGluZykge1xuXHQgICAgcmVtb3ZlTGlzdGVuZXIoZWwsIGJpbmRpbmcudmFsdWUpO1xuXHQgICAgaWYgKHR5cGVvZiBiaW5kaW5nLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG5cdCAgICAgICAgVnVlLnV0aWwud2FybignQ2xpY2tPdXRzaWRlIG9ubHkgd29yayB3aXRoIGEgZnVuY3Rpb24sIHJlY2VpdmVkOiB2LScgKyBiaW5kaW5nLm5hbWUgKyAnPVwiJyArIGJpbmRpbmcuZXhwcmVzc2lvbiArICdcIicpO1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBhZGRMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShlbCwgYmluZGluZykge1xuXHQgICAgaWYgKGJpbmRpbmcudmFsdWUgIT09IGJpbmRpbmcub2xkVmFsdWUpIHtcblx0ICAgICAgcmVtb3ZlTGlzdGVuZXIoZWwsIGJpbmRpbmcub2xkVmFsdWUpO1xuXHQgICAgICBhZGRMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB1bmJpbmQ6IGZ1bmN0aW9uIHVuYmluZChlbCwgYmluZGluZykge1xuXHQgICAgcmVtb3ZlTGlzdGVuZXIoZWwsIGJpbmRpbmcudmFsdWUpO1xuXHQgIH1cblx0fTtcblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oNjcpKSlcblxuLyoqKi8gfSxcbi8qIDY3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblx0dmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXHRcblx0Ly8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG5cdC8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuXHQvLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG5cdC8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cdFxuXHR2YXIgY2FjaGVkU2V0VGltZW91dDtcblx0dmFyIGNhY2hlZENsZWFyVGltZW91dDtcblx0XG5cdGZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcblx0fVxuXHRmdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG5cdH1cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIHRyeSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuXHQgICAgICAgIH1cblx0ICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG5cdCAgICB9XG5cdH0gKCkpXG5cdGZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG5cdCAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuXHQgICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuXHQgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgICB9XG5cdCAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXHQgICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG5cdCAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG5cdCAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuXHQgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgICB9IGNhdGNoKGUpe1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG5cdCAgICAgICAgfSBjYXRjaChlKXtcblx0ICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3Jcblx0ICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0XG5cdFxuXHR9XG5cdGZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcblx0ICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuXHQgICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuXHQgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH1cblx0ICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcblx0ICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuXHQgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcblx0ICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgICB9XG5cdCAgICB0cnkge1xuXHQgICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3Ncblx0ICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgICB9IGNhdGNoIChlKXtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGUpe1xuXHQgICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cblx0ICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdFxuXHRcblx0XG5cdH1cblx0dmFyIHF1ZXVlID0gW107XG5cdHZhciBkcmFpbmluZyA9IGZhbHNlO1xuXHR2YXIgY3VycmVudFF1ZXVlO1xuXHR2YXIgcXVldWVJbmRleCA9IC0xO1xuXHRcblx0ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuXHQgICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgZHJhaW5pbmcgPSBmYWxzZTtcblx0ICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuXHQgICAgfVxuXHQgICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuXHQgICAgICAgIGRyYWluUXVldWUoKTtcblx0ICAgIH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcblx0ICAgIGlmIChkcmFpbmluZykge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuXHQgICAgZHJhaW5pbmcgPSB0cnVlO1xuXHRcblx0ICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG5cdCAgICB3aGlsZShsZW4pIHtcblx0ICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcblx0ICAgICAgICBxdWV1ZSA9IFtdO1xuXHQgICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcblx0ICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuXHQgICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcblx0ICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG5cdCAgICB9XG5cdCAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuXHQgICAgZHJhaW5pbmcgPSBmYWxzZTtcblx0ICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0fVxuXHRcblx0cHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcblx0ICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcblx0ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG5cdCAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuXHQgICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG5cdCAgICB9XG5cdH07XG5cdFxuXHQvLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5cdGZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuXHQgICAgdGhpcy5mdW4gPSBmdW47XG5cdCAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG5cdH1cblx0SXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG5cdH07XG5cdHByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5cdHByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5cdHByb2Nlc3MuZW52ID0ge307XG5cdHByb2Nlc3MuYXJndiA9IFtdO1xuXHRwcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcblx0cHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXHRcblx0ZnVuY3Rpb24gbm9vcCgpIHt9XG5cdFxuXHRwcm9jZXNzLm9uID0gbm9vcDtcblx0cHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5cdHByb2Nlc3Mub25jZSA9IG5vb3A7XG5cdHByb2Nlc3Mub2ZmID0gbm9vcDtcblx0cHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5cdHByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcblx0cHJvY2Vzcy5lbWl0ID0gbm9vcDtcblx0XG5cdHByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG5cdH07XG5cdFxuXHRwcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xuXHRwcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcblx0fTtcblx0cHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG4vKioqLyB9LFxuLyogNjggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqLyhmdW5jdGlvbihwcm9jZXNzKSB7J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8qKlxyXG5cdCAqIENsaWNrIG91dHNpZGUgZGlyZWN0aXZlXHJcblx0ICovXG5cdHZhciBIQU5ETEVSID0gJ192dWVfc2Nyb2xsX2hhbmRsZXInO1xuXHR2YXIgZXZlbnRzID0gWydyZXNpemUnLCAnc2Nyb2xsJ107XG5cdFxuXHRmdW5jdGlvbiBiaW5kKGVsLCBiaW5kaW5nKSB7XG5cdCAgdW5iaW5kKGVsKTtcblx0XG5cdCAgdmFyIGNhbGxiYWNrID0gYmluZGluZy52YWx1ZTtcblx0ICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuXHQgICAgICBWdWUudXRpbC53YXJuKCdDbGlja091dHNpZGUgb25seSB3b3JrIHdpdGggYSBmdW5jdGlvbiB2YWx1ZSwgcmVjZWl2ZWQ6IHYtJyArIGJpbmRpbmcubmFtZSArICc9XCInICsgYmluZGluZy5leHByZXNzaW9uICsgJ1wiJyk7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIGVsW0hBTkRMRVJdID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgY2FsbGJhY2soZSk7XG5cdCAgICB9O1xuXHQgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZSwgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICAgIH0pO1xuXHQgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGVsW0hBTkRMRVJdLCBmYWxzZSk7XG5cdCAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgZWxbSEFORExFUl0oKTtcblx0ICAgIH0sIDApO1xuXHQgIH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gdW5iaW5kKGVsKSB7XG5cdCAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcblx0ICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGUsIGVsW0hBTkRMRVJdLCBmYWxzZSk7XG5cdCAgfSk7XG5cdCAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIGVsW0hBTkRMRVJdLCBmYWxzZSk7XG5cdCAgZGVsZXRlIGVsW0hBTkRMRVJdO1xuXHR9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgYmluZDogYmluZCxcblx0ICB1bmJpbmQ6IHVuYmluZCxcblx0ICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShlbCwgYmluZGluZykge1xuXHQgICAgaWYgKGJpbmRpbmcudmFsdWUgIT09IGJpbmRpbmcub2xkVmFsdWUpIGJpbmQoZWwsIGJpbmRpbmcpO1xuXHQgIH1cblx0fTtcblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oNjcpKSlcblxuLyoqKi8gfSxcbi8qIDY5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEFjY29yZGlvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtZDRiNzVhOTJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWQ0Yjc1YTkyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQWNjb3JkaW9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDcwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgdHlwZToge1xuXHQgICAgICB0eXBlOiBTdHJpbmcsXG5cdCAgICAgIGRlZmF1bHQ6IG51bGxcblx0ICAgIH0sXG5cdCAgICBvbmVBdEF0aW1lOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IGZhbHNlXG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBvcGVuQ2hpbGQ6IGZ1bmN0aW9uIG9wZW5DaGlsZChjaGlsZCkge1xuXHQgICAgICBpZiAodGhpcy5vbmVBdEF0aW1lKSB7XG5cdCAgICAgICAgdGhpcy4kY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgICAgICAgaWYgKGNoaWxkICE9PSBpdGVtKSB7XG5cdCAgICAgICAgICAgIGl0ZW0ub3BlbiA9IGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5faXNBY2NvcmRpb24gPSB0cnVlO1xuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDcxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLWdyb3VwXCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LWQ0Yjc1YTkyXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogNzIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzMpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzQpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQWZmaXgudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTVlYmRkZWJmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi01ZWJkZGViZlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEFmZml4LnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDczICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfU2Nyb2xsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OCk7XG5cdFxuXHR2YXIgX1Njcm9sbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TY3JvbGwpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBkaXJlY3RpdmVzOiB7XG5cdCAgICBTY3JvbGw6IF9TY3JvbGwyLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICBvZmZzZXQ6IHtcblx0ICAgICAgdHlwZTogTnVtYmVyLFxuXHQgICAgICBkZWZhdWx0OiAwXG5cdCAgICB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgYWZmaXhlZDogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHRvcDogZnVuY3Rpb24gdG9wKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5vZmZzZXQgPiAwID8gdGhpcy5vZmZzZXQgKyAncHgnIDogbnVsbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIC8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9ibG9iL21hc3Rlci9jb21wb25lbnRzL2FmZml4L2luZGV4LmpzeCNMMjBcblx0ICAgIGNoZWNrU2Nyb2xsOiBmdW5jdGlvbiBjaGVja1Njcm9sbCgpIHtcblx0ICAgICAgLy8gaWYgaXMgaGlkZGVuIGRvbid0IGNhbGN1bGF0ZSBhbnl0aGluZ1xuXHQgICAgICBpZiAoISh0aGlzLiRlbC5vZmZzZXRXaWR0aCB8fCB0aGlzLiRlbC5vZmZzZXRIZWlnaHQgfHwgdGhpcy4kZWwuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIC8vIGdldCB3aW5kb3cgc2Nyb2xsIGFuZCBlbGVtZW50IHBvc2l0aW9uIHRvIGRldGVjdCBpZiBoYXZlIHRvIGJlIG5vcm1hbCBvciBhZmZpeGVkXG5cdCAgICAgIHZhciBzY3JvbGwgPSB7fTtcblx0ICAgICAgdmFyIGVsZW1lbnQgPSB7fTtcblx0ICAgICAgdmFyIHJlY3QgPSB0aGlzLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0ICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXHQgICAgICB2YXIgX2FyciA9IFsnVG9wJywgJ0xlZnQnXTtcblx0ICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IF9hcnIubGVuZ3RoOyBfaSsrKSB7XG5cdCAgICAgICAgdmFyIHR5cGUgPSBfYXJyW19pXTtcblx0ICAgICAgICB2YXIgdCA9IHR5cGUudG9Mb3dlckNhc2UoKTtcblx0ICAgICAgICB2YXIgcmV0ID0gd2luZG93WydwYWdlJyArICh0eXBlID09PSAnVG9wJyA/ICdZJyA6ICdYJykgKyAnT2Zmc2V0J107XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9ICdzY3JvbGwnICsgdHlwZTtcblx0ICAgICAgICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcblx0ICAgICAgICAgIC8vIGllNiw3LDggc3RhbmRhcmQgbW9kZVxuXHQgICAgICAgICAgcmV0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W21ldGhvZF07XG5cdCAgICAgICAgICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcblx0ICAgICAgICAgICAgLy8gcXVpcmtzIG1vZGVcblx0ICAgICAgICAgICAgcmV0ID0gZG9jdW1lbnQuYm9keVttZXRob2RdO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBzY3JvbGxbdF0gPSByZXQ7XG5cdCAgICAgICAgZWxlbWVudFt0XSA9IHNjcm9sbFt0XSArIHJlY3RbdF0gLSAodGhpcy4kZWxbJ2NsaWVudCcgKyB0eXBlXSB8fCBib2R5WydjbGllbnQnICsgdHlwZV0gfHwgMCk7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIGZpeCA9IHNjcm9sbC50b3AgPiBlbGVtZW50LnRvcCAtIHRoaXMub2Zmc2V0O1xuXHQgICAgICBpZiAodGhpcy5hZmZpeGVkICE9PSBmaXgpIHtcblx0ICAgICAgICB0aGlzLmFmZml4ZWQgPSBmaXg7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiA3NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJoaWRkZW4tcHJpbnQgaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG5cdCAgfSwgW192bS5fYygnbmF2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzY3JvbGxcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNjcm9sbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jaGVja1Njcm9sbCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY2hlY2tTY3JvbGxcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJicy1kb2NzLXNpZGViYXJcIixcblx0ICAgIGNsYXNzOiB7XG5cdCAgICAgIGFmZml4OiBfdm0uYWZmaXhlZFxuXHQgICAgfSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICBtYXJnaW5Ub3A6IF92bS50b3Bcblx0ICAgIH0pXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTVlYmRkZWJmXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogNzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oNzYpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MClcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxBbGVydC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtYWY3YzFmNmFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWFmN2MxZjZhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQWxlcnQudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogNzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc3KTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1hZjdjMWY2YSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQWxlcnQudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1hZjdjMWY2YSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQWxlcnQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogNzcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmZhZGUtZW50ZXItYWN0aXZlLFxcclxcbi5mYWRlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4zcyBlYXNlO1xcbn1cXG4uZmFkZS1lbnRlcixcXHJcXG4uZmFkZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgaGVpZ2h0OiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXG59XFxuLmFsZXJ0LnRvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDMwcHg7XFxyXFxuICBtYXJnaW46IDAgYXV0bztcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNTA7XFxufVxcbi5hbGVydC50b3AtcmlnaHQge1xcclxcbiAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgdG9wOiAzMHB4O1xcclxcbiAgcmlnaHQ6IDUwcHg7XFxyXFxuICB6LWluZGV4OiAxMDUwO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0FsZXJ0LnZ1ZT83MWE5MWMxYVwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBb0RBOztFQUVBLDZCQUFBO0NBQ0E7QUFDQTs7RUFFQSxVQUFBO0VBQ0EsV0FBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtFQUNBLFVBQUE7RUFDQSxlQUFBO0VBQ0EsUUFBQTtFQUNBLFNBQUE7RUFDQSxjQUFBO0NBQ0E7QUFDQTtFQUNBLGdCQUFBO0VBQ0EsVUFBQTtFQUNBLFlBQUE7RUFDQSxjQUFBO0NBQ0FcIixcImZpbGVcIjpcIkFsZXJ0LnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8dHJhbnNpdGlvbiBuYW1lPVxcXCJmYWRlXFxcIj5cXHJcXG4gICAgPGRpdiB2LXNob3c9XFxcInZhbFxcXCIgOmNsYXNzPVxcXCJbJ2FsZXJ0JywgJ2FsZXJ0LScrdHlwZSwgcGxhY2VtZW50XVxcXCIgOnN0eWxlPVxcXCJ7d2lkdGg6d2lkdGh9XFxcIiByb2xlPVxcXCJhbGVydFxcXCI+XFxyXFxuICAgICAgPGJ1dHRvbiB2LXNob3c9XFxcImRpc21pc3NhYmxlXFxcIiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJ2YWwgPSBmYWxzZVxcXCI+XFxyXFxuICAgICAgICA8c3Bhbj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgIDwvYnV0dG9uPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L3RyYW5zaXRpb24+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Y29lcmNlLCBkZWxheWVyfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xcclxcblxcclxcbnZhciBEVVJBVElPTiA9IDBcXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBkaXNtaXNzYWJsZToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZHVyYXRpb246IHtkZWZhdWx0OiBEVVJBVElPTn0sXFxyXFxuICAgIHBsYWNlbWVudDoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICB2YWx1ZToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcXHJcXG4gICAgd2lkdGg6IHt0eXBlOiBTdHJpbmd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgdmFsOiB0aGlzLnZhbHVlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBkdXJhdGlvbk51bSAoKSB7IHJldHVybiBjb2VyY2UubnVtYmVyKHRoaXMuZHVyYXRpb24sIERVUkFUSU9OKSB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgdmFsICh2YWwpIHtcXHJcXG4gICAgICBpZiAodmFsICYmIHRoaXMuZHVyYXRpb25OdW0gPiAwKSB7IHRoaXMuX2RlbGF5Q2xvc2UoKSB9XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB2YWxcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5fZGVsYXlDbG9zZSA9IGRlbGF5ZXIoZnVuY3Rpb24gKCkge1xcclxcbiAgICAgIHRoaXMudmFsID0gZmFsc2VcXHJcXG4gICAgfSwgJ2R1cmF0aW9uTnVtJylcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi5mYWRlLWVudGVyLWFjdGl2ZSxcXHJcXG4uZmFkZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTtcXHJcXG59XFxyXFxuLmZhZGUtZW50ZXIsXFxyXFxuLmZhZGUtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIGhlaWdodDogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxufVxcclxcbi5hbGVydC50b3Age1xcclxcbiAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgdG9wOiAzMHB4O1xcclxcbiAgbWFyZ2luOiAwIGF1dG87XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICB6LWluZGV4OiAxMDUwO1xcclxcbn1cXHJcXG4uYWxlcnQudG9wLXJpZ2h0IHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMzBweDtcXHJcXG4gIHJpZ2h0OiA1MHB4O1xcclxcbiAgei1pbmRleDogMTA1MDtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDc4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKlxyXG5cdFx0TUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcclxuXHRcdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcclxuXHQqL1xyXG5cdC8vIGNzcyBiYXNlIGNvZGUsIGluamVjdGVkIGJ5IHRoZSBjc3MtbG9hZGVyXHJcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBsaXN0ID0gW107XHJcblx0XHJcblx0XHQvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXHJcblx0XHRsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XHJcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcclxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaXRlbSA9IHRoaXNbaV07XHJcblx0XHRcdFx0aWYoaXRlbVsyXSkge1xyXG5cdFx0XHRcdFx0cmVzdWx0LnB1c2goXCJAbWVkaWEgXCIgKyBpdGVtWzJdICsgXCJ7XCIgKyBpdGVtWzFdICsgXCJ9XCIpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXN1bHQucHVzaChpdGVtWzFdKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHJlc3VsdC5qb2luKFwiXCIpO1xyXG5cdFx0fTtcclxuXHRcclxuXHRcdC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XHJcblx0XHRsaXN0LmkgPSBmdW5jdGlvbihtb2R1bGVzLCBtZWRpYVF1ZXJ5KSB7XHJcblx0XHRcdGlmKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKVxyXG5cdFx0XHRcdG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIFwiXCJdXTtcclxuXHRcdFx0dmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcclxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaWQgPSB0aGlzW2ldWzBdO1xyXG5cdFx0XHRcdGlmKHR5cGVvZiBpZCA9PT0gXCJudW1iZXJcIilcclxuXHRcdFx0XHRcdGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IoaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0dmFyIGl0ZW0gPSBtb2R1bGVzW2ldO1xyXG5cdFx0XHRcdC8vIHNraXAgYWxyZWFkeSBpbXBvcnRlZCBtb2R1bGVcclxuXHRcdFx0XHQvLyB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCAxMDAlIHBlcmZlY3QgZm9yIHdlaXJkIG1lZGlhIHF1ZXJ5IGNvbWJpbmF0aW9uc1xyXG5cdFx0XHRcdC8vICB3aGVuIGEgbW9kdWxlIGlzIGltcG9ydGVkIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IG1lZGlhIHF1ZXJpZXMuXHJcblx0XHRcdFx0Ly8gIEkgaG9wZSB0aGlzIHdpbGwgbmV2ZXIgb2NjdXIgKEhleSB0aGlzIHdheSB3ZSBoYXZlIHNtYWxsZXIgYnVuZGxlcylcclxuXHRcdFx0XHRpZih0eXBlb2YgaXRlbVswXSAhPT0gXCJudW1iZXJcIiB8fCAhYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xyXG5cdFx0XHRcdFx0aWYobWVkaWFRdWVyeSAmJiAhaXRlbVsyXSkge1xyXG5cdFx0XHRcdFx0XHRpdGVtWzJdID0gbWVkaWFRdWVyeTtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZihtZWRpYVF1ZXJ5KSB7XHJcblx0XHRcdFx0XHRcdGl0ZW1bMl0gPSBcIihcIiArIGl0ZW1bMl0gKyBcIikgYW5kIChcIiArIG1lZGlhUXVlcnkgKyBcIilcIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxpc3QucHVzaChpdGVtKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0XHRyZXR1cm4gbGlzdDtcclxuXHR9O1xyXG5cblxuLyoqKi8gfSxcbi8qIDc5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKlxuXHRcdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG5cdFx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuXHQqL1xuXHR2YXIgc3R5bGVzSW5Eb20gPSB7fSxcblx0XHRtZW1vaXplID0gZnVuY3Rpb24oZm4pIHtcblx0XHRcdHZhciBtZW1vO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBtZW1vID09PSBcInVuZGVmaW5lZFwiKSBtZW1vID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHRcdFx0cmV0dXJuIG1lbW87XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0aXNPbGRJRSA9IG1lbW9pemUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gL21zaWUgWzYtOV1cXGIvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSk7XG5cdFx0fSksXG5cdFx0Z2V0SGVhZEVsZW1lbnQgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXTtcblx0XHR9KSxcblx0XHRzaW5nbGV0b25FbGVtZW50ID0gbnVsbCxcblx0XHRzaW5nbGV0b25Db3VudGVyID0gMCxcblx0XHRzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcCA9IFtdO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihsaXN0LCBvcHRpb25zKSB7XG5cdFx0aWYoZmFsc2UpIHtcblx0XHRcdGlmKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0eWxlLWxvYWRlciBjYW5ub3QgYmUgdXNlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xuXHRcdH1cblx0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0Ly8gRm9yY2Ugc2luZ2xlLXRhZyBzb2x1dGlvbiBvbiBJRTYtOSwgd2hpY2ggaGFzIGEgaGFyZCBsaW1pdCBvbiB0aGUgIyBvZiA8c3R5bGU+XG5cdFx0Ly8gdGFncyBpdCB3aWxsIGFsbG93IG9uIGEgcGFnZVxuXHRcdGlmICh0eXBlb2Ygb3B0aW9ucy5zaW5nbGV0b24gPT09IFwidW5kZWZpbmVkXCIpIG9wdGlvbnMuc2luZ2xldG9uID0gaXNPbGRJRSgpO1xuXHRcblx0XHQvLyBCeSBkZWZhdWx0LCBhZGQgPHN0eWxlPiB0YWdzIHRvIHRoZSBib3R0b20gb2YgPGhlYWQ+LlxuXHRcdGlmICh0eXBlb2Ygb3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJ1bmRlZmluZWRcIikgb3B0aW9ucy5pbnNlcnRBdCA9IFwiYm90dG9tXCI7XG5cdFxuXHRcdHZhciBzdHlsZXMgPSBsaXN0VG9TdHlsZXMobGlzdCk7XG5cdFx0YWRkU3R5bGVzVG9Eb20oc3R5bGVzLCBvcHRpb25zKTtcblx0XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG5cdFx0XHR2YXIgbWF5UmVtb3ZlID0gW107XG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xuXHRcdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblx0XHRcdFx0ZG9tU3R5bGUucmVmcy0tO1xuXHRcdFx0XHRtYXlSZW1vdmUucHVzaChkb21TdHlsZSk7XG5cdFx0XHR9XG5cdFx0XHRpZihuZXdMaXN0KSB7XG5cdFx0XHRcdHZhciBuZXdTdHlsZXMgPSBsaXN0VG9TdHlsZXMobmV3TGlzdCk7XG5cdFx0XHRcdGFkZFN0eWxlc1RvRG9tKG5ld1N0eWxlcywgb3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgbWF5UmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciBkb21TdHlsZSA9IG1heVJlbW92ZVtpXTtcblx0XHRcdFx0aWYoZG9tU3R5bGUucmVmcyA9PT0gMCkge1xuXHRcdFx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKylcblx0XHRcdFx0XHRcdGRvbVN0eWxlLnBhcnRzW2pdKCk7XG5cdFx0XHRcdFx0ZGVsZXRlIHN0eWxlc0luRG9tW2RvbVN0eWxlLmlkXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGFkZFN0eWxlc1RvRG9tKHN0eWxlcywgb3B0aW9ucykge1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xuXHRcdFx0dmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF07XG5cdFx0XHRpZihkb21TdHlsZSkge1xuXHRcdFx0XHRkb21TdHlsZS5yZWZzKys7XG5cdFx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdGRvbVN0eWxlLnBhcnRzW2pdKGl0ZW0ucGFydHNbal0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvcig7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0ZG9tU3R5bGUucGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBwYXJ0cyA9IFtdO1xuXHRcdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdHBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlc0luRG9tW2l0ZW0uaWRdID0ge2lkOiBpdGVtLmlkLCByZWZzOiAxLCBwYXJ0czogcGFydHN9O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gbGlzdFRvU3R5bGVzKGxpc3QpIHtcblx0XHR2YXIgc3R5bGVzID0gW107XG5cdFx0dmFyIG5ld1N0eWxlcyA9IHt9O1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IGxpc3RbaV07XG5cdFx0XHR2YXIgaWQgPSBpdGVtWzBdO1xuXHRcdFx0dmFyIGNzcyA9IGl0ZW1bMV07XG5cdFx0XHR2YXIgbWVkaWEgPSBpdGVtWzJdO1xuXHRcdFx0dmFyIHNvdXJjZU1hcCA9IGl0ZW1bM107XG5cdFx0XHR2YXIgcGFydCA9IHtjc3M6IGNzcywgbWVkaWE6IG1lZGlhLCBzb3VyY2VNYXA6IHNvdXJjZU1hcH07XG5cdFx0XHRpZighbmV3U3R5bGVzW2lkXSlcblx0XHRcdFx0c3R5bGVzLnB1c2gobmV3U3R5bGVzW2lkXSA9IHtpZDogaWQsIHBhcnRzOiBbcGFydF19KTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0bmV3U3R5bGVzW2lkXS5wYXJ0cy5wdXNoKHBhcnQpO1xuXHRcdH1cblx0XHRyZXR1cm4gc3R5bGVzO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgc3R5bGVFbGVtZW50KSB7XG5cdFx0dmFyIGhlYWQgPSBnZXRIZWFkRWxlbWVudCgpO1xuXHRcdHZhciBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcCA9IHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wW3N0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wLmxlbmd0aCAtIDFdO1xuXHRcdGlmIChvcHRpb25zLmluc2VydEF0ID09PSBcInRvcFwiKSB7XG5cdFx0XHRpZighbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3ApIHtcblx0XHRcdFx0aGVhZC5pbnNlcnRCZWZvcmUoc3R5bGVFbGVtZW50LCBoZWFkLmZpcnN0Q2hpbGQpO1xuXHRcdFx0fSBlbHNlIGlmKGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wLm5leHRTaWJsaW5nKSB7XG5cdFx0XHRcdGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlRWxlbWVudCwgbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AubmV4dFNpYmxpbmcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpO1xuXHRcdFx0fVxuXHRcdFx0c3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3AucHVzaChzdHlsZUVsZW1lbnQpO1xuXHRcdH0gZWxzZSBpZiAob3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJib3R0b21cIikge1xuXHRcdFx0aGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgJ2luc2VydEF0Jy4gTXVzdCBiZSAndG9wJyBvciAnYm90dG9tJy5cIik7XG5cdFx0fVxuXHR9XG5cdFxuXHRmdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG5cdFx0c3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcblx0XHR2YXIgaWR4ID0gc3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3AuaW5kZXhPZihzdHlsZUVsZW1lbnQpO1xuXHRcdGlmKGlkeCA+PSAwKSB7XG5cdFx0XHRzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcC5zcGxpY2UoaWR4LCAxKTtcblx0XHR9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKSB7XG5cdFx0dmFyIHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblx0XHRzdHlsZUVsZW1lbnQudHlwZSA9IFwidGV4dC9jc3NcIjtcblx0XHRpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgc3R5bGVFbGVtZW50KTtcblx0XHRyZXR1cm4gc3R5bGVFbGVtZW50O1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBhZGRTdHlsZShvYmosIG9wdGlvbnMpIHtcblx0XHR2YXIgc3R5bGVFbGVtZW50LCB1cGRhdGUsIHJlbW92ZTtcblx0XG5cdFx0aWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XG5cdFx0XHR2YXIgc3R5bGVJbmRleCA9IHNpbmdsZXRvbkNvdW50ZXIrKztcblx0XHRcdHN0eWxlRWxlbWVudCA9IHNpbmdsZXRvbkVsZW1lbnQgfHwgKHNpbmdsZXRvbkVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucykpO1xuXHRcdFx0dXBkYXRlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCwgc3R5bGVJbmRleCwgZmFsc2UpO1xuXHRcdFx0cmVtb3ZlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCwgc3R5bGVJbmRleCwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN0eWxlRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKTtcblx0XHRcdHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQpO1xuXHRcdFx0cmVtb3ZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuXHRcdFx0fTtcblx0XHR9XG5cdFxuXHRcdHVwZGF0ZShvYmopO1xuXHRcblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlU3R5bGUobmV3T2JqKSB7XG5cdFx0XHRpZihuZXdPYmopIHtcblx0XHRcdFx0aWYobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwKVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0dXBkYXRlKG9iaiA9IG5ld09iaik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZW1vdmUoKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cdFxuXHR2YXIgcmVwbGFjZVRleHQgPSAoZnVuY3Rpb24gKCkge1xuXHRcdHZhciB0ZXh0U3RvcmUgPSBbXTtcblx0XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIChpbmRleCwgcmVwbGFjZW1lbnQpIHtcblx0XHRcdHRleHRTdG9yZVtpbmRleF0gPSByZXBsYWNlbWVudDtcblx0XHRcdHJldHVybiB0ZXh0U3RvcmUuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ1xcbicpO1xuXHRcdH07XG5cdH0pKCk7XG5cdFxuXHRmdW5jdGlvbiBhcHBseVRvU2luZ2xldG9uVGFnKHN0eWxlRWxlbWVudCwgaW5kZXgsIHJlbW92ZSwgb2JqKSB7XG5cdFx0dmFyIGNzcyA9IHJlbW92ZSA/IFwiXCIgOiBvYmouY3NzO1xuXHRcblx0XHRpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcblx0XHRcdHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSByZXBsYWNlVGV4dChpbmRleCwgY3NzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpO1xuXHRcdFx0dmFyIGNoaWxkTm9kZXMgPSBzdHlsZUVsZW1lbnQuY2hpbGROb2Rlcztcblx0XHRcdGlmIChjaGlsZE5vZGVzW2luZGV4XSkgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaW5kZXhdKTtcblx0XHRcdGlmIChjaGlsZE5vZGVzLmxlbmd0aCkge1xuXHRcdFx0XHRzdHlsZUVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNzc05vZGUsIGNoaWxkTm9kZXNbaW5kZXhdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChjc3NOb2RlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGFwcGx5VG9UYWcoc3R5bGVFbGVtZW50LCBvYmopIHtcblx0XHR2YXIgY3NzID0gb2JqLmNzcztcblx0XHR2YXIgbWVkaWEgPSBvYmoubWVkaWE7XG5cdFx0dmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG5cdFxuXHRcdGlmIChtZWRpYSkge1xuXHRcdFx0c3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIG1lZGlhKTtcblx0XHR9XG5cdFxuXHRcdGlmIChzb3VyY2VNYXApIHtcblx0XHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZGV2dG9vbHMvZG9jcy9qYXZhc2NyaXB0LWRlYnVnZ2luZ1xuXHRcdFx0Ly8gdGhpcyBtYWtlcyBzb3VyY2UgbWFwcyBpbnNpZGUgc3R5bGUgdGFncyB3b3JrIHByb3Blcmx5IGluIENocm9tZVxuXHRcdFx0Y3NzICs9ICdcXG4vKiMgc291cmNlVVJMPScgKyBzb3VyY2VNYXAuc291cmNlc1swXSArICcgKi8nO1xuXHRcdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjY2MDM4NzVcblx0XHRcdGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpICsgXCIgKi9cIjtcblx0XHR9XG5cdFxuXHRcdGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuXHRcdFx0c3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0d2hpbGUoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcblx0XHRcdFx0c3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcblx0XHRcdH1cblx0XHRcdHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcblx0XHR9XG5cdH1cblxuXG4vKioqLyB9LFxuLyogODAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIERVUkFUSU9OID0gMDsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzbWlzc2FibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGR1cmF0aW9uOiB7IGRlZmF1bHQ6IERVUkFUSU9OIH0sXG5cdCAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuXHQgICAgd2lkdGg6IHsgdHlwZTogU3RyaW5nIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWw6IHRoaXMudmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGR1cmF0aW9uTnVtOiBmdW5jdGlvbiBkdXJhdGlvbk51bSgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UubnVtYmVyKHRoaXMuZHVyYXRpb24sIERVUkFUSU9OKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsKSB7XG5cdCAgICAgIGlmIChfdmFsICYmIHRoaXMuZHVyYXRpb25OdW0gPiAwKSB7XG5cdCAgICAgICAgdGhpcy5fZGVsYXlDbG9zZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5fZGVsYXlDbG9zZSA9ICgwLCBfdXRpbHMuZGVsYXllcikoZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLnZhbCA9IGZhbHNlO1xuXHQgICAgfSwgJ2R1cmF0aW9uTnVtJyk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogODEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImZhZGVcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIGNsYXNzOiBbJ2FsZXJ0JywgJ2FsZXJ0LScgKyBfdm0udHlwZSwgX3ZtLnBsYWNlbWVudF0sXG5cdCAgICBzdHlsZTogKHtcblx0ICAgICAgd2lkdGg6IF92bS53aWR0aFxuXHQgICAgfSksXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJhbGVydFwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmRpc21pc3NhYmxlKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJkaXNtaXNzYWJsZVwiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNsb3NlXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInR5cGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbCA9IGZhbHNlXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywgW192bS5fdihcIsOXXCIpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtYWY3YzFmNmFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA4MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg4Mylcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg2KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEFzaWRlLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0zYTRiZGUyN1wiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtM2E0YmRlMjdcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBBc2lkZS52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiA4MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oODQpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTNhNGJkZTI3IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Bc2lkZS52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTNhNGJkZTI3IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Bc2lkZS52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiA4NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYXNpZGUtb3BlbiB7XFxyXFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcztcXG59XFxuLmFzaWRlLW9wZW4uaGFzLXB1c2gtcmlnaHQge1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zMDBweCk7XFxufVxcbi5hc2lkZSB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICBib3R0b206IDA7XFxyXFxuICB6LWluZGV4OiAxMDQ5O1xcclxcbiAgb3ZlcmZsb3c6IGF1dG87XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcbn1cXG4uYXNpZGUubGVmdCB7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgcmlnaHQ6IGF1dG87XFxufVxcbi5hc2lkZS5yaWdodCB7XFxyXFxuICBsZWZ0OiBhdXRvO1xcclxcbiAgcmlnaHQ6IDA7XFxufVxcbi5zbGlkZWxlZnQtZW50ZXIge1xcclxcbiAgdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO1xcbn1cXG4uc2xpZGVsZWZ0LWVudGVyLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LWluIC4zcztcXG59XFxuLnNsaWRlbGVmdC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlbGVmdC1vdXQgLjNzO1xcbn1cXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1pbiB7XFxuMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG59XFxuQGtleWZyYW1lcyBzbGlkZWxlZnQtb3V0IHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbn1cXG4uc2xpZGVyaWdodC1lbnRlci1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtaW4gLjNzO1xcbn1cXG4uc2xpZGVyaWdodC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtb3V0IC4zcztcXG59XFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LWluIHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXG59XFxufVxcbkBrZXlmcmFtZXMgc2xpZGVyaWdodC1vdXQge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG59XFxuLmFzaWRlOmZvY3VzIHtcXHJcXG4gICAgb3V0bGluZTogMDtcXG59XFxuQG1lZGlhIChtYXgtd2lkdGg6IDk5MXB4KSB7XFxuLmFzaWRlIHtcXHJcXG4gICAgbWluLXdpZHRoOiAyNDBweDtcXG59XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIge1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XFxyXFxuICBtaW4taGVpZ2h0OiAxNi40M3B4O1xcclxcbiAgcGFkZGluZzogNnB4IDE1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjMzM3YWI3O1xcclxcbiAgY29sb3I6ICNmZmY7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIgLmNsb3NlIHtcXHJcXG4gIG1hcmdpbi1yaWdodDogLThweDtcXHJcXG4gIHBhZGRpbmc6IDRweCA4cHg7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG4gIGZvbnQtc2l6ZTogMjVweDtcXHJcXG4gIG9wYWNpdHk6IC44O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtYm9keSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nOiAxNXB4O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIHtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxyXFxuICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTVlNWU1O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWdyb3VwIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogLTFweDtcXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWJsb2NrKy5idG4tYmxvY2sge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDA7XFxufVxcbi5hc2lkZS1iYWNrZHJvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICB6LWluZGV4OiAxMDQwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2U7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwO1xcbn1cXG4uYXNpZGUtYmFja2Ryb3AuaW4ge1xcclxcbiAgb3BhY2l0eTogLjU7XFxyXFxuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0FzaWRlLnZ1ZT81NzM5NjIxZlwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBa0ZBO0VBQ0EsMkJBQUE7Q0FDQTtBQUNBO0VBQ0EsOEJBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7RUFDQSxPQUFBO0VBQ0EsVUFBQTtFQUNBLGNBQUE7RUFDQSxlQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBO0VBQ0EsUUFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7Q0FDQTtBQUNBO0VBQ0EsMkJBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSw2QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EseUJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EsNkJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7Q0FDQTtBQUNBO0VBQ0EsNkJBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSw0QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EseUJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EsNEJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLGlCQUFBO0NBQ0E7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7RUFDQSxvQkFBQTtFQUNBLGtCQUFBO0VBQ0Esb0JBQUE7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsaUJBQUE7RUFDQSxZQUFBO0VBQ0EsZ0JBQUE7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxjQUFBO0VBQ0Esa0JBQUE7RUFDQSw4QkFBQTtDQUNBO0FBQ0E7RUFDQSxpQkFBQTtFQUNBLGlCQUFBO0NBQ0E7QUFDQTtFQUNBLGtCQUFBO0NBQ0E7QUFDQTtFQUNBLGVBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFVBQUE7RUFDQSxRQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUFDQSw2QkFBQTtFQUNBLHVCQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7RUFDQSwwQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJBc2lkZS52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPHRyYW5zaXRpb24gOm5hbWU9XFxcIidzbGlkZScgKyBwbGFjZW1lbnRcXFwiPlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZVxcXCIgdi1pZj1cXFwic2hvd1xcXCIgOnN0eWxlPVxcXCJ7d2lkdGg6d2lkdGgrJ3B4J31cXFwiIDpjbGFzcz1cXFwicGxhY2VtZW50XFxcIj5cXHJcXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZS1kaWFsb2dcXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXNpZGUtY29udGVudFxcXCI+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlLWhlYWRlclxcXCI+XFxyXFxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPSd0cmlnZ2VyX2Nsb3NlJz48c3Bhbj4mdGltZXM7PC9zcGFuPjwvYnV0dG9uPlxcclxcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwiYXNpZGUtdGl0bGVcXFwiPjxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+e3sgaGVhZGVyIH19PC9zbG90PjwvaDQ+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZS1ib2R5XFxcIj48c2xvdD48L3Nsb3Q+PC9kaXY+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L3RyYW5zaXRpb24+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Z2V0U2Nyb2xsQmFyV2lkdGh9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBwbGFjZW1lbnQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdyaWdodCd9LFxcclxcbiAgICBzaG93OiB7dHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWV9LFxcclxcbiAgICB3aWR0aDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMzIwfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIHNob3cgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgICAgdGhpcy4kZW1pdCh0aGlzLnNob3cgPyAnb3BlbicgOiAnY2xvc2UnKVxcclxcbiAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5XFxyXFxuICAgICAgY29uc3Qgc2Nyb2xsQmFyV2lkdGggPSBnZXRTY3JvbGxCYXJXaWR0aCgpXFxyXFxuICAgICAgaWYgKHZhbCkge1xcclxcbiAgICAgICAgaWYgKCF0aGlzLl9iYWNrZHJvcCkge1xcclxcbiAgICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnXFxyXFxuICAgICAgICBib2R5LmFwcGVuZENoaWxkKHRoaXMuX2JhY2tkcm9wKVxcclxcbiAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJylcXHJcXG4gICAgICAgIGlmIChzY3JvbGxCYXJXaWR0aCAhPT0gMCkge1xcclxcbiAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoICsgJ3B4J1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxcclxcbiAgICAgICAgdmFyIHggPSB0aGlzLl9iYWNrZHJvcC5jbGllbnRIZWlnaHRcXHJcXG4gICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTGlzdC5hZGQoJ2luJylcXHJcXG4gICAgICAgICQodGhpcy5fYmFja2Ryb3ApLm9uKCdjbGljaycsICgpID0+IHRoaXMudHJpZ2dlcl9jbG9zZSgpKVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5vbigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcXHJcXG4gICAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkub2ZmKClcXHJcXG4gICAgICAgICAgdHJ5IHtcXHJcXG4gICAgICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKVxcclxcbiAgICAgICAgICAgIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJzAnXFxyXFxuICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZCh0aGlzLl9iYWNrZHJvcClcXHJcXG4gICAgICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IG51bGxcXHJcXG4gICAgICAgICAgfSBjYXRjaCAoZSkge31cXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnXFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICB0cmlnZ2VyICgpIHtcXHJcXG4gICAgICByZXR1cm4ge1xcclxcbiAgICAgICAgY2xvc2U6ICgpID0+IHRoaXMudHJpZ2dlcl9jbG9zZSgpLFxcclxcbiAgICAgICAgb3BlbjogKCkgPT4gdGhpcy50cmlnZ2VyX29wZW4oKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdHJpZ2dlcl9jbG9zZSAoKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCggJ2Nsb3NlJyApXFxyXFxuICAgIH0sXFxyXFxuICAgIHRyaWdnZXJfb3BlbigpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCAnb3BlbicgKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbW91bnRlZCAoKSB7XFxyXFxuICAgIHRoaXMuJGVtaXQoJ3RyaWdnZXInLCAoKSA9PiB0aGlzLnRyaWdnZXIpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uYXNpZGUtb3BlbiB7XFxyXFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcztcXHJcXG59XFxyXFxuLmFzaWRlLW9wZW4uaGFzLXB1c2gtcmlnaHQge1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zMDBweCk7XFxyXFxufVxcclxcbi5hc2lkZSB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICBib3R0b206IDA7XFxyXFxuICB6LWluZGV4OiAxMDQ5O1xcclxcbiAgb3ZlcmZsb3c6IGF1dG87XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbn1cXHJcXG4uYXNpZGUubGVmdCB7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgcmlnaHQ6IGF1dG87XFxyXFxufVxcclxcbi5hc2lkZS5yaWdodCB7XFxyXFxuICBsZWZ0OiBhdXRvO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxufVxcclxcbi5zbGlkZWxlZnQtZW50ZXIge1xcclxcbiAgdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO1xcclxcbn1cXHJcXG4uc2xpZGVsZWZ0LWVudGVyLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LWluIC4zcztcXHJcXG59XFxyXFxuLnNsaWRlbGVmdC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlbGVmdC1vdXQgLjNzO1xcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1pbiB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLnNsaWRlcmlnaHQtZW50ZXItYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZXJpZ2h0LWluIC4zcztcXHJcXG59XFxyXFxuLnNsaWRlcmlnaHQtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZXJpZ2h0LW91dCAuM3M7XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVyaWdodC1pbiB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVyaWdodC1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG4uYXNpZGU6Zm9jdXMge1xcclxcbiAgICBvdXRsaW5lOiAwO1xcclxcbn1cXHJcXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcXHJcXG4gIC5hc2lkZSB7XFxyXFxuICAgIG1pbi13aWR0aDogMjQwcHg7XFxyXFxuICB9XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIge1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XFxyXFxuICBtaW4taGVpZ2h0OiAxNi40M3B4O1xcclxcbiAgcGFkZGluZzogNnB4IDE1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjMzM3YWI3O1xcclxcbiAgY29sb3I6ICNmZmY7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIgLmNsb3NlIHtcXHJcXG4gIG1hcmdpbi1yaWdodDogLThweDtcXHJcXG4gIHBhZGRpbmc6IDRweCA4cHg7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG4gIGZvbnQtc2l6ZTogMjVweDtcXHJcXG4gIG9wYWNpdHk6IC44O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtYm9keSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nOiAxNXB4O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIHtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxyXFxuICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTVlNWU1O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMDtcXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWdyb3VwIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogLTFweDtcXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWJsb2NrKy5idG4tYmxvY2sge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDA7XFxyXFxufVxcclxcbi5hc2lkZS1iYWNrZHJvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICB6LWluZGV4OiAxMDQwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2U7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwO1xcclxcbn1cXHJcXG4uYXNpZGUtYmFja2Ryb3AuaW4ge1xcclxcbiAgb3BhY2l0eTogLjU7XFxyXFxuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogODUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBoZWFkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAncmlnaHQnIH0sXG5cdCAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH0sXG5cdCAgICB3aWR0aDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDMyMCB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyh2YWwsIG9sZCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KHRoaXMuc2hvdyA/ICdvcGVuJyA6ICdjbG9zZScpO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIHZhciBzY3JvbGxCYXJXaWR0aCA9ICgwLCBfdXRpbHMuZ2V0U2Nyb2xsQmFyV2lkdGgpKCk7XG5cdCAgICAgIGlmICh2YWwpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuX2JhY2tkcm9wKSB7XG5cdCAgICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnO1xuXHQgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fYmFja2Ryb3ApO1xuXHQgICAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpO1xuXHQgICAgICAgIGlmIChzY3JvbGxCYXJXaWR0aCAhPT0gMCkge1xuXHQgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBzY3JvbGxCYXJXaWR0aCArICdweCc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIHJlcXVlc3QgcHJvcGVydHkgdGhhdCByZXF1aXJlcyBsYXlvdXQgdG8gZm9yY2UgYSBsYXlvdXRcblx0ICAgICAgICB2YXIgeCA9IHRoaXMuX2JhY2tkcm9wLmNsaWVudEhlaWdodDtcblx0ICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc0xpc3QuYWRkKCdpbicpO1xuXHQgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRoaXMuX2JhY2tkcm9wKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICByZXR1cm4gX3RoaXMudHJpZ2dlcl9jbG9zZSgpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRoaXMuX2JhY2tkcm9wKS5vbigndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKF90aGlzLl9iYWNrZHJvcCkub2ZmKCk7XG5cdCAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTtcblx0ICAgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMCc7XG5cdCAgICAgICAgICAgIGJvZHkucmVtb3ZlQ2hpbGQoX3RoaXMuX2JhY2tkcm9wKTtcblx0ICAgICAgICAgICAgX3RoaXMuX2JhY2tkcm9wID0gbnVsbDtcblx0ICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lID0gJ2FzaWRlLWJhY2tkcm9wJztcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdHJpZ2dlcjogZnVuY3Rpb24gdHJpZ2dlcigpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpczIudHJpZ2dlcl9jbG9zZSgpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgb3BlbjogZnVuY3Rpb24gb3BlbigpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpczIudHJpZ2dlcl9vcGVuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgfSxcblx0ICAgIHRyaWdnZXJfY2xvc2U6IGZ1bmN0aW9uIHRyaWdnZXJfY2xvc2UoKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2Nsb3NlJyk7XG5cdCAgICB9LFxuXHQgICAgdHJpZ2dlcl9vcGVuOiBmdW5jdGlvbiB0cmlnZ2VyX29wZW4oKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ29wZW4nKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgICB0aGlzLiRlbWl0KCd0cmlnZ2VyJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gX3RoaXMzLnRyaWdnZXI7XG5cdCAgICB9KTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiA4NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6ICdzbGlkZScgKyBfdm0ucGxhY2VtZW50XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlXCIsXG5cdCAgICBjbGFzczogX3ZtLnBsYWNlbWVudCxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLndpZHRoICsgJ3B4J1xuXHQgICAgfSlcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJhc2lkZS1kaWFsb2dcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWhlYWRlclwiXG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udHJpZ2dlcl9jbG9zZVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCBbX3ZtLl92KFwiw5dcIildKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2g0Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtdGl0bGVcIlxuXHQgIH0sIFtfdm0uX3QoXCJoZWFkZXJcIiwgW192bS5fdihfdm0uX3MoX3ZtLmhlYWRlcikpXSldLCAyKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWJvZHlcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKV0pXSkgOiBfdm0uX2UoKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTNhNGJkZTI3XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogODcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODgpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODkpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQnV0dG9uR3JvdXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTEyNWViMGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0xMjVlYjBjOFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEJ1dHRvbkdyb3VwLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDg4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYnV0dG9uczogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBqdXN0aWZpZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZlcnRpY2FsOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICB0aGlzLl9idG5Hcm91cCA9IHRydWU7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWw6IHRoaXMudmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiA4OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczoge1xuXHQgICAgICAnYnRuLWdyb3VwJzogX3ZtLmJ1dHRvbnMsICdidG4tZ3JvdXAtanVzdGlmaWVkJzogX3ZtLmp1c3RpZmllZCwgJ2J0bi1ncm91cC12ZXJ0aWNhbCc6IF92bS52ZXJ0aWNhbFxuXHQgICAgfSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiZGF0YS10b2dnbGVcIjogX3ZtLmJ1dHRvbnMgJiYgJ2J1dHRvbnMnXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0xMjVlYjBjOFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDkwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDkxKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTMpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTQpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQ2Fyb3VzZWwudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRfX3Z1ZV9vcHRpb25zX18uX3Njb3BlSWQgPSBcImRhdGEtdi0zMjJkZWU0MVwiXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzIyZGVlNDFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTMyMmRlZTQxXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQ2Fyb3VzZWwudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogOTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0zMjJkZWU0MSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2Fyb3VzZWwudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0zMjJkZWU0MSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2Fyb3VzZWwudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogOTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmNhcm91c2VsLWNvbnRyb2xbZGF0YS12LTMyMmRlZTQxXSB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQ2Fyb3VzZWwudnVlPzJmNDQ2MzQyXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUE0R0E7RUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJDYXJvdXNlbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbjxkaXYgY2xhc3M9XFxcImNhcm91c2VsIHNsaWRlXFxcIiBkYXRhLXJpZGU9XFxcImNhcm91c2VsXFxcIj5cXHJcXG4gIDwhLS0gSW5kaWNhdG9ycyAtLT5cXHJcXG4gIDxvbCBjbGFzcz1cXFwiY2Fyb3VzZWwtaW5kaWNhdG9yc1xcXCIgdi1zaG93PVxcXCJpbmRpY2F0b3JzXFxcIj5cXHJcXG4gICAgPGxpIHYtZm9yPVxcXCIoaW5kaWNhdG9yLGkpIGluIGluZGljYXRvcl9saXN0XFxcIiBAY2xpY2s9XFxcImluZGljYXRvckNsaWNrKGkpXFxcIiA6Y2xhc3M9XFxcInthY3RpdmU6aSA9PT0gaW5kZXh9XFxcIj48c3Bhbj48L3NwYW4+PC9saT5cXHJcXG4gIDwvb2w+XFxyXFxuICA8IS0tIFdyYXBwZXIgZm9yIHNsaWRlcyAtLT5cXHJcXG4gIDxkaXYgY2xhc3M9XFxcImNhcm91c2VsLWlubmVyXFxcIiByb2xlPVxcXCJsaXN0Ym94XFxcIj5cXHJcXG4gICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgPC9kaXY+XFxyXFxuICA8IS0tIENvbnRyb2xzIC0tPlxcclxcbiAgPGRpdiB2LXNob3c9XFxcImNvbnRyb2xzXFxcIiBjbGFzcz1cXFwiY2Fyb3VzZWwtY29udHJvbHMgaGlkZGVuLXhzXFxcIj5cXHJcXG4gICAgPGEgY2xhc3M9XFxcImxlZnQgY2Fyb3VzZWwtY29udHJvbFxcXCIgcm9sZT1cXFwiYnV0dG9uXFxcIiBAY2xpY2s9XFxcInByZXZcXFwiPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tbGVmdFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvc3Bhbj5cXHJcXG4gICAgPC9hPlxcclxcbiAgICA8YSBjbGFzcz1cXFwicmlnaHQgY2Fyb3VzZWwtY29udHJvbFxcXCIgcm9sZT1cXFwiYnV0dG9uXFxcIiBAY2xpY2s9XFxcIm5leHRcXFwiPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tcmlnaHRcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgIDwvYT5cXHJcXG4gIDwvZGl2PlxcclxcbjwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xcclxcbi8vIGxldCBjb2VyY2UgPSB7XFxyXFxuLy8gICBpbnRlcnZhbDogJ251bWJlcidcXHJcXG4vLyB9XFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgaW5kaWNhdG9yczoge1xcclxcbiAgICAgIHR5cGU6IEJvb2xlYW4sXFxyXFxuICAgICAgZGVmYXVsdDogdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICBjb250cm9sczoge1xcclxcbiAgICAgIHR5cGU6IEJvb2xlYW4sXFxyXFxuICAgICAgZGVmYXVsdDogdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICBpbnRlcnZhbDoge1xcclxcbiAgICAgIHR5cGU6IE51bWJlcixcXHJcXG4gICAgICBkZWZhdWx0OiA1MDAwXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBpbmRpY2F0b3JfbGlzdDogW10sXFxyXFxuICAgICAgaW5kZXg6IDAsXFxyXFxuICAgICAgaXNBbmltYXRpbmc6IGZhbHNlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBpbmRleCAobmV3VmFsLCBvbGRWYWwpIHtcXHJcXG4gICAgICB0aGlzLnNsaWRlKG5ld1ZhbCA+IG9sZFZhbCA/ICdsZWZ0JyA6ICdyaWdodCcsIG5ld1ZhbCwgb2xkVmFsKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBpbmRpY2F0b3JDbGljayAoaW5kZXgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5pc0FuaW1hdGluZyB8fCB0aGlzLmluZGV4ID09PSBpbmRleCkgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmluZGV4ID0gaW5kZXhcXHJcXG4gICAgfSxcXHJcXG4gICAgc2xpZGUgKGRpcmVjdGlvbiwgbmV4dCwgcHJldikge1xcclxcbiAgICAgIGlmICghdGhpcy4kZWwpIHsgcmV0dXJuIH1cXHJcXG4gICAgICBjb25zdCAkc2xpZGVyID0gJCgnLml0ZW0nLCB0aGlzLiRlbClcXHJcXG4gICAgICBpZiAoISRzbGlkZXIubGVuZ3RoKSB7IHJldHVybiB9XFxyXFxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSAkc2xpZGVyW25leHRdIHx8ICRzbGlkZXJbMF1cXHJcXG4gICAgICAkKHNlbGVjdGVkKS5hZGRDbGFzcyhkaXJlY3Rpb24gPT09ICdsZWZ0JyA/ICduZXh0JyA6ICdwcmV2JylcXHJcXG4gICAgICAvLyByZXF1ZXN0IHByb3BlcnR5IHRoYXQgcmVxdWlyZXMgbGF5b3V0IHRvIGZvcmNlIGEgbGF5b3V0XFxyXFxuICAgICAgdmFyIHggPSBzZWxlY3RlZC5jbGllbnRIZWlnaHRcXHJcXG4gICAgICAkKFskc2xpZGVyW3ByZXZdLCBzZWxlY3RlZF0pLmFkZENsYXNzKGRpcmVjdGlvbikub24oJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB7XFxyXFxuICAgICAgICAkc2xpZGVyLm9mZigndHJhbnNpdGlvbmVuZCcpLmNsYXNzTmFtZSA9ICdpdGVtJ1xcclxcbiAgICAgICAgJChzZWxlY3RlZCkuYWRkQ2xhc3MoJ2FjdGl2ZScpXFxyXFxuICAgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2VcXHJcXG4gICAgICB9KVxcclxcbiAgICB9LFxcclxcbiAgICBuZXh0ICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuJGVsIHx8IHRoaXMuaXNBbmltYXRpbmcpIHsgcmV0dXJuIGZhbHNlIH1cXHJcXG4gICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZVxcclxcbiAgICAgIHRoaXMuaW5kZXggKyAxIDwgJCgnLml0ZW0nLCB0aGlzLiRlbCkubGVuZ3RoID8gdGhpcy5pbmRleCArPSAxIDogdGhpcy5pbmRleCA9IDBcXHJcXG4gICAgfSxcXHJcXG4gICAgcHJldiAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmluZGV4ID09PSAwID8gdGhpcy5pbmRleCA9ICQoJy5pdGVtJywgdGhpcy4kZWwpLmxlbmd0aCAtIDEgOiB0aGlzLmluZGV4IC09IDFcXHJcXG4gICAgfSxcXHJcXG4gICAgdG9nZ2xlSW50ZXJ2YWwgKHZhbCkge1xcclxcbiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgeyB2YWwgPSB0aGlzLl9pbnRlcnZhbElEIH1cXHJcXG4gICAgICBpZih0aGlzLl9pbnRlcnZhbElEKSB7XFxyXFxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsSUQpXFxyXFxuICAgICAgICBkZWxldGUgdGhpcy5faW50ZXJ2YWxJRFxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZih2YWwgJiYgdGhpcy5pbnRlcnZhbCA+IDApIHtcXHJcXG4gICAgICAgIHRoaXMuX2ludGVydmFsSUQgPSBzZXRJbnRlcnZhbCh0aGlzLm5leHQsIHRoaXMuaW50ZXJ2YWwpXFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbW91bnRlZCAoKSB7XFxyXFxuICAgIHRoaXMudG9nZ2xlSW50ZXJ2YWwodHJ1ZSlcXHJcXG4gICAgJCh0aGlzLiRlbCkub24oJ21vdXNlZW50ZXInLCAoKSA9PiB0aGlzLnRvZ2dsZUludGVydmFsKGZhbHNlKSkub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB0aGlzLnRvZ2dsZUludGVydmFsKHRydWUpKVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICB0aGlzLnRvZ2dsZUludGVydmFsKGZhbHNlKVxcclxcbiAgICAkKHRoaXMuJGVsKS5vZmYoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZSBzY29wZWQ+XFxyXFxuLmNhcm91c2VsLWNvbnRyb2wge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogOTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvLyBsZXQgY29lcmNlID0ge1xuXHQvLyAgIGludGVydmFsOiAnbnVtYmVyJ1xuXHQvLyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGluZGljYXRvcnM6IHtcblx0ICAgICAgdHlwZTogQm9vbGVhbixcblx0ICAgICAgZGVmYXVsdDogdHJ1ZVxuXHQgICAgfSxcblx0ICAgIGNvbnRyb2xzOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IHRydWVcblx0ICAgIH0sXG5cdCAgICBpbnRlcnZhbDoge1xuXHQgICAgICB0eXBlOiBOdW1iZXIsXG5cdCAgICAgIGRlZmF1bHQ6IDUwMDBcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBpbmRpY2F0b3JfbGlzdDogW10sXG5cdCAgICAgIGluZGV4OiAwLFxuXHQgICAgICBpc0FuaW1hdGluZzogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleChuZXdWYWwsIG9sZFZhbCkge1xuXHQgICAgICB0aGlzLnNsaWRlKG5ld1ZhbCA+IG9sZFZhbCA/ICdsZWZ0JyA6ICdyaWdodCcsIG5ld1ZhbCwgb2xkVmFsKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGluZGljYXRvckNsaWNrOiBmdW5jdGlvbiBpbmRpY2F0b3JDbGljayhpbmRleCkge1xuXHQgICAgICBpZiAodGhpcy5pc0FuaW1hdGluZyB8fCB0aGlzLmluZGV4ID09PSBpbmRleCkgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuXHQgICAgfSxcblx0ICAgIHNsaWRlOiBmdW5jdGlvbiBzbGlkZShkaXJlY3Rpb24sIG5leHQsIHByZXYpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIGlmICghdGhpcy4kZWwpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdmFyICRzbGlkZXIgPSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnLml0ZW0nLCB0aGlzLiRlbCk7XG5cdCAgICAgIGlmICghJHNsaWRlci5sZW5ndGgpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIHNlbGVjdGVkID0gJHNsaWRlcltuZXh0XSB8fCAkc2xpZGVyWzBdO1xuXHQgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KShzZWxlY3RlZCkuYWRkQ2xhc3MoZGlyZWN0aW9uID09PSAnbGVmdCcgPyAnbmV4dCcgOiAncHJldicpO1xuXHQgICAgICAvLyByZXF1ZXN0IHByb3BlcnR5IHRoYXQgcmVxdWlyZXMgbGF5b3V0IHRvIGZvcmNlIGEgbGF5b3V0XG5cdCAgICAgIHZhciB4ID0gc2VsZWN0ZWQuY2xpZW50SGVpZ2h0O1xuXHQgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KShbJHNsaWRlcltwcmV2XSwgc2VsZWN0ZWRdKS5hZGRDbGFzcyhkaXJlY3Rpb24pLm9uKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICRzbGlkZXIub2ZmKCd0cmFuc2l0aW9uZW5kJykuY2xhc3NOYW1lID0gJ2l0ZW0nO1xuXHQgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHNlbGVjdGVkKS5hZGRDbGFzcygnYWN0aXZlJyk7XG5cdCAgICAgICAgX3RoaXMuaXNBbmltYXRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSk7XG5cdCAgICB9LFxuXHQgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcblx0ICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLmluZGV4ICsgMSA8ICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCcuaXRlbScsIHRoaXMuJGVsKS5sZW5ndGggPyB0aGlzLmluZGV4ICs9IDEgOiB0aGlzLmluZGV4ID0gMDtcblx0ICAgIH0sXG5cdCAgICBwcmV2OiBmdW5jdGlvbiBwcmV2KCkge1xuXHQgICAgICBpZiAoIXRoaXMuJGVsIHx8IHRoaXMuaXNBbmltYXRpbmcpIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7XG5cdCAgICAgIHRoaXMuaW5kZXggPT09IDAgPyB0aGlzLmluZGV4ID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5pdGVtJywgdGhpcy4kZWwpLmxlbmd0aCAtIDEgOiB0aGlzLmluZGV4IC09IDE7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlSW50ZXJ2YWw6IGZ1bmN0aW9uIHRvZ2dsZUludGVydmFsKHZhbCkge1xuXHQgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICB2YWwgPSB0aGlzLl9pbnRlcnZhbElEO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9pbnRlcnZhbElEKSB7XG5cdCAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbElEKTtcblx0ICAgICAgICBkZWxldGUgdGhpcy5faW50ZXJ2YWxJRDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodmFsICYmIHRoaXMuaW50ZXJ2YWwgPiAwKSB7XG5cdCAgICAgICAgdGhpcy5faW50ZXJ2YWxJRCA9IHNldEludGVydmFsKHRoaXMubmV4dCwgdGhpcy5pbnRlcnZhbCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICB0aGlzLnRvZ2dsZUludGVydmFsKHRydWUpO1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy4kZWwpLm9uKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gX3RoaXMyLnRvZ2dsZUludGVydmFsKGZhbHNlKTtcblx0ICAgIH0pLm9uKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gX3RoaXMyLnRvZ2dsZUludGVydmFsKHRydWUpO1xuXHQgICAgfSk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgdGhpcy50b2dnbGVJbnRlcnZhbChmYWxzZSk7XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLiRlbCkub2ZmKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnKTtcblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiA5NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbCBzbGlkZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJkYXRhLXJpZGVcIjogXCJjYXJvdXNlbFwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnb2wnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uaW5kaWNhdG9ycyksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiaW5kaWNhdG9yc1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNhcm91c2VsLWluZGljYXRvcnNcIlxuXHQgIH0sIF92bS5fbCgoX3ZtLmluZGljYXRvcl9saXN0KSwgZnVuY3Rpb24oaW5kaWNhdG9yLCBpKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICBhY3RpdmU6IGkgPT09IF92bS5pbmRleFxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICBfdm0uaW5kaWNhdG9yQ2xpY2soaSlcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX2MoJ3NwYW4nKV0pXG5cdCAgfSkpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNhcm91c2VsLWlubmVyXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJsaXN0Ym94XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jb250cm9scyksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY29udHJvbHNcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbC1jb250cm9scyBoaWRkZW4teHNcIlxuXHQgIH0sIFtfdm0uX2MoJ2EnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJsZWZ0IGNhcm91c2VsLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0ucHJldlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tbGVmdFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfVxuXHQgIH0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnYScsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInJpZ2h0IGNhcm91c2VsLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0ubmV4dFxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tcmlnaHRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KV0pXSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0zMjJkZWU0MVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDk1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDk2KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTgpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTkpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQ2hlY2tib3gudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRfX3Z1ZV9vcHRpb25zX18uX3Njb3BlSWQgPSBcImRhdGEtdi02OTIyYmYyNFwiXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNjkyMmJmMjRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTY5MjJiZjI0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQ2hlY2tib3gudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogOTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3KTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02OTIyYmYyNCZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2hlY2tib3gudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02OTIyYmYyNCZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2hlY2tib3gudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogOTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxubGFiZWwuY2hlY2tib3hbZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDE4cHg7XFxufVxcbmxhYmVsLmNoZWNrYm94ID4gaW5wdXRbZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgei1pbmRleDogLTE7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIG1hcmdpbjogMDtcXG59XFxubGFiZWwuY2hlY2tib3ggPiAuaWNvbltkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogLjJyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICBsaW5lLWhlaWdodDoxcmVtO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBib3JkZXItcmFkaXVzOiAuMzVyZW07XFxyXFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTtcXG59XFxubGFiZWwuY2hlY2tib3g6bm90KC5hY3RpdmUpID4gLmljb25bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2JiYjtcXG59XFxubGFiZWwuY2hlY2tib3ggPiBpbnB1dDpmb2N1cyB+IC5pY29uW2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcbn1cXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgPiAuaWNvbltkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogMXJlbSAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqeHpkbWNnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUIzYVdSMGFEMGlOeUlnYUdWcFoyaDBQU0kzSWo0OGNHRjBhQ0JtYVd4c1BTSWpabVptSWlCa1BTSnROUzQzTXl3d0xqVXliQzB6TGpFeU5ESXlMRE11TXpReE5qRnNMVEV1TXpNNE9UVXNMVEV1TkRNeU1USnNMVEV1TWpRNU5qa3NNUzR6TXpZMk5Xd3lMalU0T0RZekxESXVOelk0Tnpac05DNHpOek01TEMwMExqWTNPREkyYkMweExqSTBPVFk1TEMweExqTXpOalkxYkRBc01Hd3dMakF3TURBeUxEQXVNREF3TURGNklpOCtQQzl6ZG1jKyk7XFxufVxcbmxhYmVsLmNoZWNrYm94LmFjdGl2ZSAuYnRuLWRlZmF1bHRbZGF0YS12LTY5MjJiZjI0XSB7IGZpbHRlcjogYnJpZ2h0bmVzcyg3NSUpO1xcbn1cXG5sYWJlbC5jaGVja2JveC5kaXNhYmxlZFtkYXRhLXYtNjkyMmJmMjRdLFxcclxcbmxhYmVsLmNoZWNrYm94LnJlYWRvbmx5W2RhdGEtdi02OTIyYmYyNF0sXFxyXFxuLmJ0bi5yZWFkb25seVtkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcbn1cXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPWNoZWNrYm94XVtkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9DaGVja2JveC52dWU/MWMwNDQxMGJcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQXlGQTtFQUNBLG1CQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtFQUNBLFlBQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTtFQUNBLFVBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsUUFBQTtFQUNBLGVBQUE7RUFDQSxjQUFBO0VBQ0EsZUFBQTtFQUNBLGlCQUFBO0VBQ0EsbUJBQUE7RUFDQSxrQkFBQTtFQUNBLHNCQUFBO0VBQ0EsNkJBQUE7RUFDQSxtQ0FBQTtFQUNBLHlCQUFBO0NBQ0E7QUFDQTtFQUNBLHVCQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtFQUNBLDBCQUFBO0VBQ0EsMEVBQUE7Q0FDQTtBQUNBO0VBQ0EsMkJBQUE7RUFDQSxrWkFBQTtDQUNBO0FBQ0Esc0RBQUEsd0JBQUE7Q0FBQTtBQUVBOzs7RUFHQSwwQkFBQTtFQUNBLGlCQUFBO0VBQ0EsYUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2hlY2tib3gudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxhIDppcz1cXFwiaXNCdXR0b24/J2EnOidsYWJlbCdcXFwiIEBjbGljaz1cXFwidG9nZ2xlXFxcIiA6Y2xhc3M9XFxcIltpc0J1dHRvbj8nYnRuIGJ0bi0nK3R5cGVDb2xvcjonb3BlbiBjaGVja2JveCAnK3R5cGVDb2xvcix7YWN0aXZlOmNoZWNrZWQsZGlzYWJsZWQ6ZGlzYWJsZWQscmVhZG9ubHk6cmVhZG9ubHl9XVxcXCI+XFxyXFxuICAgIDxpbnB1dCB2LWlmPVxcXCJuYW1lXFxcIiB0eXBlPVxcXCJoaWRkZW5cXFwiIDpuYW1lPVxcXCJuYW1lXFxcIiA6dmFsdWU9XFxcImNoZWNrZWQ/dHJ1ZVZhbHVlOmZhbHNlVmFsdWVcXFwiIC8+XFxyXFxuICAgIDxzcGFuIHYtaWY9XFxcIiFpc0J1dHRvblxcXCIgY2xhc3M9XFxcImljb24gZHJvcGRvd24tdG9nZ2xlXFxcIiA6Y2xhc3M9XFxcIltjaGVja2VkPydidG4tJyt0eXBlQ29sb3I6Jycse2JnOnR5cGVDb2xvcj09PSdkZWZhdWx0J31dXFxcIj48L3NwYW4+XFxyXFxuICAgIDxzcGFuIHYtaWY9XFxcIiFpc0J1dHRvbiYmY2hlY2tlZCYmdHlwZUNvbG9yPT09J2RlZmF1bHQnXFxcIiBjbGFzcz1cXFwiaWNvblxcXCI+PC9zcGFuPlxcclxcbiAgICA8c2xvdD48L3Nsb3Q+XFxyXFxuICA8L2E+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZGlzYWJsZWQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGZhbHNlVmFsdWU6IHtkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIG5hbWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgdHJ1ZVZhbHVlOiB7ZGVmYXVsdDogdHJ1ZX0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGNoZWNrZWQ6ICh0aGlzLnZhbHVlID09PSB0aGlzLnRydWVWYWx1ZSlcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGlzQnV0dG9uICgpIHsgcmV0dXJuIHRoaXMuYnV0dG9uIHx8ICh0aGlzLl9pbkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zKSB9LFxcclxcbiAgICBpc0ZhbHNlICgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPT09IHRoaXMuZmFsc2VWYWx1ZSB9LFxcclxcbiAgICBpc1RydWUgKCkgeyByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWUgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKCkgeyByZXR1cm4gdGhpcy5faW5ncm91cCAmJiB0aGlzLiRwYXJlbnQudmFsIH0sXFxyXFxuICAgIHR5cGVDb2xvciAoKSB7IHJldHVybiAodGhpcy50eXBlIHx8ICh0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUpKSB8fCAnZGVmYXVsdCcgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIGNoZWNrZWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdmFyIHZhbHVlID0gdmFsID8gdGhpcy50cnVlVmFsdWUgOiB0aGlzLmZhbHNlVmFsdWVcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdjaGVja2VkJywgdmFsKVxcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpXFxyXFxuICAgICAgdGhpcy5ldmFsKClcXHJcXG4gICAgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWRcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWRcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9idG5Hcm91cCAmJiAhcGFyZW50Ll9yYWRpb0dyb3VwKSB7XFxyXFxuICAgICAgdGhpcy5faW5Hcm91cCA9IHRydWVcXHJcXG4gICAgICBwYXJlbnQuX2NoZWNrYm94R3JvdXAgPSB0cnVlXFxyXFxuICAgICAgaWYgKCEocGFyZW50LnZhbCBpbnN0YW5jZW9mIEFycmF5KSkgeyBwYXJlbnQudmFsID0gW10gfVxcclxcbiAgICAgIHRoaXMuZXZhbCgpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgaWYgKCF0aGlzLiRwYXJlbnQuX2NoZWNrYm94R3JvdXAgfHwgdHlwZW9mIHRoaXMudmFsdWUgPT09ICdib29sZWFuJykgeyByZXR1cm4gfVxcclxcbiAgICBpZiAodGhpcy4kcGFyZW50LnZhbC5sZW5ndGgpIHtcXHJcXG4gICAgICAvLyB0aGlzLmNoZWNrZWQgPSB+dGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudmFsdWUpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnY2hlY2tlZCcsIH50aGlzLiRwYXJlbnQudmFsLmluZGV4T2YodGhpcy52YWx1ZSkpXFxyXFxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2VkKSB7XFxyXFxuICAgICAgdGhpcy4kcGFyZW50LnZhbC5wdXNoKHRoaXMudmFsdWUpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIGV2YWwgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLl9pbkdyb3VwKSB7XFxyXFxuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmNoZWNrZWQgPyB0aGlzLmlzVHJ1ZSA6IHRoaXMuaXNGYWxzZVxcclxcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHZhbHVlKVxcclxcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tlZCAmJiAhfmluZGV4KSB0aGlzLiRwYXJlbnQudmFsLnB1c2godmFsdWUpXFxyXFxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tlZCAmJiB+aW5kZXgpIHRoaXMuJHBhcmVudC52YWwuc3BsaWNlKGluZGV4LCAxKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdG9nZ2xlICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7IHJldHVybiB9XFxyXFxuICAgICAgdGhpcy5jaGVja2VkID0gIXRoaXMuY2hlY2tlZFxcclxcbiAgICB9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZSBzY29wZWQ+XFxyXFxubGFiZWwuY2hlY2tib3gge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAxOHB4O1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveCA+IGlucHV0IHtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB6LWluZGV4OiAtMTtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveCA+IC5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogLjJyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICBsaW5lLWhlaWdodDoxcmVtO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBib3JkZXItcmFkaXVzOiAuMzVyZW07XFxyXFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTtcXHJcXG59XFxyXFxubGFiZWwuY2hlY2tib3g6bm90KC5hY3RpdmUpID4gLmljb24ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94ID4gaW5wdXQ6Zm9jdXMgfiAuaWNvbiB7XFxyXFxuICBvdXRsaW5lOiAwO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgIzY2YWZlOTtcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94LmFjdGl2ZSA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogMXJlbSAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqeHpkbWNnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUIzYVdSMGFEMGlOeUlnYUdWcFoyaDBQU0kzSWo0OGNHRjBhQ0JtYVd4c1BTSWpabVptSWlCa1BTSnROUzQzTXl3d0xqVXliQzB6TGpFeU5ESXlMRE11TXpReE5qRnNMVEV1TXpNNE9UVXNMVEV1TkRNeU1USnNMVEV1TWpRNU5qa3NNUzR6TXpZMk5Xd3lMalU0T0RZekxESXVOelk0Tnpac05DNHpOek01TEMwMExqWTNPREkyYkMweExqSTBPVFk1TEMweExqTXpOalkxYkRBc01Hd3dMakF3TURBeUxEQXVNREF3TURGNklpOCtQQzl6ZG1jKyk7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94LmFjdGl2ZSAuYnRuLWRlZmF1bHQgeyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTsgfVxcclxcblxcclxcbmxhYmVsLmNoZWNrYm94LmRpc2FibGVkLFxcclxcbmxhYmVsLmNoZWNrYm94LnJlYWRvbmx5LFxcclxcbi5idG4ucmVhZG9ubHkge1xcclxcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1KTtcXHJcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICBvcGFjaXR5OiAuNjU7XFxyXFxufVxcclxcbmxhYmVsLmJ0biA+IGlucHV0W3R5cGU9Y2hlY2tib3hdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDk4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZmFsc2VWYWx1ZTogeyBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICB0cnVlVmFsdWU6IHsgZGVmYXVsdDogdHJ1ZSB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjaGVja2VkOiB0aGlzLnZhbHVlID09PSB0aGlzLnRydWVWYWx1ZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgaXNCdXR0b246IGZ1bmN0aW9uIGlzQnV0dG9uKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idXR0b24gfHwgdGhpcy5faW5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucztcblx0ICAgIH0sXG5cdCAgICBpc0ZhbHNlOiBmdW5jdGlvbiBpc0ZhbHNlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy5mYWxzZVZhbHVlO1xuXHQgICAgfSxcblx0ICAgIGlzVHJ1ZTogZnVuY3Rpb24gaXNUcnVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWU7XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5faW5ncm91cCAmJiB0aGlzLiRwYXJlbnQudmFsO1xuXHQgICAgfSxcblx0ICAgIHR5cGVDb2xvcjogZnVuY3Rpb24gdHlwZUNvbG9yKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50eXBlIHx8IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSB8fCAnZGVmYXVsdCc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgY2hlY2tlZDogZnVuY3Rpb24gY2hlY2tlZCh2YWwsIG9sZCkge1xuXHQgICAgICB2YXIgdmFsdWUgPSB2YWwgPyB0aGlzLnRydWVWYWx1ZSA6IHRoaXMuZmFsc2VWYWx1ZTtcblx0ICAgICAgdGhpcy4kZW1pdCgnY2hlY2tlZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpO1xuXHQgICAgICB0aGlzLmV2YWwoKTtcblx0ICAgIH0sXG5cdCAgICBwYXJlbnRWYWx1ZTogZnVuY3Rpb24gcGFyZW50VmFsdWUodmFsKSB7XG5cdCAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZTtcblx0ICAgICAgaWYgKHRoaXMuY2hlY2tlZCAhPT0gY2hlY2tlZCkge1xuXHQgICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWQ7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIGNoZWNrZWQgPSB2YWwgPT09IHRoaXMudHJ1ZVZhbHVlO1xuXHQgICAgICBpZiAodGhpcy5jaGVja2VkICE9PSBjaGVja2VkKSB7XG5cdCAgICAgICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fYnRuR3JvdXAgJiYgIXBhcmVudC5fcmFkaW9Hcm91cCkge1xuXHQgICAgICB0aGlzLl9pbkdyb3VwID0gdHJ1ZTtcblx0ICAgICAgcGFyZW50Ll9jaGVja2JveEdyb3VwID0gdHJ1ZTtcblx0ICAgICAgaWYgKCEocGFyZW50LnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xuXHQgICAgICAgIHBhcmVudC52YWwgPSBbXTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmV2YWwoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICBpZiAoIXRoaXMuJHBhcmVudC5fY2hlY2tib3hHcm91cCB8fCB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLiRwYXJlbnQudmFsLmxlbmd0aCkge1xuXHQgICAgICAvLyB0aGlzLmNoZWNrZWQgPSB+dGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudmFsdWUpXG5cdCAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB+dGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudmFsdWUpKTtcblx0ICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2VkKSB7XG5cdCAgICAgIHRoaXMuJHBhcmVudC52YWwucHVzaCh0aGlzLnZhbHVlKTtcblx0ICAgIH1cblx0ICB9LFxuXHRcblx0ICBtZXRob2RzOiB7XG5cdCAgICBldmFsOiBmdW5jdGlvbiBfZXZhbCgpIHtcblx0ICAgICAgaWYgKHRoaXMuX2luR3JvdXApIHtcblx0ICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmNoZWNrZWQgPyB0aGlzLmlzVHJ1ZSA6IHRoaXMuaXNGYWxzZTtcblx0ICAgICAgICB2YXIgaW5kZXggPSB0aGlzLiRwYXJlbnQudmFsLmluZGV4T2YodmFsdWUpO1xuXHQgICAgICAgIGlmICh0aGlzLmNoZWNrZWQgJiYgIX5pbmRleCkgdGhpcy4kcGFyZW50LnZhbC5wdXNoKHZhbHVlKTtcblx0ICAgICAgICBpZiAoIXRoaXMuY2hlY2tlZCAmJiB+aW5kZXgpIHRoaXMuJHBhcmVudC52YWwuc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogOTkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYyhfdm0uaXNCdXR0b24gPyAnYScgOiAnbGFiZWwnLCB7XG5cdCAgICB0YWc6IFwiYVwiLFxuXHQgICAgY2xhc3M6IFtfdm0uaXNCdXR0b24gPyAnYnRuIGJ0bi0nICsgX3ZtLnR5cGVDb2xvciA6ICdvcGVuIGNoZWNrYm94ICcgKyBfdm0udHlwZUNvbG9yLCB7XG5cdCAgICAgIGFjdGl2ZTogX3ZtLmNoZWNrZWQsXG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHlcblx0ICAgIH1dLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlXG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ubmFtZSkgPyBfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiaGlkZGVuXCIsXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZVxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLmNoZWNrZWQgPyBfdm0udHJ1ZVZhbHVlIDogX3ZtLmZhbHNlVmFsdWVcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoIV92bS5pc0J1dHRvbikgPyBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVwiLFxuXHQgICAgY2xhc3M6IFtfdm0uY2hlY2tlZCA/ICdidG4tJyArIF92bS50eXBlQ29sb3IgOiAnJywge1xuXHQgICAgICBiZzogX3ZtLnR5cGVDb2xvciA9PT0gJ2RlZmF1bHQnXG5cdCAgICB9XVxuXHQgIH0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksICghX3ZtLmlzQnV0dG9uICYmIF92bS5jaGVja2VkICYmIF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0JykgPyBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uXCJcblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNjkyMmJmMjRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTAxKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTAzKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxEYXRlcGlja2VyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi00NzdiOGU1ZFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNDc3YjhlNWRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBEYXRlcGlja2VyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEwMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTAyKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi00NzdiOGU1ZCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vRGF0ZXBpY2tlci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQ3N2I4ZTVkIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9EYXRlcGlja2VyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEwMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZGF0ZXBpY2tlciB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbmlucHV0LmRhdGVwaWNrZXItaW5wdXQud2l0aC1yZXNldC1idXR0b24ge1xcclxcbiAgcGFkZGluZy1yaWdodDogMjVweDtcXG59XFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2U6Zm9jdXMge1xcclxcbiAgb3BhY2l0eTogLjI7XFxufVxcbi5kYXRlcGlja2VyLXBvcHVwIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgbWFyZ2luLXRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwMDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLDAsMCwwLjE3NSk7XFxufVxcbi5kYXRlcGlja2VyLWlubmVyIHtcXHJcXG4gIHdpZHRoOiAyMThweDtcXG59XFxuLmRhdGVwaWNrZXItYm9keSB7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHg7XFxufVxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHdpZHRoOiAyOHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI4cHg7XFxyXFxuICBoZWlnaHQ6IDI4cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcbi5kYXRlcGlja2VyLWN0cmwgcCB7XFxyXFxuICB3aWR0aDogNjUlO1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbn1cXG4uZGF0ZXBpY2tlci1ib2R5IHNwYW4ge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4ge1xcclxcbiAgd2lkdGg6IDQ4cHg7XFxyXFxuICBoZWlnaHQ6IDUwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogNDVweDtcXG59XFxuLmRhdGVwaWNrZXItaXRlbS1kaXNhYmxlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG4gIGN1cnNvcjogbm90LWFsbG93ZWQhaW1wb3J0YW50O1xcbn1cXG4uZGVjYWRlUmFuZ2Ugc3BhbjpmaXJzdC1jaGlsZCxcXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpsYXN0LWNoaWxkLFxcclxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWdyYXkge1xcclxcbiAgY29sb3I6ICM5OTk7XFxufVxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZTpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUge1xcclxcbiAgYmFja2dyb3VuZDogcmdiKDUwLCAxMTgsIDE3NykhaW1wb3J0YW50O1xcclxcbiAgY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXG59XFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAxMHB4XFxufVxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3BhbixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBwLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcDpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIGk6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlIHNwYW46aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0taG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvciA6ICNlZWVlZWU7XFxufVxcbi5kYXRlcGlja2VyLXdlZWtSYW5nZSBzcGFuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG4uZGF0ZXBpY2tlci1sYWJlbCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXHJcXG4gIHBhZGRpbmc6IDdweCAwO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGhlaWdodDogMzBweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5tb250aC1idG4ge1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbW96LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbXMtdXNlci1zZWxlY3Q6bm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0Om5vbmU7XFxufVxcbi5kYXRlcGlja2VyLXByZUJ0biB7XFxyXFxuICBsZWZ0OiAycHg7XFxufVxcbi5kYXRlcGlja2VyLW5leHRCdG4ge1xcclxcbiAgcmlnaHQ6IDJweDtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9EYXRlcGlja2VyLnZ1ZT8yMjAwZTRjYVwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBc1ZBO0VBQ0EsbUJBQUE7RUFDQSxzQkFBQTtDQUNBO0FBQ0E7RUFDQSxvQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLG1CQUFBO0VBQ0EsaUJBQUE7RUFDQSxnQkFBQTtFQUNBLGNBQUE7RUFDQSx5Q0FBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTs7O0VBR0Esc0JBQUE7RUFDQSxZQUFBO0VBQ0Esa0JBQUE7RUFDQSxhQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGtCQUFBO0NBQ0E7QUFDQTtFQUNBLGtDQUFBO0VBQ0EsOEJBQUE7Q0FDQTtBQUNBOzs7O0VBSUEsWUFBQTtDQUNBO0FBRUE7O0VBRUEsd0NBQUE7RUFDQSx1QkFBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtDQUNBO0FBQ0E7Ozs7RUFJQSxnQkFBQTtDQUNBO0FBQ0E7Ozs7O0VBS0EsMkJBQUE7Q0FDQTtBQUNBO0VBQ0Esa0JBQUE7Q0FDQTtBQUNBO0VBQ0EsMEJBQUE7RUFDQSxpQkFBQTtFQUNBLGVBQUE7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0Esa0JBQUE7RUFDQSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0EscUJBQUE7RUFDQSxpQkFBQTtDQUNBO0FBQ0E7RUFDQSxVQUFBO0NBQ0E7QUFDQTtFQUNBLFdBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiRGF0ZXBpY2tlci52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlclxcXCI+XFxyXFxuICAgIDxpbnB1dCBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGRhdGVwaWNrZXItaW5wdXRcXFwiIDpjbGFzcz1cXFwieyd3aXRoLXJlc2V0LWJ1dHRvbic6IGNsZWFyQnV0dG9ufVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgOnBsYWNlaG9sZGVyPVxcXCJwbGFjZWhvbGRlclxcXCJcXHJcXG4gICAgICAgIDpzdHlsZT1cXFwie3dpZHRoOndpZHRofVxcXCJcXHJcXG4gICAgICAgIDp2YWx1ZT1cXFwidmFsdWVcXFwiXFxyXFxuICAgICAgICBAY2xpY2s9XFxcImlucHV0Q2xpY2tcXFwiXFxyXFxuICAgICAgICBAaW5wdXQ9XFxcIiRlbWl0KCdpbnB1dCcsJGV2ZW50LnRhcmdldC52YWx1ZSlcXFwiIC8+XFxyXFxuICAgIDxidXR0b24gdi1pZj1cXFwiY2xlYXJCdXR0b24gJiYgdmFsdWVcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcIiRlbWl0KCdpbnB1dCcsICcnKVxcXCI+XFxyXFxuICAgICAgPHNwYW4+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgPC9idXR0b24+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItcG9wdXBcXFwiIHYtc2hvdz1cXFwiZGlzcGxheURheVZpZXdcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItaW5uZXJcXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1ib2R5XFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1jdHJsXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcInByZUJ0bkNsYXNzZXNcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIiBAY2xpY2s9XFxcInByZU5leHRNb250aENsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dE1vbnRoQ2xpY2soMSlcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICA8cCBAY2xpY2s9XFxcInN3aXRjaE1vbnRoVmlld1xcXCI+e3tzdHJpbmdpZnlEYXlIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXdlZWtSYW5nZVxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gdi1mb3I9XFxcIncgaW4gdGV4dC5kYXlzT2ZXZWVrXFxcIj57e3d9fTwvc3Bhbj5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItZGF0ZVJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiB2LWZvcj1cXFwiZCBpbiBkYXRlUmFuZ2VcXFwiIDpjbGFzcz1cXFwiZC5zY2xhc3NcXFwiIEBjbGljaz1cXFwiZGF5U2VsZWN0KGQpXFxcIj57e2QudGV4dH19PC9zcGFuPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgIDwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L2Rpdj5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1wb3B1cFxcXCIgdi1zaG93PVxcXCJkaXNwbGF5TW9udGhWaWV3XFxcIj5cXHJcXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWlubmVyXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItYm9keVxcXCI+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItY3RybFxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJwcmVCdG5DbGFzc2VzXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgQGNsaWNrPVxcXCJwcmVOZXh0WWVhckNsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dFllYXJDbGljaygxKVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxwIEBjbGljaz1cXFwic3dpdGNoRGVjYWRlVmlld1xcXCI+e3tzdHJpbmdpZnlZZWFySGVhZGVyKGN1cnJEYXRlKX19PC9wPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1tb250aFJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XFxcIihtLCBpbmRleCkgaW4gdGV4dC5tb250aHNcXFwiPlxcclxcbiAgICAgICAgICAgICAgPHNwYW4gICA6Y2xhc3M9XFxcInsnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOlxcclxcbiAgICAgICAgICAgICAgICAgICh0ZXh0Lm1vbnRoc1twYXJzZSh2YWx1ZSkuZ2V0TW9udGgoKV0gID09PSBtKSAmJlxcclxcbiAgICAgICAgICAgICAgICAgIGN1cnJEYXRlLmdldEZ1bGxZZWFyKCkgPT09IHBhcnNlKHZhbHVlKS5nZXRGdWxsWWVhcigpfVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICBAY2xpY2s9XFxcIm1vbnRoU2VsZWN0KGluZGV4KVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgPnt7bS5zdWJzdHIoMCwzKX19PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXBvcHVwXFxcIiB2LXNob3c9XFxcImRpc3BsYXlZZWFyVmlld1xcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1pbm5lclxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWJvZHlcXFwiPlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWN0cmxcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwicHJlQnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDEpXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHA+e3tzdHJpbmdpZnlEZWNhZGVIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2UgZGVjYWRlUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiZGVjYWRlIGluIGRlY2FkZVJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwieydkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSc6cGFyc2UodGhpcy52YWx1ZSkuZ2V0RnVsbFllYXIoKSA9PT0gZGVjYWRlLnRleHR9XFxcIlxcclxcbiAgICAgICAgICAgICAgICBAY2xpY2suc3RvcD1cXFwieWVhclNlbGVjdChkZWNhZGUudGV4dClcXFwiXFxyXFxuICAgICAgICAgICAgICA+e3tkZWNhZGUudGV4dH19PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7dHJhbnNsYXRpb25zfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xcclxcbi8vIGltcG9ydCAkIGZyb20gJy4vdXRpbHMvTm9kZUxpc3QuanMnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgdmFsdWU6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBmb3JtYXQ6IHtkZWZhdWx0OiAnTU0vZGQveXl5eSd9LFxcclxcbiAgICBkaXNhYmxlZERheXNPZldlZWs6IHt0eXBlOiBBcnJheSwgZGVmYXVsdCAoKSB7IHJldHVybiBbXSB9fSxcXHJcXG4gICAgd2lkdGg6IHt0eXBlOiBTdHJpbmcvKiwgZGVmYXVsdDogJzIwMHB4JyovfSxcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGxhbmc6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZX0sXFxyXFxuICAgIHBsYWNlaG9sZGVyOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgaWNvbnNGb250OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZ2x5cGhpY29uJ31cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBjdXJyRGF0ZTogbmV3IERhdGUoKSxcXHJcXG4gICAgICBkYXRlUmFuZ2U6IFtdLFxcclxcbiAgICAgIGRlY2FkZVJhbmdlOiBbXSxcXHJcXG4gICAgICBkaXNwbGF5RGF5VmlldzogZmFsc2UsXFxyXFxuICAgICAgZGlzcGxheU1vbnRoVmlldzogZmFsc2UsXFxyXFxuICAgICAgZGlzcGxheVllYXJWaWV3OiBmYWxzZSxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIGN1cnJEYXRlICgpIHtcXHJcXG4gICAgICB0aGlzLmdldERhdGVSYW5nZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIGZvcm1hdCAoKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKSlcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIHRleHQgKCkge1xcclxcbiAgICAgIHJldHVybiB0cmFuc2xhdGlvbnModGhpcy5sYW5nKVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVCdG5DbGFzc2VzICgpIHtcXHJcXG4gICAgICByZXR1cm4gYGRhdGVwaWNrZXItcHJlQnRuICR7dGhpcy5pY29uc0ZvbnR9ICR7dGhpcy5pY29uc0ZvbnR9LWNoZXZyb24tbGVmdGBcXHJcXG4gICAgfSxcXHJcXG4gICAgbmV4dEJ0bkNsYXNzZXMgKCkge1xcclxcbiAgICAgIHJldHVybiBgZGF0ZXBpY2tlci1uZXh0QnRuICR7dGhpcy5pY29uc0ZvbnR9ICR7dGhpcy5pY29uc0ZvbnR9LWNoZXZyb24tcmlnaHRgXFxyXFxuICAgIH0sXFxyXFxuICAgIGRpc2FibGVkRGF5c0FycmF5ICgpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERheXNPZldlZWsubWFwKGQgPT4gcGFyc2VJbnQoZCwgMTApKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBjbG9zZSAoKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRoaXMuZGlzcGxheVllYXJWaWV3ID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgaW5wdXRDbGljayAoKSB7XFxyXFxuICAgICAgdGhpcy5jdXJyRGF0ZSA9IHRoaXMucGFyc2UodGhpcy52YWx1ZSkgfHwgdGhpcy5wYXJzZShuZXcgRGF0ZSgpKVxcclxcbiAgICAgIGlmICh0aGlzLmRpc3BsYXlNb250aFZpZXcgfHwgdGhpcy5kaXNwbGF5WWVhclZpZXcpIHtcXHJcXG4gICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gIXRoaXMuZGlzcGxheURheVZpZXdcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHByZU5leHREZWNhZGVDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKClcXHJcXG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKClcXHJcXG5cXHJcXG4gICAgICBpZiAoZmxhZyA9PT0gMCkge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgLSAxMCwgbW9udGhzLCBkYXRlKVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEwLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0TW9udGhDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICBjb25zdCBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSlcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZShwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aCwgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKVxcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0WWVhckNsaWNrIChmbGFnKSB7XFxyXFxuICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VyckRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICAgIGNvbnN0IG1vbnRocyA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciAtIDEsIG1vbnRocywgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB5ZWFyU2VsZWN0ICh5ZWFyKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgZGF5U2VsZWN0IChkYXkpIHtcXHJcXG4gICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBkYXkuZGF0ZVxcclxcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKSlcXHJcXG4gICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgc3dpdGNoTW9udGhWaWV3ICgpIHtcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIHN3aXRjaERlY2FkZVZpZXcgKCkge1xcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIG1vbnRoU2VsZWN0IChpbmRleCkge1xcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUodGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpLCBpbmRleCwgdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCkpXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldFllYXJNb250aCAoeWVhciwgbW9udGgpIHtcXHJcXG4gICAgICBpZiAobW9udGggPiAxMSkge1xcclxcbiAgICAgICAgeWVhcisrXFxyXFxuICAgICAgICBtb250aCA9IDBcXHJcXG4gICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkge1xcclxcbiAgICAgICAgeWVhci0tXFxyXFxuICAgICAgICBtb250aCA9IDExXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiB7eWVhcjogeWVhciwgbW9udGg6IG1vbnRofVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnlEZWNhZGVIZWFkZXIgKGRhdGUpIHtcXHJcXG4gICAgICBjb25zdCB5ZWFyU3RyID0gZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKClcXHJcXG4gICAgICBjb25zdCBmaXJzdFllYXJPZkRlY2FkZSA9IHllYXJTdHIuc3Vic3RyaW5nKDAsIHllYXJTdHIubGVuZ3RoIC0gMSkgKyAwXFxyXFxuICAgICAgY29uc3QgbGFzdFllYXJPZkRlY2FkZSA9IHBhcnNlSW50KGZpcnN0WWVhck9mRGVjYWRlLCAxMCkgKyAxMFxcclxcbiAgICAgIHJldHVybiBmaXJzdFllYXJPZkRlY2FkZSArICctJyArIGxhc3RZZWFyT2ZEZWNhZGVcXHJcXG4gICAgfSxcXHJcXG4gICAgc3RyaW5naWZ5RGF5SGVhZGVyIChkYXRlKSB7XFxyXFxuICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXSArICcgJyArIGRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJzZU1vbnRoIChkYXRlKSB7XFxyXFxuICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnlZZWFySGVhZGVyIChkYXRlKSB7XFxyXFxuICAgICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnkgKGRhdGUsIGZvcm1hdCA9IHRoaXMuZm9ybWF0KSB7XFxyXFxuICAgICAgaWYgKCFkYXRlKSBkYXRlID0gdGhpcy5wYXJzZSgpXFxyXFxuICAgICAgaWYgKCFkYXRlKSByZXR1cm4gJydcXHJcXG4gICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpXFxyXFxuICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxXFxyXFxuICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKClcXHJcXG4gICAgICBjb25zdCBtb250aE5hbWUgPSB0aGlzLnBhcnNlTW9udGgoZGF0ZSlcXHJcXG5cXHJcXG4gICAgICByZXR1cm4gZm9ybWF0XFxyXFxuICAgICAgLnJlcGxhY2UoL3l5eXkvZywgeWVhcilcXHJcXG4gICAgICAucmVwbGFjZSgvTU1NTS9nLCBtb250aE5hbWUpXFxyXFxuICAgICAgLnJlcGxhY2UoL01NTS9nLCBtb250aE5hbWUuc3Vic3RyaW5nKDAsIDMpKVxcclxcbiAgICAgIC5yZXBsYWNlKC9NTS9nLCAoJzAnICsgbW9udGgpLnNsaWNlKC0yKSlcXHJcXG4gICAgICAucmVwbGFjZSgvZGQvZywgKCcwJyArIGRheSkuc2xpY2UoLTIpKVxcclxcbiAgICAgIC5yZXBsYWNlKC95eS9nLCB5ZWFyKVxcclxcbiAgICAgIC5yZXBsYWNlKC9NKD8hYSkvZywgbW9udGgpXFxyXFxuICAgICAgLnJlcGxhY2UoL2QvZywgZGF5KVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJzZSAoc3RyID0gdGhpcy52YWx1ZSkge1xcclxcbiAgICAgIGxldCBkYXRlXFxyXFxuICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDEwICYmICh0aGlzLmZvcm1hdCA9PT0gJ2RkLU1NLXl5eXknIHx8IHRoaXMuZm9ybWF0ID09PSAnZGQvTU0veXl5eScpKSB7XFxyXFxuICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RyLnN1YnN0cmluZyg2LCAxMCksIHN0ci5zdWJzdHJpbmcoMywgNSktMSwgc3RyLnN1YnN0cmluZygwLCAyKSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHN0cilcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIGlzTmFOKGRhdGUuZ2V0RnVsbFllYXIoKSkgPyBuZXcgRGF0ZSgpIDogZGF0ZVxcclxcbiAgICB9LFxcclxcbiAgICBnZXREYXlDb3VudCAoeWVhciwgbW9udGgpIHtcXHJcXG4gICAgICBjb25zdCBkaWN0ID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdXFxyXFxuICAgICAgaWYgKG1vbnRoID09PSAxKSB7XFxyXFxuICAgICAgICBpZiAoKHllYXIgJSA0MDAgPT09IDApIHx8ICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSkge1xcclxcbiAgICAgICAgICByZXR1cm4gMjlcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIGRpY3RbbW9udGhdXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldERhdGVSYW5nZSAoKSB7XFxyXFxuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIHRoaXMuZGVjYWRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIGNvbnN0IHRpbWUgPSB7XFxyXFxuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksXFxyXFxuICAgICAgICBtb250aDogdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLFxcclxcbiAgICAgICAgZGF5OiB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBjb25zdCB5ZWFyU3RyID0gdGltZS55ZWFyLnRvU3RyaW5nKClcXHJcXG4gICAgICBjb25zdCBmaXJzdFllYXJPZkRlY2FkZSA9ICh5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMCkgLSAxXFxyXFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XFxyXFxuICAgICAgICB0aGlzLmRlY2FkZVJhbmdlLnB1c2goe1xcclxcbiAgICAgICAgICB0ZXh0OiBmaXJzdFllYXJPZkRlY2FkZSArIGlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGNvbnN0IGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCAxKVxcclxcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcXHJcXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XFxyXFxuICAgICAgICBmaXJzdERheVdlZWsgPSA3XFxyXFxuICAgICAgfVxcclxcbiAgICAgIGNvbnN0IGRheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudCh0aW1lLnllYXIsIHRpbWUubW9udGgpXFxyXFxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA+IDEpIHtcXHJcXG4gICAgICAgIGNvbnN0IHByZU1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgodGltZS55ZWFyLCB0aW1lLm1vbnRoIC0gMSlcXHJcXG4gICAgICAgIGNvbnN0IHByZXZNb250aERheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudChwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aClcXHJcXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF5VGV4dCA9IHByZXZNb250aERheUNvdW50IC0gZmlyc3REYXlXZWVrICsgaSArIDFcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXlUZXh0KVxcclxcbiAgICAgICAgICBsZXQgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1ncmF5J1xcclxcbiAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcXHJcXG4gICAgICAgICAgICBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUnXFxyXFxuICAgICAgICAgIH1cXHJcXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XFxyXFxuICAgICAgICAgICAgdGV4dDogZGF5VGV4dCxcXHJcXG4gICAgICAgICAgICBkYXRlOiBkYXRlLFxcclxcbiAgICAgICAgICAgIHNjbGFzczogJ2RhdGVwaWNrZXItaXRlbS1ncmF5J1xcclxcbiAgICAgICAgICB9KVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkYXlDb3VudDsgaSsrKSB7XFxyXFxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCBpKVxcclxcbiAgICAgICAgbGV0IHNjbGFzcyA9ICcnXFxyXFxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcXHJcXG4gICAgICAgICAgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJ1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgaWYgKGkgPT0gdGltZS5kYXkgJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09IHRpbWUueWVhciAmJiBkYXRlLmdldE1vbnRoKCkgPT0gdGltZS5tb250aCl7XFxyXFxuICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSdcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xcclxcbiAgICAgICAgICB0ZXh0OiBpLFxcclxcbiAgICAgICAgICBkYXRlOiBkYXRlLFxcclxcbiAgICAgICAgICBzY2xhc3M6IHNjbGFzc1xcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICB9XFxyXFxuXFxyXFxuICAgICAgaWYgKHRoaXMuZGF0ZVJhbmdlLmxlbmd0aCA8IDQyKSB7XFxyXFxuICAgICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcXHJcXG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCArIDEpXFxyXFxuXFxyXFxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuZXh0TW9udGhOZWVkOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXFxyXFxuICAgICAgICAgIGxldCBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWdyYXknXFxyXFxuICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMSkge1xcclxcbiAgICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSdcXHJcXG4gICAgICAgICAgfVxcclxcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcXHJcXG4gICAgICAgICAgICB0ZXh0OiBpLFxcclxcbiAgICAgICAgICAgIGRhdGU6IGRhdGUsXFxyXFxuICAgICAgICAgICAgc2NsYXNzOiBzY2xhc3NcXHJcXG4gICAgICAgICAgfSlcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgbGV0IGVsID0gdGhpcy4kZWxcXHJcXG4gICAgdGhpcy5fYmx1ciA9IGUgPT4ge1xcclxcbiAgICAgIGlmICghZWwuY29udGFpbnMoZS50YXJnZXQpKVxcclxcbiAgICAgICAgdGhpcy5jbG9zZSgpXFxyXFxuICAgIH1cXHJcXG4gICAgdGhpcy4kZW1pdCgnY2hpbGQtY3JlYXRlZCcsIHRoaXMpXFxyXFxuICAgIHRoaXMuY3VyckRhdGUgPSB0aGlzLnBhcnNlKHRoaXMudmFsdWUpIHx8IHRoaXMucGFyc2UobmV3IERhdGUoKSlcXHJcXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XFxyXFxuICB9LFxcclxcbiAgYmVmb3JlRGVzdHJveSAoKSB7XFxyXFxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JsdXIpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uZGF0ZXBpY2tlciB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxufVxcclxcbmlucHV0LmRhdGVwaWNrZXItaW5wdXQud2l0aC1yZXNldC1idXR0b24ge1xcclxcbiAgcGFkZGluZy1yaWdodDogMjVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2U6Zm9jdXMge1xcclxcbiAgb3BhY2l0eTogLjI7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXBvcHVwIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgbWFyZ2luLXRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwMDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLDAsMCwwLjE3NSk7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWlubmVyIHtcXHJcXG4gIHdpZHRoOiAyMThweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItYm9keSB7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHdpZHRoOiAyOHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI4cHg7XFxyXFxuICBoZWlnaHQ6IDI4cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCB7XFxyXFxuICB3aWR0aDogNjUlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1ib2R5IHNwYW4ge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4ge1xcclxcbiAgd2lkdGg6IDQ4cHg7XFxyXFxuICBoZWlnaHQ6IDUwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogNDVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItaXRlbS1kaXNhYmxlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG4gIGN1cnNvcjogbm90LWFsbG93ZWQhaW1wb3J0YW50O1xcclxcbn1cXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpmaXJzdC1jaGlsZCxcXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpsYXN0LWNoaWxkLFxcclxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWdyYXkge1xcclxcbiAgY29sb3I6ICM5OTk7XFxyXFxufVxcclxcblxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZTpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUge1xcclxcbiAgYmFja2dyb3VuZDogcmdiKDUwLCAxMTgsIDE3NykhaW1wb3J0YW50O1xcclxcbiAgY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAxMHB4XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3BhbixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBwLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcDpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIGk6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlIHNwYW46aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0taG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvciA6ICNlZWVlZWU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXdlZWtSYW5nZSBzcGFuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1sYWJlbCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXHJcXG4gIHBhZGRpbmc6IDdweCAwO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGhlaWdodDogMzBweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5tb250aC1idG4ge1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbW96LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbXMtdXNlci1zZWxlY3Q6bm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0Om5vbmU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXByZUJ0biB7XFxyXFxuICBsZWZ0OiAycHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW5leHRCdG4ge1xcclxcbiAgcmlnaHQ6IDJweDtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDEwMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHQvLyBpbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICB2YWx1ZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGZvcm1hdDogeyBkZWZhdWx0OiAnTU0vZGQveXl5eScgfSxcblx0ICAgIGRpc2FibGVkRGF5c09mV2VlazogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG5cdCAgICAgICAgcmV0dXJuIFtdO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgd2lkdGg6IHsgdHlwZTogU3RyaW5nIC8qLCBkZWZhdWx0OiAnMjAwcHgnKi8gfSxcblx0ICAgIGNsZWFyQnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBsYW5nOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbmF2aWdhdG9yLmxhbmd1YWdlIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGljb25zRm9udDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdnbHlwaGljb24nIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjdXJyRGF0ZTogbmV3IERhdGUoKSxcblx0ICAgICAgZGF0ZVJhbmdlOiBbXSxcblx0ICAgICAgZGVjYWRlUmFuZ2U6IFtdLFxuXHQgICAgICBkaXNwbGF5RGF5VmlldzogZmFsc2UsXG5cdCAgICAgIGRpc3BsYXlNb250aFZpZXc6IGZhbHNlLFxuXHQgICAgICBkaXNwbGF5WWVhclZpZXc6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBjdXJyRGF0ZTogZnVuY3Rpb24gY3VyckRhdGUoKSB7XG5cdCAgICAgIHRoaXMuZ2V0RGF0ZVJhbmdlKCk7XG5cdCAgICB9LFxuXHQgICAgZm9ybWF0OiBmdW5jdGlvbiBmb3JtYXQoKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdGhpcy5zdHJpbmdpZnkodGhpcy5jdXJyRGF0ZSkpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHRleHQ6IGZ1bmN0aW9uIHRleHQoKSB7XG5cdCAgICAgIHJldHVybiAoMCwgX3V0aWxzLnRyYW5zbGF0aW9ucykodGhpcy5sYW5nKTtcblx0ICAgIH0sXG5cdCAgICBwcmVCdG5DbGFzc2VzOiBmdW5jdGlvbiBwcmVCdG5DbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gJ2RhdGVwaWNrZXItcHJlQnRuICcgKyB0aGlzLmljb25zRm9udCArICcgJyArIHRoaXMuaWNvbnNGb250ICsgJy1jaGV2cm9uLWxlZnQnO1xuXHQgICAgfSxcblx0ICAgIG5leHRCdG5DbGFzc2VzOiBmdW5jdGlvbiBuZXh0QnRuQ2xhc3NlcygpIHtcblx0ICAgICAgcmV0dXJuICdkYXRlcGlja2VyLW5leHRCdG4gJyArIHRoaXMuaWNvbnNGb250ICsgJyAnICsgdGhpcy5pY29uc0ZvbnQgKyAnLWNoZXZyb24tcmlnaHQnO1xuXHQgICAgfSxcblx0ICAgIGRpc2FibGVkRGF5c0FycmF5OiBmdW5jdGlvbiBkaXNhYmxlZERheXNBcnJheSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWREYXlzT2ZXZWVrLm1hcChmdW5jdGlvbiAoZCkge1xuXHQgICAgICAgIHJldHVybiBwYXJzZUludChkLCAxMCk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZTtcblx0ICAgIH0sXG5cdCAgICBpbnB1dENsaWNrOiBmdW5jdGlvbiBpbnB1dENsaWNrKCkge1xuXHQgICAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbHVlKSB8fCB0aGlzLnBhcnNlKG5ldyBEYXRlKCkpO1xuXHQgICAgICBpZiAodGhpcy5kaXNwbGF5TW9udGhWaWV3IHx8IHRoaXMuZGlzcGxheVllYXJWaWV3KSB7XG5cdCAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSAhdGhpcy5kaXNwbGF5RGF5Vmlldztcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHREZWNhZGVDbGljazogZnVuY3Rpb24gcHJlTmV4dERlY2FkZUNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMTAsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxMCwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHRNb250aENsaWNrOiBmdW5jdGlvbiBwcmVOZXh0TW9udGhDbGljayhmbGFnKSB7XG5cdCAgICAgIHZhciB5ZWFyID0gdGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgICB2YXIgbW9udGggPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHZhciBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSk7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB2YXIgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKTtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwcmVOZXh0WWVhckNsaWNrOiBmdW5jdGlvbiBwcmVOZXh0WWVhckNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMSwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB5ZWFyU2VsZWN0OiBmdW5jdGlvbiB5ZWFyU2VsZWN0KHllYXIpIHtcblx0ICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIsIHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKSwgdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCkpO1xuXHQgICAgfSxcblx0ICAgIGRheVNlbGVjdDogZnVuY3Rpb24gZGF5U2VsZWN0KGRheSkge1xuXHQgICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gZGF5LmRhdGU7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKSk7XG5cdCAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc3dpdGNoTW9udGhWaWV3OiBmdW5jdGlvbiBzd2l0Y2hNb250aFZpZXcoKSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdHJ1ZTtcblx0ICAgIH0sXG5cdCAgICBzd2l0Y2hEZWNhZGVWaWV3OiBmdW5jdGlvbiBzd2l0Y2hEZWNhZGVWaWV3KCkge1xuXHQgICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSB0cnVlO1xuXHQgICAgfSxcblx0ICAgIG1vbnRoU2VsZWN0OiBmdW5jdGlvbiBtb250aFNlbGVjdChpbmRleCkge1xuXHQgICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IHRydWU7XG5cdCAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksIGluZGV4LCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSk7XG5cdCAgICB9LFxuXHQgICAgZ2V0WWVhck1vbnRoOiBmdW5jdGlvbiBnZXRZZWFyTW9udGgoeWVhciwgbW9udGgpIHtcblx0ICAgICAgaWYgKG1vbnRoID4gMTEpIHtcblx0ICAgICAgICB5ZWFyKys7XG5cdCAgICAgICAgbW9udGggPSAwO1xuXHQgICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkge1xuXHQgICAgICAgIHllYXItLTtcblx0ICAgICAgICBtb250aCA9IDExO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB7IHllYXI6IHllYXIsIG1vbnRoOiBtb250aCB9O1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeURlY2FkZUhlYWRlcjogZnVuY3Rpb24gc3RyaW5naWZ5RGVjYWRlSGVhZGVyKGRhdGUpIHtcblx0ICAgICAgdmFyIHllYXJTdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcblx0ICAgICAgdmFyIGZpcnN0WWVhck9mRGVjYWRlID0geWVhclN0ci5zdWJzdHJpbmcoMCwgeWVhclN0ci5sZW5ndGggLSAxKSArIDA7XG5cdCAgICAgIHZhciBsYXN0WWVhck9mRGVjYWRlID0gcGFyc2VJbnQoZmlyc3RZZWFyT2ZEZWNhZGUsIDEwKSArIDEwO1xuXHQgICAgICByZXR1cm4gZmlyc3RZZWFyT2ZEZWNhZGUgKyAnLScgKyBsYXN0WWVhck9mRGVjYWRlO1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeURheUhlYWRlcjogZnVuY3Rpb24gc3RyaW5naWZ5RGF5SGVhZGVyKGRhdGUpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXSArICcgJyArIGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0ICAgIH0sXG5cdCAgICBwYXJzZU1vbnRoOiBmdW5jdGlvbiBwYXJzZU1vbnRoKGRhdGUpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXTtcblx0ICAgIH0sXG5cdCAgICBzdHJpbmdpZnlZZWFySGVhZGVyOiBmdW5jdGlvbiBzdHJpbmdpZnlZZWFySGVhZGVyKGRhdGUpIHtcblx0ICAgICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0ICAgIH0sXG5cdCAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShkYXRlKSB7XG5cdCAgICAgIHZhciBmb3JtYXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRoaXMuZm9ybWF0O1xuXHRcblx0ICAgICAgaWYgKCFkYXRlKSBkYXRlID0gdGhpcy5wYXJzZSgpO1xuXHQgICAgICBpZiAoIWRhdGUpIHJldHVybiAnJztcblx0ICAgICAgdmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XG5cdCAgICAgIHZhciBkYXkgPSBkYXRlLmdldERhdGUoKTtcblx0ICAgICAgdmFyIG1vbnRoTmFtZSA9IHRoaXMucGFyc2VNb250aChkYXRlKTtcblx0XG5cdCAgICAgIHJldHVybiBmb3JtYXQucmVwbGFjZSgveXl5eS9nLCB5ZWFyKS5yZXBsYWNlKC9NTU1NL2csIG1vbnRoTmFtZSkucmVwbGFjZSgvTU1NL2csIG1vbnRoTmFtZS5zdWJzdHJpbmcoMCwgMykpLnJlcGxhY2UoL01NL2csICgnMCcgKyBtb250aCkuc2xpY2UoLTIpKS5yZXBsYWNlKC9kZC9nLCAoJzAnICsgZGF5KS5zbGljZSgtMikpLnJlcGxhY2UoL3l5L2csIHllYXIpLnJlcGxhY2UoL00oPyFhKS9nLCBtb250aCkucmVwbGFjZSgvZC9nLCBkYXkpO1xuXHQgICAgfSxcblx0ICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZSgpIHtcblx0ICAgICAgdmFyIHN0ciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy52YWx1ZTtcblx0XG5cdCAgICAgIHZhciBkYXRlID0gdm9pZCAwO1xuXHQgICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMTAgJiYgKHRoaXMuZm9ybWF0ID09PSAnZGQtTU0teXl5eScgfHwgdGhpcy5mb3JtYXQgPT09ICdkZC9NTS95eXl5JykpIHtcblx0ICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RyLnN1YnN0cmluZyg2LCAxMCksIHN0ci5zdWJzdHJpbmcoMywgNSkgLSAxLCBzdHIuc3Vic3RyaW5nKDAsIDIpKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RyKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gaXNOYU4oZGF0ZS5nZXRGdWxsWWVhcigpKSA/IG5ldyBEYXRlKCkgOiBkYXRlO1xuXHQgICAgfSxcblx0ICAgIGdldERheUNvdW50OiBmdW5jdGlvbiBnZXREYXlDb3VudCh5ZWFyLCBtb250aCkge1xuXHQgICAgICB2YXIgZGljdCA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcblx0ICAgICAgaWYgKG1vbnRoID09PSAxKSB7XG5cdCAgICAgICAgaWYgKHllYXIgJSA0MDAgPT09IDAgfHwgeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCkge1xuXHQgICAgICAgICAgcmV0dXJuIDI5O1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gZGljdFttb250aF07XG5cdCAgICB9LFxuXHQgICAgZ2V0RGF0ZVJhbmdlOiBmdW5jdGlvbiBnZXREYXRlUmFuZ2UoKSB7XG5cdCAgICAgIHRoaXMuZGF0ZVJhbmdlID0gW107XG5cdCAgICAgIHRoaXMuZGVjYWRlUmFuZ2UgPSBbXTtcblx0ICAgICAgdmFyIHRpbWUgPSB7XG5cdCAgICAgICAgeWVhcjogdGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpLFxuXHQgICAgICAgIG1vbnRoOiB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCksXG5cdCAgICAgICAgZGF5OiB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxuXHQgICAgICB9O1xuXHQgICAgICB2YXIgeWVhclN0ciA9IHRpbWUueWVhci50b1N0cmluZygpO1xuXHQgICAgICB2YXIgZmlyc3RZZWFyT2ZEZWNhZGUgPSB5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMCAtIDE7XG5cdCAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTI7IGkrKykge1xuXHQgICAgICAgIHRoaXMuZGVjYWRlUmFuZ2UucHVzaCh7XG5cdCAgICAgICAgICB0ZXh0OiBmaXJzdFllYXJPZkRlY2FkZSArIGlcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCAxKTtcblx0ICAgICAgdmFyIGZpcnN0RGF5V2VlayA9IGN1cnJNb250aEZpcnN0RGF5LmdldERheSgpICsgMTtcblx0ICAgICAgaWYgKGZpcnN0RGF5V2VlayA9PT0gMCkge1xuXHQgICAgICAgIGZpcnN0RGF5V2VlayA9IDc7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIGRheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudCh0aW1lLnllYXIsIHRpbWUubW9udGgpO1xuXHQgICAgICBpZiAoZmlyc3REYXlXZWVrID4gMSkge1xuXHQgICAgICAgIHZhciBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCAtIDEpO1xuXHQgICAgICAgIHZhciBwcmV2TW9udGhEYXlDb3VudCA9IHRoaXMuZ2V0RGF5Q291bnQocHJlTW9udGgueWVhciwgcHJlTW9udGgubW9udGgpO1xuXHQgICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBmaXJzdERheVdlZWs7IF9pKyspIHtcblx0ICAgICAgICAgIHZhciBkYXlUZXh0ID0gcHJldk1vbnRoRGF5Q291bnQgLSBmaXJzdERheVdlZWsgKyBfaSArIDE7XG5cdCAgICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXlUZXh0KTtcblx0ICAgICAgICAgIHZhciBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWdyYXknO1xuXHQgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWREYXlzQXJyYXkuaW5kZXhPZihkYXRlLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSc7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcblx0ICAgICAgICAgICAgdGV4dDogZGF5VGV4dCxcblx0ICAgICAgICAgICAgZGF0ZTogZGF0ZSxcblx0ICAgICAgICAgICAgc2NsYXNzOiAnZGF0ZXBpY2tlci1pdGVtLWdyYXknXG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIF9pMiA9IDE7IF9pMiA8PSBkYXlDb3VudDsgX2kyKyspIHtcblx0ICAgICAgICB2YXIgX2RhdGUgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIF9pMik7XG5cdCAgICAgICAgdmFyIF9zY2xhc3MgPSAnJztcblx0ICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKF9kYXRlLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICBfc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKF9pMiA9PSB0aW1lLmRheSAmJiBfZGF0ZS5nZXRGdWxsWWVhcigpID09IHRpbWUueWVhciAmJiBfZGF0ZS5nZXRNb250aCgpID09IHRpbWUubW9udGgpIHtcblx0ICAgICAgICAgIF9zY2xhc3MgPSAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcblx0ICAgICAgICAgIHRleHQ6IF9pMixcblx0ICAgICAgICAgIGRhdGU6IF9kYXRlLFxuXHQgICAgICAgICAgc2NsYXNzOiBfc2NsYXNzXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGlmICh0aGlzLmRhdGVSYW5nZS5sZW5ndGggPCA0Mikge1xuXHQgICAgICAgIHZhciBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGg7XG5cdCAgICAgICAgdmFyIG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCArIDEpO1xuXHRcblx0ICAgICAgICBmb3IgKHZhciBfaTMgPSAxOyBfaTMgPD0gbmV4dE1vbnRoTmVlZDsgX2kzKyspIHtcblx0ICAgICAgICAgIHZhciBfZGF0ZTIgPSBuZXcgRGF0ZShuZXh0TW9udGgueWVhciwgbmV4dE1vbnRoLm1vbnRoLCBfaTMpO1xuXHQgICAgICAgICAgdmFyIF9zY2xhc3MyID0gJ2RhdGVwaWNrZXItaXRlbS1ncmF5Jztcblx0ICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoX2RhdGUyLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICAgIF9zY2xhc3MyID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuXHQgICAgICAgICAgICB0ZXh0OiBfaTMsXG5cdCAgICAgICAgICAgIGRhdGU6IF9kYXRlMixcblx0ICAgICAgICAgICAgc2NsYXNzOiBfc2NsYXNzMlxuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICB2YXIgZWwgPSB0aGlzLiRlbDtcblx0ICAgIHRoaXMuX2JsdXIgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBpZiAoIWVsLmNvbnRhaW5zKGUudGFyZ2V0KSkgX3RoaXMuY2xvc2UoKTtcblx0ICAgIH07XG5cdCAgICB0aGlzLiRlbWl0KCdjaGlsZC1jcmVhdGVkJywgdGhpcyk7XG5cdCAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbHVlKSB8fCB0aGlzLnBhcnNlKG5ldyBEYXRlKCkpO1xuXHQgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTA0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sIGRhdGVwaWNrZXItaW5wdXRcIixcblx0ICAgIGNsYXNzOiB7XG5cdCAgICAgICd3aXRoLXJlc2V0LWJ1dHRvbic6IF92bS5jbGVhckJ1dHRvblxuXHQgICAgfSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLndpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInRleHRcIixcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0ucGxhY2Vob2xkZXJcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS52YWx1ZVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmlucHV0Q2xpY2ssXG5cdCAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLiRlbWl0KCdpbnB1dCcsICRldmVudC50YXJnZXQudmFsdWUpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgKF92bS5jbGVhckJ1dHRvbiAmJiBfdm0udmFsdWUpID8gX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS4kZW1pdCgnaW5wdXQnLCAnJylcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCBbX3ZtLl92KFwiw5dcIildKV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmRpc3BsYXlEYXlWaWV3KSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJkaXNwbGF5RGF5Vmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRNb250aENsaWNrKDApXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5uZXh0QnRuQ2xhc3Nlcyxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5wcmVOZXh0TW9udGhDbGljaygxKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygncCcsIHtcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLnN3aXRjaE1vbnRoVmlld1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5zdHJpbmdpZnlEYXlIZWFkZXIoX3ZtLmN1cnJEYXRlKSkpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLXdlZWtSYW5nZVwiXG5cdCAgfSwgX3ZtLl9sKChfdm0udGV4dC5kYXlzT2ZXZWVrKSwgZnVuY3Rpb24odykge1xuXHQgICAgcmV0dXJuIF92bS5fYygnc3BhbicsIFtfdm0uX3YoX3ZtLl9zKHcpKV0pXG5cdCAgfSkpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItZGF0ZVJhbmdlXCJcblx0ICB9LCBfdm0uX2woKF92bS5kYXRlUmFuZ2UpLCBmdW5jdGlvbihkKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgICBjbGFzczogZC5zY2xhc3MsXG5cdCAgICAgIG9uOiB7XG5cdCAgICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAgIF92bS5kYXlTZWxlY3QoZClcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX3YoX3ZtLl9zKGQudGV4dCkpXSlcblx0ICB9KSldKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmRpc3BsYXlNb250aFZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlNb250aFZpZXdcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLXBvcHVwXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLWlubmVyXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLWJvZHlcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItY3RybFwiXG5cdCAgfSwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBfdm0ucHJlQnRuQ2xhc3Nlcyxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5wcmVOZXh0WWVhckNsaWNrKDApXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5uZXh0QnRuQ2xhc3Nlcyxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5wcmVOZXh0WWVhckNsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywge1xuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uc3dpdGNoRGVjYWRlVmlld1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5zdHJpbmdpZnlZZWFySGVhZGVyKF92bS5jdXJyRGF0ZSkpKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1tb250aFJhbmdlXCJcblx0ICB9LCBbX3ZtLl9sKChfdm0udGV4dC5tb250aHMpLCBmdW5jdGlvbihtLCBpbmRleCkge1xuXHQgICAgcmV0dXJuIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGNsYXNzOiB7XG5cdCAgICAgICAgJ2RhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0tYWN0aXZlJzpcblx0ICAgICAgICAoX3ZtLnRleHQubW9udGhzW192bS5wYXJzZShfdm0udmFsdWUpLmdldE1vbnRoKCldID09PSBtKSAmJlxuXHQgICAgICAgIF92bS5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpID09PSBfdm0ucGFyc2UoX3ZtLnZhbHVlKS5nZXRGdWxsWWVhcigpXG5cdCAgICAgIH0sXG5cdCAgICAgIG9uOiB7XG5cdCAgICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAgIF92bS5tb250aFNlbGVjdChpbmRleClcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX3YoX3ZtLl9zKG0uc3Vic3RyKDAsIDMpKSldKV1cblx0ICB9KV0sIDIpXSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5kaXNwbGF5WWVhclZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlZZWFyVmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHREZWNhZGVDbGljaygwKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBfdm0ubmV4dEJ0bkNsYXNzZXMsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0ucHJlTmV4dERlY2FkZUNsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeURlY2FkZUhlYWRlcihfdm0uY3VyckRhdGUpKSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItbW9udGhSYW5nZSBkZWNhZGVSYW5nZVwiXG5cdCAgfSwgW192bS5fbCgoX3ZtLmRlY2FkZVJhbmdlKSwgZnVuY3Rpb24oZGVjYWRlKSB7XG5cdCAgICByZXR1cm4gW192bS5fYygnc3BhbicsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOiBfdm0ucGFyc2UodGhpcy52YWx1ZSkuZ2V0RnVsbFllYXIoKSA9PT0gZGVjYWRlLnRleHRcblx0ICAgICAgfSxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICAgX3ZtLnllYXJTZWxlY3QoZGVjYWRlLnRleHQpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl92KF92bS5fcyhkZWNhZGUudGV4dCkpXSldXG5cdCAgfSldLCAyKV0pXSldKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTQ3N2I4ZTVkXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTA1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcRHJvcGRvd24udnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTM5YmUxMDcyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zOWJlMTA3MlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIERyb3Bkb3duLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEwNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KTtcblx0XG5cdHZhciBfQ2xpY2tPdXRzaWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsaWNrT3V0c2lkZSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBkaXJlY3RpdmVzOiB7XG5cdCAgICBDbGlja091dHNpZGU6IF9DbGlja091dHNpZGUyLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2l6ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2RlZmF1bHQnIH0sXG5cdCAgICB2YWx1ZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIHNob3cgPSB0aGlzLnZhbHVlO1xuXHQgICAgcmV0dXJuIHsgc2hvdzogc2hvdyB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KHZhbCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICB0aGlzLnNob3cgPSB2YWw7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYnV0dG9uU2l6ZTogZnVuY3Rpb24gYnV0dG9uU2l6ZSgpIHtcblx0ICAgICAgcmV0dXJuIH5bJ2xnJywgJ3NtJywgJ3hzJ10uaW5kZXhPZih0aGlzLnNpemUpID8gJ2J0bi0nICsgdGhpcy5zaXplIDogJyc7XG5cdCAgICB9LFxuXHQgICAgaW5JbnB1dDogZnVuY3Rpb24gaW5JbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgaXNMaTogZnVuY3Rpb24gaXNMaSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faXNUYWJzIHx8IHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51O1xuXHQgICAgfSxcblx0ICAgIG1lbnU6IGZ1bmN0aW9uIG1lbnUoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy4kcGFyZW50IHx8IHRoaXMuJHBhcmVudC5uYXZiYXI7XG5cdCAgICB9LFxuXHQgICAgc2xvdHM6IGZ1bmN0aW9uIHNsb3RzKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc2xvdENvbnRlbnRzO1xuXHQgICAgfSxcblx0ICAgIHN1Ym1lbnU6IGZ1bmN0aW9uIHN1Ym1lbnUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQgJiYgKHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5zdWJtZW51KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcblx0ICAgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgndWwnLCB0aGlzLiRlbCkub24oJ2NsaWNrJywgJ2xpPmEnLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBfdGhpcy5zaG93ID0gZmFsc2U7XG5cdCAgICB9KTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgndWwnLCB0aGlzLiRlbCkub2ZmKCk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTA3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoX3ZtLmlzTGkgPyAnbGknIDogJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwiY2xpY2stb3V0c2lkZVwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtY2xpY2stb3V0c2lkZVwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5ibHVyKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJibHVyXCJcblx0ICAgIH1dLFxuXHQgICAgdGFnOiBcImRpdlwiLFxuXHQgICAgY2xhc3M6IFt7XG5cdCAgICAgIG9wZW46IF92bS5zaG93LFxuXHQgICAgICBkaXNhYmxlZDogX3ZtLmRpc2FibGVkLFxuXHQgICAgICBkcm9wZG93bjogX3ZtLmlzTGksXG5cdCAgICAgICdpbnB1dC1ncm91cC1idG4nOiBfdm0uaW5JbnB1dCxcblx0ICAgICAgJ2J0bi1ncm91cCc6ICFfdm0uaXNMaSAmJiAhX3ZtLmluSW5wdXRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fdChcImJlZm9yZVwiKSwgX3ZtLl92KFwiIFwiKSwgKF92bS5pc0xpKSA/IF92bS5fYygnYScsIHtcblx0ICAgIGNsYXNzOiBbJ2Ryb3Bkb3duLXRvZ2dsZScsIF92bS5idXR0b25TaXplLCB7XG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWRcblx0ICAgIH1dLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZXNjXCIsIDI3KSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0uc2hvdyA9IGZhbHNlXG5cdCAgICAgIH0sXG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgkZXZlbnQpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiYnV0dG9uXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50ZXh0KSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2FyZXRcIlxuXHQgIH0pXSwgMikgOiBfdm0uX2MoJ2J1dHRvbicsIHtcblx0ICAgIGNsYXNzOiBbJ2J0biBidG4tJyArIF92bS50eXBlLCBfdm0uYnV0dG9uU2l6ZSwgJ2Ryb3Bkb3duLXRvZ2dsZSddLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCIsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnNob3cgPSBmYWxzZVxuXHQgICAgICB9LFxuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS50b2dnbGUoJGV2ZW50KVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImJ1dHRvblwiLCBbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNhcmV0XCJcblx0ICB9KV0sIDIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkcm9wZG93bi1tZW51XCIsIFtfdm0uX2MoJ3VsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZHJvcGRvd24tbWVudVwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzliZTEwNzJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTA5KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxGb3JtR3JvdXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTc5ZWI0MDBhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi03OWViNDAwYVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEZvcm1Hcm91cC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvLyBsZXQgY29lcmNlID0ge1xuXHQvLyAgICAgZW50ZXJTdWJtaXQ6ICdib29sZWFuJyxcblx0Ly8gICAgIGljb246ICdib29sZWFuJ1xuXHQvLyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGVudGVyU3VibWl0OiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IGZhbHNlXG5cdCAgICB9LFxuXHQgICAgaWNvbjoge1xuXHQgICAgICB0eXBlOiBCb29sZWFuLFxuXHQgICAgICBkZWZhdWx0OiBmYWxzZVxuXHQgICAgfSxcblx0ICAgIGxhbmc6IHtcblx0ICAgICAgdHlwZTogU3RyaW5nLFxuXHQgICAgICBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2Vcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjaGlsZHJlbjogW10sXG5cdCAgICAgIHZhbGlkOiBudWxsLFxuXHQgICAgICB0aW1lb3V0OiBudWxsXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQgJiYgdGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgdmFyIHZhbGlkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jaGlsZHJlbi5zb21lKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHZhciB2ID0gZWwudmFsaWRhdGUgPyBlbC52YWxpZGF0ZSgpIDogZWwudmFsaWQgIT09IHVuZGVmaW5lZCA/IGVsLnZhbGlkIDogZWwucmVxdWlyZWQgJiYgIX5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZihlbC52YWx1ZSk7XG5cdCAgICAgICAgaWYgKCF2KSB2YWxpZCA9IGZhbHNlO1xuXHQgICAgICAgIHJldHVybiAhdmFsaWQ7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLnZhbGlkID0gdmFsaWQ7XG5cdCAgICAgIHJldHVybiB2YWxpZCA9PT0gdHJ1ZTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9mb3JtR3JvdXAgPSB0cnVlO1xuXHQgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcblx0ICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5fZm9ybUdyb3VwKSB7XG5cdCAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuXHQgICAgfVxuXHQgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuX2Zvcm1Hcm91cCkge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHRoaXMudmFsaWRhdGUoKTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxMTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnc3BhbicsIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNzllYjQwMGFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxGb3JtVmFsaWRhdG9yLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1iOWY1N2M0NlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtYjlmNTdjNDZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBGb3JtVmFsaWRhdG9yLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDExMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZW50ZXJTdWJtaXQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGljb246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2UgfSxcblx0ICAgIHZhbHVlOiBudWxsXG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY2hpbGRyZW46IFtdLFxuXHQgICAgICB2YWxpZDogbnVsbCxcblx0ICAgICAgdGltZW91dDogbnVsbFxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICB3YXRjaDoge1xuXHQgICAgdmFsaWQ6IGZ1bmN0aW9uIHZhbGlkKHZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lzdmFsaWQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQgJiYgdGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgdmFyIGludmFsaWQgPSAhdGhpcy5jaGlsZHJlbi5ldmVyeShmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwudmFsaWRhdGUgPyBlbC52YWxpZGF0ZSgpIDogZWwudmFsaWQgIT09IHVuZGVmaW5lZCA/IGVsLnZhbGlkIDogZWwucmVxdWlyZWQgJiYgIX5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZihlbC52YWx1ZSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLnZhbGlkID0gIWludmFsaWQ7XG5cdCAgICAgIHJldHVybiAhaW52YWxpZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9mb3JtVmFsaWRhdG9yID0gdHJ1ZTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHRoaXMudmFsaWRhdGUoKTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxMTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnc3BhbicsIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtYjlmNTdjNDZcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTE1KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTE3KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExOClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxJbnB1dC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdF9fdnVlX29wdGlvbnNfXy5fc2NvcGVJZCA9IFwiZGF0YS12LTY1MmFkN2I5XCJcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi02NTJhZDdiOVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNjUyYWQ3YjlcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBJbnB1dC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMTUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExNik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjUyYWQ3Yjkmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0lucHV0LnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjUyYWQ3Yjkmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0lucHV0LnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDExNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZm9ybS1ncm91cFtkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxubGFiZWx+LmNsb3NlW2RhdGEtdi02NTJhZDdiOV0ge1xcclxcbiAgdG9wOiAyNXB4O1xcbn1cXG4uaW5wdXQtZ3JvdXA+Lmljb25bZGF0YS12LTY1MmFkN2I5XSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcclxcbiAgd2lkdGg6MDtcXHJcXG4gIHotaW5kZXg6IDM7XFxufVxcbi5jbG9zZVtkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmhhcy1mZWVkYmFjayAuY2xvc2VbZGF0YS12LTY1MmFkN2I5XSB7XFxyXFxuICByaWdodDogMjBweDtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9JbnB1dC52dWU/MmM1NTRkM2RcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTBRQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFVBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFQUNBLFFBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsT0FBQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxZQUFBO0NBQ0FcIixcImZpbGVcIjpcIklucHV0LnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIiA6Y2xhc3M9XFxcInt2YWxpZGF0ZTpjYW5WYWxpZGF0ZSwnaGFzLWZlZWRiYWNrJzppY29uLCdoYXMtZXJyb3InOmNhblZhbGlkYXRlJiZ2YWxpZD09PWZhbHNlLCdoYXMtc3VjY2Vzcyc6Y2FuVmFsaWRhdGUmJnZhbGlkfVxcXCI+XFxyXFxuICAgIDxzbG90IG5hbWU9XFxcImxhYmVsXFxcIj48bGFiZWwgdi1pZj1cXFwibGFiZWxcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIiBAY2xpY2s9XFxcImZvY3VzXFxcIj57e2xhYmVsfX08L2xhYmVsPjwvc2xvdD5cXHJcXG4gICAgPGRpdiB2LWlmPVxcXCIkc2xvdHMuYmVmb3JlfHwkc2xvdHMuYWZ0ZXJcXFwiIGNsYXNzPVxcXCJpbnB1dC1ncm91cFxcXCI+XFxyXFxuICAgICAgPHNsb3QgbmFtZT1cXFwiYmVmb3JlXFxcIj48L3Nsb3Q+XFxyXFxuICAgICAgPHRleHRhcmVhIDppcz1cXFwidHlwZT09J3RleHRhcmVhJz90eXBlOidpbnB1dCdcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICA6Y29scz1cXFwiY29sc1xcXCJcXHJcXG4gICAgICAgIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiXFxyXFxuICAgICAgICA6bGlzdD1cXFwiaWRfZGF0YWxpc3RcXFwiXFxyXFxuICAgICAgICA6bWF4PVxcXCJhdHRyKG1heClcXFwiXFxyXFxuICAgICAgICA6bWF4bGVuZ3RoPVxcXCJtYXhsZW5ndGhcXFwiXFxyXFxuICAgICAgICA6bWluPVxcXCJhdHRyKG1pbilcXFwiXFxyXFxuICAgICAgICA6bmFtZT1cXFwibmFtZVxcXCJcXHJcXG4gICAgICAgIDpwbGFjZWhvbGRlcj1cXFwicGxhY2Vob2xkZXJcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOnJlcXVpcmVkPVxcXCJyZXF1aXJlZFxcXCJcXHJcXG4gICAgICAgIDpyb3dzPVxcXCJyb3dzXFxcIlxcclxcbiAgICAgICAgOnN0ZXA9XFxcInN0ZXBcXFwiXFxyXFxuICAgICAgICA6dGl0bGU9XFxcImF0dHIodGl0bGUpXFxcIlxcclxcbiAgICAgICAgOnR5cGU9XFxcInR5cGU9PSd0ZXh0YXJlYSc/bnVsbDp0eXBlXFxcIlxcclxcbiAgICAgICAgdi1tb2RlbD1cXFwidmFsXFxcIlxcclxcbiAgICAgICAgQGJsdXI9XFxcImVtaXRcXFwiIEBmb2N1cz1cXFwiZW1pdFxcXCIgQGlucHV0PVxcXCJlbWl0XFxcIlxcclxcbiAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ0eXBlIT0ndGV4dGFyZWEnJiZlbnRlclN1Ym1pdCYmc3VibWl0KClcXFwiXFxyXFxuICAgICAgPjwvdGV4dGFyZWE+XFxyXFxuICAgICAgPGRpdiB2LWlmPVxcXCJjbGVhckJ1dHRvbiAmJiB2YWx1ZVxcXCIgOmNsYXNzPVxcXCJ7aWNvbjppY29ufVxcXCI+XFxyXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwidmFsdWUgPSAnJ1xcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgICA8ZGl2IHYtaWY9XFxcImljb25cXFwiIGNsYXNzPVxcXCJpY29uXFxcIj5cXHJcXG4gICAgICAgIDxzcGFuIHYtaWY9XFxcImljb24mJnZhbGlkIT09bnVsbFxcXCIgOmNsYXNzPVxcXCJbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCdnbHlwaGljb24tJysodmFsaWQ/J29rJzoncmVtb3ZlJyldXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICAgIDxzbG90IG5hbWU9XFxcImFmdGVyXFxcIj48L3Nsb3Q+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8dGVtcGxhdGUgdi1lbHNlPlxcclxcbiAgICAgIDx0ZXh0YXJlYSA6aXM9XFxcInR5cGU9PSd0ZXh0YXJlYSc/dHlwZTonaW5wdXQnXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiByZWY9XFxcImlucHV0XFxcIlxcclxcbiAgICAgICAgOmNvbHM9XFxcImNvbHNcXFwiXFxyXFxuICAgICAgICA6ZGlzYWJsZWQ9XFxcImRpc2FibGVkXFxcIlxcclxcbiAgICAgICAgOmxpc3Q9XFxcImlkX2RhdGFsaXN0XFxcIlxcclxcbiAgICAgICAgOm1heD1cXFwiYXR0cihtYXgpXFxcIlxcclxcbiAgICAgICAgOm1heGxlbmd0aD1cXFwibWF4bGVuZ3RoXFxcIlxcclxcbiAgICAgICAgOm1pbj1cXFwiYXR0cihtaW4pXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cGxhY2Vob2xkZXI9XFxcInBsYWNlaG9sZGVyXFxcIlxcclxcbiAgICAgICAgOnJlYWRvbmx5PVxcXCJyZWFkb25seVxcXCJcXHJcXG4gICAgICAgIDpyZXF1aXJlZD1cXFwicmVxdWlyZWRcXFwiXFxyXFxuICAgICAgICA6cm93cz1cXFwicm93c1xcXCJcXHJcXG4gICAgICAgIDpzdGVwPVxcXCJzdGVwXFxcIlxcclxcbiAgICAgICAgOnRpdGxlPVxcXCJhdHRyKHRpdGxlKVxcXCJcXHJcXG4gICAgICAgIDp0eXBlPVxcXCJ0eXBlPT0ndGV4dGFyZWEnP251bGw6dHlwZVxcXCJcXHJcXG4gICAgICAgIHYtbW9kZWw9XFxcInZhbFxcXCJcXHJcXG4gICAgICAgIEBibHVyPVxcXCJlbWl0XFxcIiBAZm9jdXM9XFxcImVtaXRcXFwiIEBpbnB1dD1cXFwiZW1pdFxcXCJcXHJcXG4gICAgICAgIEBrZXl1cC5lbnRlcj1cXFwidHlwZSE9J3RleHRhcmVhJyYmZW50ZXJTdWJtaXQmJnN1Ym1pdCgpXFxcIlxcclxcbiAgICAgID48L3RleHRhcmVhPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImNsZWFyQnV0dG9uICYmIHZhbFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcInZhbCA9ICcnXFxcIj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImljb24mJnZhbGlkIT09bnVsbFxcXCIgOmNsYXNzPVxcXCJbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCdnbHlwaGljb24tJysodmFsaWQ/J29rJzoncmVtb3ZlJyldXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcclxcbiAgICA8L3RlbXBsYXRlPlxcclxcbiAgICA8ZGF0YWxpc3Qgdi1pZj1cXFwiaWRfZGF0YWxpc3RcXFwiIDppZD1cXFwiaWRfZGF0YWxpc3RcXFwiPlxcclxcbiAgICAgIDxvcHRpb24gdi1mb3I9XFxcIm9wYyBpbiBvcHRpb25zXFxcIiA6dmFsdWU9XFxcIm9wY1xcXCI+PC9vcHRpb24+XFxyXFxuICAgIDwvZGF0YWxpc3Q+XFxyXFxuICAgIDxkaXYgdi1pZj1cXFwic2hvd0hlbHBcXFwiIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIiBAY2xpY2s9XFxcImZvY3VzXFxcIj57e2hlbHB9fTwvZGl2PlxcclxcbiAgICA8ZGl2IHYtaWY9XFxcInNob3dFcnJvclxcXCIgY2xhc3M9XFxcImhlbHAtYmxvY2sgd2l0aC1lcnJvcnNcXFwiIEBjbGljaz1cXFwiZm9jdXNcXFwiPnt7ZXJyb3JUZXh0fX08L2Rpdj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2NvZXJjZSwgZGVsYXllciwgdHJhbnNsYXRpb25zfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xcclxcbmltcG9ydCAkIGZyb20gJy4vdXRpbHMvTm9kZUxpc3QuanMnXFxyXFxuXFxyXFxudmFyIERFTEFZID0gMzAwXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGNvbHM6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBkYXRhbGlzdDoge3R5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgZGlzYWJsZWQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGVudGVyU3VibWl0OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBlcnJvcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGhlbHA6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBoaWRlSGVscDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWV9LFxcclxcbiAgICBpY29uOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYWJlbDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxhbmc6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZX0sXFxyXFxuICAgIG1hc2s6IG51bGwsXFxyXFxuICAgIG1hc2tEZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMTAwfSxcXHJcXG4gICAgbWF0Y2g6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtYXg6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtYXhsZW5ndGg6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtaW46IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtaW5sZW5ndGg6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDB9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcGF0dGVybjoge2RlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBwbGFjZWhvbGRlcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHJlYWRvbmx5OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICByZXF1aXJlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgcm93czoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogM30sXFxyXFxuICAgIHN0ZXA6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB0eXBlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGV4dCd9LFxcclxcbiAgICB1cmw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB1cmxNYXA6IHt0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbGlkYXRpb25EZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMjUwfSxcXHJcXG4gICAgdmFsdWU6IHtkZWZhdWx0OiBudWxsfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZVxcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZGF0YWxpc3QsXFxyXFxuICAgICAgdmFsLFxcclxcbiAgICAgIHZhbGlkOiBudWxsLFxcclxcbiAgICAgIHRpbWVvdXQ6IG51bGxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGNhblZhbGlkYXRlICgpIHsgcmV0dXJuICF0aGlzLmRpc2FibGVkICYmICF0aGlzLnJlYWRvbmx5ICYmICh0aGlzLnJlcXVpcmVkIHx8IHRoaXMucmVnZXggfHwgdGhpcy5uYXRpdmVWYWxpZGF0ZSB8fCB0aGlzLm1hdGNoICE9PSBudWxsKSB9LFxcclxcbiAgICBlcnJvclRleHQgKCkge1xcclxcbiAgICAgIGxldCB2YWx1ZSA9IHRoaXMudmFsdWVcXHJcXG4gICAgICBsZXQgZXJyb3IgPSBbdGhpcy5lcnJvcl1cXHJcXG4gICAgICBpZiAoIXZhbHVlICYmIHRoaXMucmVxdWlyZWQpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0LnJlcXVpcmVkLnRvTG93ZXJDYXNlKCkgKyAnKScpXFxyXFxuICAgICAgaWYgKHZhbHVlICYmICh2YWx1ZS5sZW5ndGggPCB0aGlzLm1pbmxlbmd0aCkpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0Lm1pbkxlbmd0aC50b0xvd2VyQ2FzZSgpICsgJzogJyArIHRoaXMubWlubGVuZ3RoICsgJyknKVxcclxcbiAgICAgIHJldHVybiBlcnJvci5qb2luKCcgJylcXHJcXG4gICAgfSxcXHJcXG4gICAgaWRfZGF0YWxpc3QgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLnR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdGhpcy5kYXRhbGlzdCBpbnN0YW5jZW9mIEFycmF5KSB7XFxyXFxuICAgICAgICBpZiAoIXRoaXMuX2lkX2RhdGFsaXN0KSB7XFxyXFxuICAgICAgICAgIGlmICghdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCkgeyB0aGlzLiRyb290LmlkX2RhdGFsaXN0ID0gMCB9XFxyXFxuICAgICAgICAgIHRoaXMuX2lkX2RhdGFsaXN0ID0gJ2lucHV0LWRhdGFsaXN0JyArIHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QrK1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkX2RhdGFsaXN0XFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiBudWxsXFxyXFxuICAgIH0sXFxyXFxuICAgIGlucHV0ICgpIHsgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXQgfSxcXHJcXG4gICAgbmF0aXZlVmFsaWRhdGUgKCkgeyByZXR1cm4gKHRoaXMuaW5wdXQgfHwge30pLmNoZWNrVmFsaWRpdHkgJiYgKH5bJ3VybCcsICdlbWFpbCddLmluZGV4T2YodGhpcy50eXBlLnRvTG93ZXJDYXNlKCkpIHx8IHRoaXMubWluIHx8IHRoaXMubWF4KSB9LFxcclxcbiAgICByZWdleCAoKSB7IHJldHVybiBjb2VyY2UucGF0dGVybih0aGlzLnBhdHRlcm4pIH0sXFxyXFxuICAgIHNob3dFcnJvciAoKSB7IHJldHVybiB0aGlzLmVycm9yICYmIHRoaXMudmFsaWQgPT09IGZhbHNlIH0sXFxyXFxuICAgIHNob3dIZWxwICgpIHsgcmV0dXJuIHRoaXMuaGVscCAmJiAoIXRoaXMuc2hvd0Vycm9yIHx8ICF0aGlzLmhpZGVIZWxwKSB9LFxcclxcbiAgICB0ZXh0ICgpIHsgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpIH0sXFxyXFxuICAgIHRpdGxlICgpIHsgcmV0dXJuIHRoaXMuZXJyb3JUZXh0IHx8IHRoaXMuaGVscCB8fCAnJyB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgZGF0YWxpc3QgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkICYmIHZhbCBpbnN0YW5jZW9mIEFycmF5KSB7IHRoaXMub3B0aW9ucyA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIG1hdGNoICh2YWwpIHsgdGhpcy5ldmFsKCkgfSxcXHJcXG4gICAgb3B0aW9ucyAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ29wdGlvbnMnLCB2YWwpXFxyXFxuICAgIH0sXFxyXFxuICAgIHVybCAodmFsKSB7XFxyXFxuICAgICAgdGhpcy5fdXJsKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkge1xcclxcbiAgICAgICAgaWYgKHRoaXMubWFzayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XFxyXFxuICAgICAgICAgIHZhbCA9IHRoaXMubWFzayh2YWwgfHwgJycpXFxyXFxuICAgICAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XFxyXFxuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzaylcXHJcXG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0Lm1hc2sgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgICAgIHRoaXMudmFsID0gdmFsXFxyXFxuICAgICAgICAgICAgfSwgaXNOYU4odGhpcy5tYXNrRGVsYXkpID8gMCA6IHRoaXMubWFza0RlbGF5KVxcclxcbiAgICAgICAgICB9XFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICB0aGlzLmV2YWwoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKVxcclxcbiAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIGF0dHIgKHZhbHVlKSB7XFxyXFxuICAgICAgcmV0dXJuIH5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IG51bGwgOiB2YWx1ZVxcclxcbiAgICB9LFxcclxcbiAgICBlbWl0IChlKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdChlLnR5cGUsIGUudHlwZSA9PSAnaW5wdXQnID8gZS50YXJnZXQudmFsdWUgOiBlKVxcclxcbiAgICAgIGlmIChlLnR5cGUgPT09ICdibHVyJyAmJiB0aGlzLmNhblZhbGlkYXRlKSB7IHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKCkgfVxcclxcbiAgICB9LFxcclxcbiAgICBldmFsICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5fdGltZW91dC5ldmFsKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5ldmFsKVxcclxcbiAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkge1xcclxcbiAgICAgICAgdGhpcy52YWxpZCA9IHRydWVcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5fdGltZW91dC5ldmFsID0gc2V0VGltZW91dCgoKSA9PiB7XFxyXFxuICAgICAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKClcXHJcXG4gICAgICAgICAgdGhpcy5fdGltZW91dC5ldmFsID0gbnVsbFxcclxcbiAgICAgICAgfSwgdGhpcy52YWxpZGF0aW9uRGVsYXkpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBmb2N1cyAoKSB7IHRoaXMuaW5wdXQuZm9jdXMoKSB9LFxcclxcbiAgICBzdWJtaXQgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLiRwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcXHJcXG4gICAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQudmFsaWRhdGUoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZiAodGhpcy5pbnB1dC5mb3JtKSB7XFxyXFxuICAgICAgICBjb25zdCBpbnZhbGlkcyA9ICQoJy5mb3JtLWdyb3VwLnZhbGlkYXRlOm5vdCguaGFzLXN1Y2Nlc3MpJywgdGhpcy5pbnB1dC5mb3JtKVxcclxcbiAgICAgICAgaWYgKGludmFsaWRzLmxlbmd0aCkge1xcclxcbiAgICAgICAgICBpbnZhbGlkcy5maW5kKCdpbnB1dCx0ZXh0YXJlYSxzZWxlY3QnKVswXS5mb2N1cygpXFxyXFxuICAgICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgICB0aGlzLmlucHV0LmZvcm0uc3VibWl0KClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbGlkYXRlICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuY2FuVmFsaWRhdGUpIHsgcmV0dXJuIHRydWUgfVxcclxcbiAgICAgIGxldCB2YWx1ZSA9ICh0aGlzLnZhbCB8fCAnJykudHJpbSgpXFxyXFxuICAgICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gIXRoaXMucmVxdWlyZWQgfVxcclxcbiAgICAgIGlmICh0aGlzLm1hdGNoICE9PSBudWxsKSB7IHJldHVybiB0aGlzLm1hdGNoID09PSB2YWx1ZSB9XFxyXFxuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgaWYgKHRoaXMubmF0aXZlVmFsaWRhdGUgJiYgIXRoaXMuaW5wdXQuY2hlY2tWYWxpZGl0eSgpKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgaWYgKHRoaXMucmVnZXgpIHtcXHJcXG4gICAgICAgIGlmICghKHRoaXMucmVnZXggaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHRoaXMucmVnZXgodGhpcy52YWx1ZSkgOiB0aGlzLnJlZ2V4LnRlc3QodGhpcy52YWx1ZSkpKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIHJlc2V0KCkge1xcclxcbiAgICAgIHRoaXMudmFsdWUgPSAnJ1xcclxcbiAgICAgIHRoaXMudmFsaWQgPSBudWxsXFxyXFxuICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzaylcXHJcXG4gICAgICBpZiAodGhpcy5fdGltZW91dC5ldmFsKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5ldmFsKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX2lucHV0ID0gdHJ1ZVxcclxcbiAgICB0aGlzLl90aW1lb3V0ID0ge31cXHJcXG4gICAgbGV0IHBhcmVudCA9IHRoaXMuJHBhcmVudFxcclxcbiAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHsgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQgfVxcclxcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xcclxcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50XFxyXFxuICAgIH1cXHJcXG4gICAgdGhpcy5fdXJsID0gZGVsYXllcihmdW5jdGlvbiAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCB8fCB0aGlzLl9sb2FkaW5nKSB7IHJldHVybiB9XFxyXFxuICAgICAgdGhpcy5fbG9hZGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihyZXNwb25zZSA9PiB7XFxyXFxuICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXVxcclxcbiAgICAgICAgdHJ5IHsgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSkgfSBjYXRjaCAoZSkge31cXHJcXG4gICAgICAgIGlmICh0aGlzLnVybE1hcCkgeyBkYXRhID0gZGF0YS5tYXAodGhpcy51cmxNYXApIH1cXHJcXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGRhdGFcXHJcXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSwgcmVzcG9uc2UgPT4ge1xcclxcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcXHJcXG4gICAgICB9KVxcclxcbiAgICB9LCBERUxBWSlcXHJcXG4gICAgaWYgKHRoaXMudXJsKSB0aGlzLl91cmwoKVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICAvLyAkKHRoaXMuaW5wdXQpLm9uKCdmb2N1cycsIGUgPT4geyB0aGlzLiRlbWl0KCdmb2N1cycsIGUpIH0pLm9uKCdibHVyJywgZSA9PiB7XFxyXFxuICAgIC8vICAgaWYgKHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XFxyXFxuICAgIC8vICAgdGhpcy4kZW1pdCgnYmx1cicsIGUpXFxyXFxuICAgIC8vIH0pXFxyXFxuICB9LFxcclxcbiAgYmVmb3JlRGVzdHJveSAoKSB7XFxyXFxuICAgIC8vICQodGhpcy5pbnB1dCkub2ZmKClcXHJcXG4gICAgaWYgKHRoaXMuX3BhcmVudCkge1xcclxcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSlcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbi5mb3JtLWdyb3VwIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG59XFxyXFxubGFiZWx+LmNsb3NlIHtcXHJcXG4gIHRvcDogMjVweDtcXHJcXG59XFxyXFxuLmlucHV0LWdyb3VwPi5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XFxyXFxuICB3aWR0aDowO1xcclxcbiAgei1pbmRleDogMztcXHJcXG59XFxyXFxuLmNsb3NlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmhhcy1mZWVkYmFjayAuY2xvc2Uge1xcclxcbiAgcmlnaHQ6IDIwcHg7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxMTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0dmFyIERFTEFZID0gMzAwO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBjbGVhckJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgY29sczogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGRhdGFsaXN0OiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZW50ZXJTdWJtaXQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGVycm9yOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgaGVscDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGhpZGVIZWxwOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGljb246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhYmVsOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgbWFzazogbnVsbCxcblx0ICAgIG1hc2tEZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDEwMCB9LFxuXHQgICAgbWF0Y2g6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtYXg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtYXhsZW5ndGg6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtaW46IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtaW5sZW5ndGg6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG5cdCAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgcGF0dGVybjogeyBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICByZXF1aXJlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgcm93czogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDMgfSxcblx0ICAgIHN0ZXA6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RleHQnIH0sXG5cdCAgICB1cmw6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB1cmxNYXA6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbGlkYXRpb25EZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDI1MCB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogbnVsbCB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBvcHRpb25zOiB0aGlzLmRhdGFsaXN0LFxuXHQgICAgICB2YWw6IHZhbCxcblx0ICAgICAgdmFsaWQ6IG51bGwsXG5cdCAgICAgIHRpbWVvdXQ6IG51bGxcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGNhblZhbGlkYXRlOiBmdW5jdGlvbiBjYW5WYWxpZGF0ZSgpIHtcblx0ICAgICAgcmV0dXJuICF0aGlzLmRpc2FibGVkICYmICF0aGlzLnJlYWRvbmx5ICYmICh0aGlzLnJlcXVpcmVkIHx8IHRoaXMucmVnZXggfHwgdGhpcy5uYXRpdmVWYWxpZGF0ZSB8fCB0aGlzLm1hdGNoICE9PSBudWxsKTtcblx0ICAgIH0sXG5cdCAgICBlcnJvclRleHQ6IGZ1bmN0aW9uIGVycm9yVGV4dCgpIHtcblx0ICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcblx0ICAgICAgdmFyIGVycm9yID0gW3RoaXMuZXJyb3JdO1xuXHQgICAgICBpZiAoIXZhbHVlICYmIHRoaXMucmVxdWlyZWQpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0LnJlcXVpcmVkLnRvTG93ZXJDYXNlKCkgKyAnKScpO1xuXHQgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoIDwgdGhpcy5taW5sZW5ndGgpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0Lm1pbkxlbmd0aC50b0xvd2VyQ2FzZSgpICsgJzogJyArIHRoaXMubWlubGVuZ3RoICsgJyknKTtcblx0ICAgICAgcmV0dXJuIGVycm9yLmpvaW4oJyAnKTtcblx0ICAgIH0sXG5cdCAgICBpZF9kYXRhbGlzdDogZnVuY3Rpb24gaWRfZGF0YWxpc3QoKSB7XG5cdCAgICAgIGlmICh0aGlzLnR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdGhpcy5kYXRhbGlzdCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLl9pZF9kYXRhbGlzdCkge1xuXHQgICAgICAgICAgaWYgKCF0aGlzLiRyb290LmlkX2RhdGFsaXN0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QgPSAwO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgdGhpcy5faWRfZGF0YWxpc3QgPSAnaW5wdXQtZGF0YWxpc3QnICsgdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCsrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5faWRfZGF0YWxpc3Q7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9LFxuXHQgICAgaW5wdXQ6IGZ1bmN0aW9uIGlucHV0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dDtcblx0ICAgIH0sXG5cdCAgICBuYXRpdmVWYWxpZGF0ZTogZnVuY3Rpb24gbmF0aXZlVmFsaWRhdGUoKSB7XG5cdCAgICAgIHJldHVybiAodGhpcy5pbnB1dCB8fCB7fSkuY2hlY2tWYWxpZGl0eSAmJiAoflsndXJsJywgJ2VtYWlsJ10uaW5kZXhPZih0aGlzLnR5cGUudG9Mb3dlckNhc2UoKSkgfHwgdGhpcy5taW4gfHwgdGhpcy5tYXgpO1xuXHQgICAgfSxcblx0ICAgIHJlZ2V4OiBmdW5jdGlvbiByZWdleCgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UucGF0dGVybih0aGlzLnBhdHRlcm4pO1xuXHQgICAgfSxcblx0ICAgIHNob3dFcnJvcjogZnVuY3Rpb24gc2hvd0Vycm9yKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5lcnJvciAmJiB0aGlzLnZhbGlkID09PSBmYWxzZTtcblx0ICAgIH0sXG5cdCAgICBzaG93SGVscDogZnVuY3Rpb24gc2hvd0hlbHAoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmhlbHAgJiYgKCF0aGlzLnNob3dFcnJvciB8fCAhdGhpcy5oaWRlSGVscCk7XG5cdCAgICB9LFxuXHQgICAgdGV4dDogZnVuY3Rpb24gdGV4dCgpIHtcblx0ICAgICAgcmV0dXJuICgwLCBfdXRpbHMudHJhbnNsYXRpb25zKSh0aGlzLmxhbmcpO1xuXHQgICAgfSxcblx0ICAgIHRpdGxlOiBmdW5jdGlvbiB0aXRsZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZXJyb3JUZXh0IHx8IHRoaXMuaGVscCB8fCAnJztcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBkYXRhbGlzdDogZnVuY3Rpb24gZGF0YWxpc3QodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkICYmIHZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgICAgdGhpcy5vcHRpb25zID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbWF0Y2g6IGZ1bmN0aW9uIG1hdGNoKHZhbCkge1xuXHQgICAgICB0aGlzLmV2YWwoKTtcblx0ICAgIH0sXG5cdCAgICBvcHRpb25zOiBmdW5jdGlvbiBvcHRpb25zKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkgdGhpcy4kZW1pdCgnb3B0aW9ucycsIHZhbCk7XG5cdCAgICB9LFxuXHQgICAgdXJsOiBmdW5jdGlvbiB1cmwodmFsKSB7XG5cdCAgICAgIHRoaXMuX3VybCgpO1xuXHQgICAgfSxcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwsIG9sZCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgaWYgKF92YWwgIT09IG9sZCkge1xuXHQgICAgICAgIGlmICh0aGlzLm1hc2sgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHQgICAgICAgICAgX3ZhbCA9IHRoaXMubWFzayhfdmFsIHx8ICcnKTtcblx0ICAgICAgICAgIGlmICh0aGlzLnZhbCAhPT0gX3ZhbCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fdGltZW91dC5tYXNrKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5tYXNrKTtcblx0ICAgICAgICAgICAgdGhpcy5fdGltZW91dC5tYXNrID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgX3RoaXMudmFsID0gX3ZhbDtcblx0ICAgICAgICAgICAgfSwgaXNOYU4odGhpcy5tYXNrRGVsYXkpID8gMCA6IHRoaXMubWFza0RlbGF5KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5ldmFsKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGF0dHI6IGZ1bmN0aW9uIGF0dHIodmFsdWUpIHtcblx0ICAgICAgcmV0dXJuIH5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IG51bGwgOiB2YWx1ZTtcblx0ICAgIH0sXG5cdCAgICBlbWl0OiBmdW5jdGlvbiBlbWl0KGUpIHtcblx0ICAgICAgdGhpcy4kZW1pdChlLnR5cGUsIGUudHlwZSA9PSAnaW5wdXQnID8gZS50YXJnZXQudmFsdWUgOiBlKTtcblx0ICAgICAgaWYgKGUudHlwZSA9PT0gJ2JsdXInICYmIHRoaXMuY2FuVmFsaWRhdGUpIHtcblx0ICAgICAgICB0aGlzLnZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZXZhbDogZnVuY3Rpb24gX2V2YWwoKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKHRoaXMuX3RpbWVvdXQuZXZhbCkgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQuZXZhbCk7XG5cdCAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkge1xuXHQgICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuX3RpbWVvdXQuZXZhbCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgX3RoaXMyLnZhbGlkID0gX3RoaXMyLnZhbGlkYXRlKCk7XG5cdCAgICAgICAgICBfdGhpczIuX3RpbWVvdXQuZXZhbCA9IG51bGw7XG5cdCAgICAgICAgfSwgdGhpcy52YWxpZGF0aW9uRGVsYXkpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHQgICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgc3VibWl0OiBmdW5jdGlvbiBzdWJtaXQoKSB7XG5cdCAgICAgIGlmICh0aGlzLiRwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LnZhbGlkYXRlKCk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMuaW5wdXQuZm9ybSkge1xuXHQgICAgICAgIHZhciBpbnZhbGlkcyA9ICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCcuZm9ybS1ncm91cC52YWxpZGF0ZTpub3QoLmhhcy1zdWNjZXNzKScsIHRoaXMuaW5wdXQuZm9ybSk7XG5cdCAgICAgICAgaWYgKGludmFsaWRzLmxlbmd0aCkge1xuXHQgICAgICAgICAgaW52YWxpZHMuZmluZCgnaW5wdXQsdGV4dGFyZWEsc2VsZWN0JylbMF0uZm9jdXMoKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5pbnB1dC5mb3JtLnN1Ym1pdCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgaWYgKCF0aGlzLmNhblZhbGlkYXRlKSB7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIHZhbHVlID0gKHRoaXMudmFsIHx8ICcnKS50cmltKCk7XG5cdCAgICAgIGlmICghdmFsdWUpIHtcblx0ICAgICAgICByZXR1cm4gIXRoaXMucmVxdWlyZWQ7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMubWF0Y2ggIT09IG51bGwpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5tYXRjaCA9PT0gdmFsdWU7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLm5hdGl2ZVZhbGlkYXRlICYmICF0aGlzLmlucHV0LmNoZWNrVmFsaWRpdHkoKSkge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5yZWdleCkge1xuXHQgICAgICAgIGlmICghKHRoaXMucmVnZXggaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHRoaXMucmVnZXgodGhpcy52YWx1ZSkgOiB0aGlzLnJlZ2V4LnRlc3QodGhpcy52YWx1ZSkpKSB7XG5cdCAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcblx0ICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuXHQgICAgICB0aGlzLnZhbGlkID0gbnVsbDtcblx0ICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzayk7XG5cdCAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lucHV0ID0gdHJ1ZTtcblx0ICAgIHRoaXMuX3RpbWVvdXQgPSB7fTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgICAgdGhpcy5fdXJsID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCB8fCB0aGlzLl9sb2FkaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0ICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdCAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICBpZiAoX3RoaXMzLnVybE1hcCkge1xuXHQgICAgICAgICAgZGF0YSA9IGRhdGEubWFwKF90aGlzMy51cmxNYXApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBfdGhpczMub3B0aW9ucyA9IGRhdGE7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSk7XG5cdCAgICB9LCBERUxBWSk7XG5cdCAgICBpZiAodGhpcy51cmwpIHRoaXMuX3VybCgpO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIC8vICQodGhpcy5pbnB1dCkub24oJ2ZvY3VzJywgZSA9PiB7IHRoaXMuJGVtaXQoJ2ZvY3VzJywgZSkgfSkub24oJ2JsdXInLCBlID0+IHtcblx0ICAgIC8vICAgaWYgKHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XG5cdCAgICAvLyAgIHRoaXMuJGVtaXQoJ2JsdXInLCBlKVxuXHQgICAgLy8gfSlcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICAvLyAkKHRoaXMuaW5wdXQpLm9mZigpXG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1ncm91cFwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgdmFsaWRhdGU6IF92bS5jYW5WYWxpZGF0ZSwgJ2hhcy1mZWVkYmFjayc6IF92bS5pY29uLCAnaGFzLWVycm9yJzogX3ZtLmNhblZhbGlkYXRlICYmIF92bS52YWxpZCA9PT0gZmFsc2UsICdoYXMtc3VjY2Vzcyc6IF92bS5jYW5WYWxpZGF0ZSAmJiBfdm0udmFsaWRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwibGFiZWxcIiwgWyhfdm0ubGFiZWwpID8gX3ZtLl9jKCdsYWJlbCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNvbnRyb2wtbGFiZWxcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxhYmVsKSldKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLmJlZm9yZSB8fCBfdm0uJHNsb3RzLmFmdGVyKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaW5wdXQtZ3JvdXBcIlxuXHQgIH0sIFtfdm0uX3QoXCJiZWZvcmVcIiksIF92bS5fdihcIiBcIiksIF92bS5fYyhfdm0udHlwZSA9PSAndGV4dGFyZWEnID8gX3ZtLnR5cGUgOiAnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJpbnB1dFwiLFxuXHQgICAgdGFnOiBcInRleHRhcmVhXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiY29sc1wiOiBfdm0uY29scyxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIFwibGlzdFwiOiBfdm0uaWRfZGF0YWxpc3QsXG5cdCAgICAgIFwibWF4XCI6IF92bS5hdHRyKF92bS5tYXgpLFxuXHQgICAgICBcIm1heGxlbmd0aFwiOiBfdm0ubWF4bGVuZ3RoLFxuXHQgICAgICBcIm1pblwiOiBfdm0uYXR0cihfdm0ubWluKSxcblx0ICAgICAgXCJuYW1lXCI6IF92bS5uYW1lLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlcixcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJvd3NcIjogX3ZtLnJvd3MsXG5cdCAgICAgIFwic3RlcFwiOiBfdm0uc3RlcCxcblx0ICAgICAgXCJ0aXRsZVwiOiBfdm0uYXR0cihfdm0udGl0bGUpLFxuXHQgICAgICBcInR5cGVcIjogX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IG51bGwgOiBfdm0udHlwZVxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImZvY3VzXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImlucHV0XCI6IFtmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnZhbCA9ICRldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgfSwgX3ZtLmVtaXRdLFxuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS50eXBlICE9ICd0ZXh0YXJlYScgJiYgX3ZtLmVudGVyU3VibWl0ICYmIF92bS5zdWJtaXQoKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0uY2xlYXJCdXR0b24gJiYgX3ZtLnZhbHVlKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgaWNvbjogX3ZtLmljb25cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbHVlID0gJydcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoXCLDl1wiKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKF92bS5pY29uKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvblwiXG5cdCAgfSwgWyhfdm0uaWNvbiAmJiBfdm0udmFsaWQgIT09IG51bGwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IFsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsaWQgPyAnb2snIDogJ3JlbW92ZScpXSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiYWZ0ZXJcIildLCAyKSA6IFtfdm0uX2MoX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IF92bS50eXBlIDogJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIHRhZzogXCJ0ZXh0YXJlYVwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImNvbHNcIjogX3ZtLmNvbHMsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkLFxuXHQgICAgICBcImxpc3RcIjogX3ZtLmlkX2RhdGFsaXN0LFxuXHQgICAgICBcIm1heFwiOiBfdm0uYXR0cihfdm0ubWF4KSxcblx0ICAgICAgXCJtYXhsZW5ndGhcIjogX3ZtLm1heGxlbmd0aCxcblx0ICAgICAgXCJtaW5cIjogX3ZtLmF0dHIoX3ZtLm1pbiksXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0ucGxhY2Vob2xkZXIsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5LFxuXHQgICAgICBcInJlcXVpcmVkXCI6IF92bS5yZXF1aXJlZCxcblx0ICAgICAgXCJyb3dzXCI6IF92bS5yb3dzLFxuXHQgICAgICBcInN0ZXBcIjogX3ZtLnN0ZXAsXG5cdCAgICAgIFwidGl0bGVcIjogX3ZtLmF0dHIoX3ZtLnRpdGxlKSxcblx0ICAgICAgXCJ0eXBlXCI6IF92bS50eXBlID09ICd0ZXh0YXJlYScgPyBudWxsIDogX3ZtLnR5cGVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0udmFsKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiYmx1clwiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJmb2N1c1wiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJpbnB1dFwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKCRldmVudC50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS52YWwgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgIH0sIF92bS5lbWl0XSxcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzKSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0udHlwZSAhPSAndGV4dGFyZWEnICYmIF92bS5lbnRlclN1Ym1pdCAmJiBfdm0uc3VibWl0KClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbCA9ICcnXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmljb24gJiYgX3ZtLnZhbGlkICE9PSBudWxsKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCAnZ2x5cGhpY29uLScgKyAoX3ZtLnZhbGlkID8gJ29rJyA6ICdyZW1vdmUnKV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9XG5cdCAgfSkgOiBfdm0uX2UoKV0sIF92bS5fdihcIiBcIiksIChfdm0uaWRfZGF0YWxpc3QpID8gX3ZtLl9jKCdkYXRhbGlzdCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiaWRcIjogX3ZtLmlkX2RhdGFsaXN0XG5cdCAgICB9XG5cdCAgfSwgX3ZtLl9sKChfdm0ub3B0aW9ucyksIGZ1bmN0aW9uKG9wYykge1xuXHQgICAgcmV0dXJuIF92bS5fYygnb3B0aW9uJywge1xuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwidmFsdWVcIjogb3BjXG5cdCAgICAgIH1cblx0ICAgIH0pXG5cdCAgfSkpIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0uc2hvd0hlbHApID8gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJoZWxwLWJsb2NrXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5mb2N1c1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5oZWxwKSldKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLnNob3dFcnJvcikgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImhlbHAtYmxvY2sgd2l0aC1lcnJvcnNcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmVycm9yVGV4dCkpXSkgOiBfdm0uX2UoKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTY1MmFkN2I5XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTE5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMClcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcTW9kYWwudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWZlN2Q1ZGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1mZTdkNWRjOFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE1vZGFsLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEyMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIxKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5tb2RhbCB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcbn1cXG4ubW9kYWwuaW4ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjUpO1xcbn1cXG4ubW9kYWwuem9vbSAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdG9wOiAzMDBweDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4zcztcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzO1xcbn1cXG4ubW9kYWwuem9vbS5pbiAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgb3BhY2l0eTogMTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9Nb2RhbC52dWU/NDU4ZmI2OWFcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQThGQTtFQUNBLDBCQUFBO0NBQ0E7QUFDQTtFQUNBLGtDQUFBO0NBQ0E7QUFDQTtFQUNBLDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSwwQkFBQTtFQUNBLHNCQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSw2QkFBQTtFQUNBLDBCQUFBO0VBQ0EscUJBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7RUFDQSx5QkFBQTtFQUNBLHdCQUFBO0VBQ0Esb0JBQUE7RUFDQSw2Q0FBQTtFQUNBLHFDQUFBO0VBQ0EsV0FBQTtDQUNBXCIsXCJmaWxlXCI6XCJNb2RhbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiByb2xlPVxcXCJkaWFsb2dcXFwiIDpjbGFzcz1cXFwiWydtb2RhbCcsZWZmZWN0XVxcXCIgQGNsaWNrPVxcXCJiYWNrQ2xvc2VcXFwiIEB0cmFuc2l0aW9uZW5kPVxcXCJ0cmFuc2l0aW9uZW5kXFxcIj5cXHJcXG4gICAgPGRpdiA6Y2xhc3M9XFxcInsnbW9kYWwtZGlhbG9nJzp0cnVlLCdtb2RhbC1sZyc6bGFyZ2UsJ21vZGFsLXNtJzpzbWFsbH1cXFwiIHJvbGU9XFxcImRvY3VtZW50XFxcIiA6c3R5bGU9XFxcInt3aWR0aDogb3B0aW9uYWxXaWR0aH1cXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcImNsb3NlXFxcIj48c3Bhbj4mdGltZXM7PC9zcGFuPjwvYnV0dG9uPlxcclxcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPjxzbG90IG5hbWU9XFxcInRpdGxlXFxcIj57e3RpdGxlfX08L3Nsb3Q+PC9oND5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICA8L3Nsb3Q+XFxyXFxuICAgICAgICA8c2xvdCBuYW1lPVxcXCJtb2RhbC1ib2R5XFxcIj48ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj48c2xvdD48L3Nsb3Q+PC9kaXY+PC9zbG90PlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdFxcXCIgQGNsaWNrPVxcXCJjbG9zZVxcXCI+e3sgY2FuY2VsVGV4dCB9fTwvYnV0dG9uPlxcclxcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcIm9rXFxcIj57eyBva1RleHQgfX08L2J1dHRvbj5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICA8L3Nsb3Q+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Z2V0U2Nyb2xsQmFyV2lkdGh9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgYmFja2Ryb3A6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlfSxcXHJcXG4gICAgY2FsbGJhY2s6IHt0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGNhbmNlbFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdDbG9zZSd9LFxcclxcbiAgICBlZmZlY3Q6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBsYXJnZToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgb2tUZXh0OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnU2F2ZSBjaGFuZ2VzJ30sXFxyXFxuICAgIHNtYWxsOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICB0aXRsZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9LFxcclxcbiAgICB2YWx1ZToge3R5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlfSxcXHJcXG4gICAgd2lkdGg6IHtkZWZhdWx0OiBudWxsfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIG9wdGlvbmFsV2lkdGggKCkge1xcclxcbiAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsKSB7XFxyXFxuICAgICAgICByZXR1cm4gbnVsbFxcclxcbiAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzSW50ZWdlcih0aGlzLndpZHRoKSkge1xcclxcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKyAncHgnXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiB0aGlzLndpZHRoXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICB2YWx1ZSAodmFsKSB7XFxyXFxuICAgICAgdGhpcy50cmFuc2l0aW9uc3RhcnQoKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBiYWNrQ2xvc2UgKGUpIHtcXHJcXG4gICAgICBpZiAodGhpcy5iYWNrZHJvcCAmJiBlLnRhcmdldCA9PT0gdGhpcy4kZWwpIHsgdGhpcy5jbG9zZSgpIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgY2xvc2UgKCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2NhbmNlbCcpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBmYWxzZSlcXHJcXG4gICAgfSxcXHJcXG4gICAgb2sgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHRoaXMuY2FsbGJhY2soKVxcclxcbiAgICAgIHRoaXMuJGVtaXQoJ29rJylcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHRydWUpXFxyXFxuICAgIH0sXFxyXFxuICAgIHRyYW5zaXRpb25zdGFydCAoKSB7XFxyXFxuICAgICAgY29uc3QgZWwgPSB0aGlzLiRlbFxcclxcbiAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5XFxyXFxuICAgICAgY29uc3Qgc2Nyb2xsQmFyV2lkdGggPSBnZXRTY3JvbGxCYXJXaWR0aCgpXFxyXFxuICAgICAgaWYgKHRoaXMudmFsdWUpIHtcXHJcXG4gICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1jb250ZW50JykuZm9jdXMoKVxcclxcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcXHJcXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZWwuY2xhc3NMaXN0LmFkZCgnaW4nKSwgMClcXHJcXG4gICAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICBpZiAoc2Nyb2xsQmFyV2lkdGggIT09IDApIHtcXHJcXG4gICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBzY3JvbGxCYXJXaWR0aCArICdweCdcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnaW4nKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdHJhbnNpdGlvbmVuZCAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XFxyXFxuICAgICAgICB0aGlzLiRlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXFxyXFxuICAgICAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuYm9keVxcclxcbiAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBudWxsXFxyXFxuICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG48c3R5bGU+XFxyXFxuLm1vZGFsIHtcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XFxyXFxufVxcclxcbi5tb2RhbC5pbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7XFxyXFxufVxcclxcbi5tb2RhbC56b29tIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0b3A6IDMwMHB4O1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxuICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxufVxcclxcbi5tb2RhbC56b29tLmluIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICBvcGFjaXR5OiAxO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfaXNJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjMpO1xuXHRcblx0dmFyIF9pc0ludGVnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNJbnRlZ2VyKTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJhY2tkcm9wOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGNhbGxiYWNrOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBjYW5jZWxUZXh0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ0Nsb3NlJyB9LFxuXHQgICAgZWZmZWN0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbGFyZ2U6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG9rVGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdTYXZlIGNoYW5nZXMnIH0sXG5cdCAgICBzbWFsbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHdpZHRoOiB7IGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIG9wdGlvbmFsV2lkdGg6IGZ1bmN0aW9uIG9wdGlvbmFsV2lkdGgoKSB7XG5cdCAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgIH0gZWxzZSBpZiAoKDAsIF9pc0ludGVnZXIyLmRlZmF1bHQpKHRoaXMud2lkdGgpKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKyAncHgnO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLndpZHRoO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy50cmFuc2l0aW9uc3RhcnQoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJhY2tDbG9zZTogZnVuY3Rpb24gYmFja0Nsb3NlKGUpIHtcblx0ICAgICAgaWYgKHRoaXMuYmFja2Ryb3AgJiYgZS50YXJnZXQgPT09IHRoaXMuJGVsKSB7XG5cdCAgICAgICAgdGhpcy5jbG9zZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdjYW5jZWwnKTtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBmYWxzZSk7XG5cdCAgICB9LFxuXHQgICAgb2s6IGZ1bmN0aW9uIG9rKCkge1xuXHQgICAgICBpZiAodGhpcy5jYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB0aGlzLmNhbGxiYWNrKCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ29rJyk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdHJ1ZSk7XG5cdCAgICB9LFxuXHQgICAgdHJhbnNpdGlvbnN0YXJ0OiBmdW5jdGlvbiB0cmFuc2l0aW9uc3RhcnQoKSB7XG5cdCAgICAgIHZhciBlbCA9IHRoaXMuJGVsO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIHZhciBzY3JvbGxCYXJXaWR0aCA9ICgwLCBfdXRpbHMuZ2V0U2Nyb2xsQmFyV2lkdGgpKCk7XG5cdCAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG5cdCAgICAgICAgZWwucXVlcnlTZWxlY3RvcignLm1vZGFsLWNvbnRlbnQnKS5mb2N1cygpO1xuXHQgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoJ2luJyk7XG5cdCAgICAgICAgfSwgMCk7XG5cdCAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgaWYgKHNjcm9sbEJhcldpZHRoICE9PSAwKSB7XG5cdCAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoICsgJ3B4Jztcblx0ICAgICAgICB9XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnaW4nKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHRyYW5zaXRpb25lbmQ6IGZ1bmN0aW9uIHRyYW5zaXRpb25lbmQoKSB7XG5cdCAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuXHQgICAgICAgIHRoaXMuJGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdCAgICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXHQgICAgICAgIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gbnVsbDtcblx0ICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDEyMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNCksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuLyoqKi8gfSxcbi8qIDEyNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMjUpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNykuTnVtYmVyLmlzSW50ZWdlcjtcblxuLyoqKi8gfSxcbi8qIDEyNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG5cdHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0XG5cdCRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge2lzSW50ZWdlcjogX193ZWJwYWNrX3JlcXVpcmVfXygxMjYpfSk7XG5cbi8qKiovIH0sXG4vKiAxMjYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDIwLjEuMi4zIE51bWJlci5pc0ludGVnZXIobnVtYmVyKVxuXHR2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKVxuXHQgICwgZmxvb3IgICAgPSBNYXRoLmZsb29yO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCl7XG5cdCAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMjcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsnbW9kYWwnLCBfdm0uZWZmZWN0XSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImRpYWxvZ1wiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uYmFja0Nsb3NlLFxuXHQgICAgICBcInRyYW5zaXRpb25lbmRcIjogX3ZtLnRyYW5zaXRpb25lbmRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczoge1xuXHQgICAgICAnbW9kYWwtZGlhbG9nJzogdHJ1ZSwgJ21vZGFsLWxnJzogX3ZtLmxhcmdlLCAnbW9kYWwtc20nOiBfdm0uc21hbGxcblx0ICAgIH0sXG5cdCAgICBzdHlsZTogKHtcblx0ICAgICAgd2lkdGg6IF92bS5vcHRpb25hbFdpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImRvY3VtZW50XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1jb250ZW50XCJcblx0ICB9LCBbX3ZtLl90KFwibW9kYWwtaGVhZGVyXCIsIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm1vZGFsLWhlYWRlclwiXG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uY2xvc2Vcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywgW192bS5fdihcIsOXXCIpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdoNCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm1vZGFsLXRpdGxlXCJcblx0ICB9LCBbX3ZtLl90KFwidGl0bGVcIiwgW192bS5fdihfdm0uX3MoX3ZtLnRpdGxlKSldKV0sIDIpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwibW9kYWwtYm9keVwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1ib2R5XCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSksIF92bS5fdihcIiBcIiksIF92bS5fdChcIm1vZGFsLWZvb3RlclwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1mb290ZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2J1dHRvbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJ0biBidG4tZGVmYXVsdFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5jbG9zZVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5jYW5jZWxUZXh0KSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJidG4gYnRuLXByaW1hcnlcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0ub2tcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0ub2tUZXh0KSldKV0pXSldLCAyKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtZmU3ZDVkYzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMjggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTI5KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxOYXZiYXIudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTM4ZjA2MTllXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zOGYwNjE5ZVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE5hdmJhci52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBpZDogJ2JzLWV4YW1wbGUtbmF2YmFyLWNvbGxhcHNlLTEnLFxuXHQgICAgICBjb2xsYXBzZWQ6IHRydWUsXG5cdCAgICAgIHN0eWxlczoge31cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHNsb3RzOiBmdW5jdGlvbiBzbG90cygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3Nsb3RDb250ZW50cztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZUNvbGxhcHNlOiBmdW5jdGlvbiB0b2dnbGVDb2xsYXBzZShlKSB7XG5cdCAgICAgIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9uYXZiYXIgPSB0cnVlO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgdHJ5IHtcblx0ICAgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgJGRyb3Bkb3duID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bj5bZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScsIF90aGlzLiRlbCkucGFyZW50KCk7XG5cdCAgICAgICAgaWYgKCRkcm9wZG93bikge1xuXHQgICAgICAgICAgJGRyb3Bkb3duLm9uKCdjbGljaycsICcuZHJvcGRvd24tdG9nZ2xlJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub24oJ2NsaWNrJywgJy5kcm9wZG93bi1tZW51PmxpPmEnLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub25CbHVyKGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICAgICRkcm9wZG93bi5lYWNoKGZ1bmN0aW9uIChjb250ZW50KSB7XG5cdCAgICAgICAgICAgICAgaWYgKCFjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KSgpO1xuXHQgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGZpbmRpbmcgZHJvcGRvd24nKTtcblx0ICAgIH1cblx0XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLiRlbCkub24oJ2NsaWNrIHRvdWNoc3RhcnQnLCAnbGk6bm90KC5kcm9wZG93bik+YScsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIF90aGlzLmNvbGxhcHNlZCA9IHRydWU7XG5cdCAgICAgIH0sIDIwMCk7XG5cdCAgICB9KS5vbkJsdXIoZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgaWYgKCFfdGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpKSB7XG5cdCAgICAgICAgX3RoaXMuY29sbGFwc2VkID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICB2YXIgaGVpZ2h0ID0gdGhpcy4kZWwub2Zmc2V0SGVpZ2h0O1xuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAndG9wJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdUb3AgPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAnYm90dG9tJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdCb3R0b20gPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZUNvbGxhcHNlKGUpO1xuXHQgICAgfSk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bicsIHRoaXMuJGVsKS5vZmYoJ2NsaWNrJykub2ZmQmx1cigpO1xuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub2ZmKCdjbGljaycpO1xuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDEzMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCduYXYnLCB7XG5cdCAgICBjbGFzczogWyduYXZiYXInLCAnbmF2YmFyLScgKyBfdm0udHlwZSwgX3ZtLnBsYWNlbWVudCA9PT0gJ3N0YXRpYycgPyAnbmF2YmFyLXN0YXRpYy10b3AnIDogJ25hdmJhci1maXhlZC0nICsgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjb250YWluZXItZmx1aWRcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5hdmJhci1oZWFkZXJcIlxuXHQgIH0sIFsoIV92bS4kc2xvdHMuY29sbGFwc2UpID8gX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXZiYXItdG9nZ2xlIGNvbGxhcHNlZFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCIsXG5cdCAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBcImZhbHNlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS50b2dnbGVDb2xsYXBzZVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJzci1vbmx5XCJcblx0ICB9LCBbX3ZtLl92KFwiVG9nZ2xlIG5hdmlnYXRpb25cIildKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvbi1iYXJcIlxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uLWJhclwiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb24tYmFyXCJcblx0ICB9KV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImNvbGxhcHNlXCIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJicmFuZFwiKV0sIDIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGNsYXNzOiBbJ25hdmJhci1jb2xsYXBzZScsIHtcblx0ICAgICAgY29sbGFwc2U6IF92bS5jb2xsYXBzZWRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXYgbmF2YmFyLW5hdlwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKSwgX3ZtLl92KFwiIFwiKSwgKF92bS4kc2xvdHMubGVmdCkgPyBfdm0uX2MoJ3VsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibmF2IG5hdmJhci1uYXYgbmF2YmFyLWxlZnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJsZWZ0XCIpXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKF92bS4kc2xvdHMucmlnaHQpID8gX3ZtLl9jKCd1bCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5hdiBuYXZiYXItbmF2IG5hdmJhci1yaWdodFwiXG5cdCAgfSwgW192bS5fdChcInJpZ2h0XCIpXSwgMikgOiBfdm0uX2UoKV0pXSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0zOGYwNjE5ZVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzIpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTMzKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXE9wdGlvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNDIwODgxMTZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTQyMDg4MTE2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gT3B0aW9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEzMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHsgdmFsdWU6IG51bGwgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHsgbG9hZGluZzogdHJ1ZSB9O1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLiRwYXJlbnQuX3NlbGVjdCkge1xuXHQgICAgICBpZiAoIXRoaXMuJHBhcmVudC5vcHRpb25zKSB7XG5cdCAgICAgICAgdGhpcy4kcGFyZW50Lm9wdGlvbnMgPSBbXTtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZWwgPSB7fTtcblx0ICAgICAgZWxbdGhpcy4kcGFyZW50Lm9wdGlvbnNMYWJlbF0gPSB0aGlzLiRlbC5pbm5lckhUTUw7XG5cdCAgICAgIGVsW3RoaXMuJHBhcmVudC5vcHRpb25zVmFsdWVdID0gdGhpcy52YWx1ZTtcblx0ICAgICAgdGhpcy4kcGFyZW50Lm9wdGlvbnMucHVzaChlbCk7XG5cdCAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29uc29sZS53YXJuKCdvcHRpb25zIG9ubHkgd29yayBpbnNpZGUgYSBzZWxlY3QgY29tcG9uZW50Jyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTMzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiAoX3ZtLmxvYWRpbmcpID8gX3ZtLl9jKCdsaScsIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMikgOiBfdm0uX2UoKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi00MjA4ODExNlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMzUpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzcpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTM4KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFBhbmVsLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1iMWUwNDYxYVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtYjFlMDQ2MWFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBQYW5lbC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzNik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtYjFlMDQ2MWEhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1BhbmVsLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtYjFlMDQ2MWEhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1BhbmVsLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWNjb3JkaW9uLXRvZ2dsZSB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5jb2xsYXBzZS1lbnRlci1hY3RpdmUsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgLjVzIGVhc2U7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG4uY29sbGFwc2UtZW50ZXIsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxufVxcclxcblxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvUGFuZWwudnVlPzYwZTc5OGUyXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF5RUE7RUFDQSxnQkFBQTtDQUNBO0FBQ0E7O0VBRUEseUJBQUE7RUFDQSxpQkFBQTtDQUNBO0FBQ0E7O0NBR0FcIixcImZpbGVcIjpcIlBhbmVsLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IDpjbGFzcz1cXFwiWydwYW5lbCcscGFuZWxUeXBlXVxcXCI+XFxyXFxuICAgIDxkaXYgOmNsYXNzPVxcXCJbJ3BhbmVsLWhlYWRpbmcnLHsnYWNjb3JkaW9uLXRvZ2dsZSc6aW5BY2NvcmRpb259XVxcXCIgQGNsaWNrLnByZXZlbnQ9XFxcImluQWNjb3JkaW9uJiZ0b2dnbGUoKVxcXCI+XFxyXFxuICAgICAgPHNsb3QgbmFtZT1cXFwiaGVhZGVyXFxcIj48aDQgY2xhc3M9XFxcInBhbmVsLXRpdGxlXFxcIj57eyBoZWFkZXIgfX08L2g0Pjwvc2xvdD5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDx0cmFuc2l0aW9uXFxyXFxuICAgICAgbmFtZT1cXFwiY29sbGFwc2VcXFwiXFxyXFxuICAgICAgQGVudGVyPVxcXCJlbnRlclxcXCJcXHJcXG4gICAgICBAYWZ0ZXItZW50ZXI9XFxcImFmdGVyRW50ZXJcXFwiXFxyXFxuICAgICAgQGJlZm9yZS1sZWF2ZT1cXFwiYmVmb3JlTGVhdmVcXFwiXFxyXFxuICAgID5cXHJcXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1jb2xsYXBzZVxcXCIgdi1pZj1cXFwib3BlblxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIj5cXHJcXG4gICAgICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvdHJhbnNpdGlvbj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBpc09wZW46IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdHlwZToge3R5cGU6IFN0cmluZywgZGVmYXVsdCA6IG51bGx9XFxyXFxuICB9LFxcclxcbiAgZGF0YSgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBvcGVuOiB0aGlzLmlzT3BlblxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaXNPcGVuKCB2YWwgKSB7XFxyXFxuICAgICAgdGhpcy5vcGVuID0gdmFsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBpbkFjY29yZGlvbiAoKSB7IHJldHVybiB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50Ll9pc0FjY29yZGlvbiB9LFxcclxcbiAgICBwYW5lbFR5cGUgKCkgeyByZXR1cm4gJ3BhbmVsLScgKyAodGhpcy50eXBlIHx8ICh0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUpIHx8ICdkZWZhdWx0JykgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgdG9nZ2xlICgpIHtcXHJcXG4gICAgICB0aGlzLm9wZW4gPSAhdGhpcy5vcGVuXFxyXFxuICAgICAgaWYgKHRoaXMuaW5BY2NvcmRpb24pIHtcXHJcXG4gICAgICAgIHRoaXMuJHBhcmVudC5vcGVuQ2hpbGQodGhpcylcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGVudGVyIChlbCkge1xcclxcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJ1xcclxcbiAgICAgIHZhciBlbmRXaWR0aCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodFxcclxcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcwcHgnXFxyXFxuICAgICAgZWwub2Zmc2V0SGVpZ2h0IC8vIGZvcmNlIHJlcGFpbnRcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSBlbmRXaWR0aDtcXHJcXG4gICAgfSxcXHJcXG4gICAgYWZ0ZXJFbnRlciAoZWwpIHtcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0bydcXHJcXG4gICAgfSxcXHJcXG4gICAgYmVmb3JlTGVhdmUgKGVsKSB7XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCkuaGVpZ2h0XFxyXFxuICAgICAgZWwub2Zmc2V0SGVpZ2h0IC8vIGZvcmNlIHJlcGFpbnRcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnMHB4J1xcclxcbiAgICB9LFxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICBpZiAodGhpcy5pc09wZW4gPT09IG51bGwpIHtcXHJcXG4gICAgICB0aGlzLm9wZW4gPSAhdGhpcy5pbkFjY29yZGlvblxcclxcbiAgICB9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uYWNjb3JkaW9uLXRvZ2dsZSB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcbi5jb2xsYXBzZS1lbnRlci1hY3RpdmUsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgLjVzIGVhc2U7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbn1cXHJcXG4uY29sbGFwc2UtZW50ZXIsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxMzcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBoZWFkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBpc09wZW46IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIG9wZW46IHRoaXMuaXNPcGVuXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBpc09wZW46IGZ1bmN0aW9uIGlzT3Blbih2YWwpIHtcblx0ICAgICAgdGhpcy5vcGVuID0gdmFsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluQWNjb3JkaW9uOiBmdW5jdGlvbiBpbkFjY29yZGlvbigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuX2lzQWNjb3JkaW9uO1xuXHQgICAgfSxcblx0ICAgIHBhbmVsVHlwZTogZnVuY3Rpb24gcGFuZWxUeXBlKCkge1xuXHQgICAgICByZXR1cm4gJ3BhbmVsLScgKyAodGhpcy50eXBlIHx8IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSB8fCAnZGVmYXVsdCcpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XG5cdCAgICAgIGlmICh0aGlzLmluQWNjb3JkaW9uKSB7XG5cdCAgICAgICAgdGhpcy4kcGFyZW50Lm9wZW5DaGlsZCh0aGlzKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGVudGVyOiBmdW5jdGlvbiBlbnRlcihlbCkge1xuXHQgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG5cdCAgICAgIHZhciBlbmRXaWR0aCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodDtcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG5cdCAgICAgIGVsLm9mZnNldEhlaWdodDsgLy8gZm9yY2UgcmVwYWludFxuXHQgICAgICBlbC5zdHlsZS5oZWlnaHQgPSBlbmRXaWR0aDtcblx0ICAgIH0sXG5cdCAgICBhZnRlckVudGVyOiBmdW5jdGlvbiBhZnRlckVudGVyKGVsKSB7XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcblx0ICAgIH0sXG5cdCAgICBiZWZvcmVMZWF2ZTogZnVuY3Rpb24gYmVmb3JlTGVhdmUoZWwpIHtcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCkuaGVpZ2h0O1xuXHQgICAgICBlbC5vZmZzZXRIZWlnaHQ7IC8vIGZvcmNlIHJlcGFpbnRcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgaWYgKHRoaXMuaXNPcGVuID09PSBudWxsKSB7XG5cdCAgICAgIHRoaXMub3BlbiA9ICF0aGlzLmluQWNjb3JkaW9uO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDEzOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWydwYW5lbCcsIF92bS5wYW5lbFR5cGVdXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsncGFuZWwtaGVhZGluZycsIHtcblx0ICAgICAgJ2FjY29yZGlvbi10b2dnbGUnOiBfdm0uaW5BY2NvcmRpb25cblx0ICAgIH1dLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0uaW5BY2NvcmRpb24gJiYgX3ZtLnRvZ2dsZSgpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiaGVhZGVyXCIsIFtfdm0uX2MoJ2g0Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicGFuZWwtdGl0bGVcIlxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5oZWFkZXIpKV0pXSldLCAyKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6IFwiY29sbGFwc2VcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiZW50ZXJcIjogX3ZtLmVudGVyLFxuXHQgICAgICBcImFmdGVyLWVudGVyXCI6IF92bS5hZnRlckVudGVyLFxuXHQgICAgICBcImJlZm9yZS1sZWF2ZVwiOiBfdm0uYmVmb3JlTGVhdmVcblx0ICAgIH1cblx0ICB9LCBbKF92bS5vcGVuKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicGFuZWwtY29sbGFwc2VcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLWJvZHlcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKSA6IF92bS5fZSgpXSldLCAxKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1iMWUwNDYxYVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxNDApXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDIpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ0KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFBvcG92ZXIudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTI0NjViZjU0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0yNDY1YmY1NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFBvcG92ZXIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTQwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDEpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTI0NjViZjU0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Qb3BvdmVyLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtMjQ2NWJmNTQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1BvcG92ZXIudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTQxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5wb3BvdmVyLnRvcCxcXHJcXG4ucG9wb3Zlci5sZWZ0LFxcclxcbi5wb3BvdmVyLnJpZ2h0LFxcclxcbi5wb3BvdmVyLmJvdHRvbSB7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuLnNjYWxlLWVudGVyIHtcXHJcXG4gIGFuaW1hdGlvbjpzY2FsZS1pbiAwLjE1cyBlYXNlLWluO1xcbn1cXG4uc2NhbGUtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzY2FsZS1vdXQgMC4xNXMgZWFzZS1vdXQ7XFxufVxcbkBrZXlmcmFtZXMgc2NhbGUtaW4ge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbn1cXG5Aa2V5ZnJhbWVzIHNjYWxlLW91dCB7XFxuMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvUG9wb3Zlci52dWU/ZTYxNjk2M2FcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQXlCQTs7OztFQUlBLGVBQUE7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxvQkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxvQkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQVwiLFwiZmlsZVwiOlwiUG9wb3Zlci52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPHNwYW4gcmVmPVxcXCJ0cmlnZ2VyXFxcIj5cXHJcXG4gICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8dHJhbnNpdGlvbiA6bmFtZT1cXFwiZWZmZWN0XFxcIj5cXHJcXG4gICAgICA8ZGl2IHJlZj1cXFwicG9wb3ZlclxcXCIgdi1pZj1cXFwic2hvd1xcXCIgOmNsYXNzPVxcXCJbJ3BvcG92ZXInLHBsYWNlbWVudF1cXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXJyb3dcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGgzIGNsYXNzPVxcXCJwb3BvdmVyLXRpdGxlXFxcIiB2LWlmPVxcXCJ0aXRsZVxcXCI+PHNsb3QgbmFtZT1cXFwidGl0bGVcXFwiPnt7dGl0bGV9fTwvc2xvdD48L2gzPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicG9wb3Zlci1jb250ZW50XFxcIj48c2xvdCBuYW1lPVxcXCJjb250ZW50XFxcIj48c3BhbiB2LWh0bWw9XFxcImNvbnRlbnRcXFwiPjwvc3Bhbj48L3Nsb3Q+PC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvdHJhbnNpdGlvbj5cXHJcXG4gIDwvc3Bhbj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IFBvcG92ZXJNaXhpbiBmcm9tICcuL3V0aWxzL3BvcG92ZXJNaXhpbnMuanMnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgbWl4aW5zOiBbUG9wb3Zlck1peGluXSxcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIHRyaWdnZXI6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljayd9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4ucG9wb3Zlci50b3AsXFxyXFxuLnBvcG92ZXIubGVmdCxcXHJcXG4ucG9wb3Zlci5yaWdodCxcXHJcXG4ucG9wb3Zlci5ib3R0b20ge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcbi5zY2FsZS1lbnRlciB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtaW4gMC4xNXMgZWFzZS1pbjtcXHJcXG59XFxyXFxuLnNjYWxlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtb3V0IDAuMTVzIGVhc2Utb3V0O1xcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNjYWxlLWluIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNjYWxlLW91dCB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE0MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3BvcG92ZXJNaXhpbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0Myk7XG5cdFxuXHR2YXIgX3BvcG92ZXJNaXhpbnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9wb3Zlck1peGlucyk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIG1peGluczogW19wb3BvdmVyTWl4aW5zMi5kZWZhdWx0XSxcblx0ICBwcm9wczoge1xuXHQgICAgdHJpZ2dlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljaycgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDE0MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgY29udGVudDogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGVmZmVjdDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdmYWRlJyB9LFxuXHQgICAgaGVhZGVyOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0b3AnIH0sXG5cdCAgICB0aXRsZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHRyaWdnZXI6IHsgdHlwZTogU3RyaW5nIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB0b3A6IDAsXG5cdCAgICAgIGxlZnQ6IDAsXG5cdCAgICAgIHNob3c6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBldmVudHM6IGZ1bmN0aW9uIGV2ZW50cygpIHtcblx0ICAgICAgcmV0dXJuIHsgY29udGV4dG1lbnU6IFsnY29udGV4dG1lbnUnXSwgaG92ZXI6IFsnbW91c2VsZWF2ZScsICdtb3VzZWVudGVyJ10sIGZvY3VzOiBbJ2JsdXInLCAnZm9jdXMnXSB9W3RoaXMudHJpZ2dlcl0gfHwgWydjbGljayddO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgYmVmb3JlRW50ZXI6IGZ1bmN0aW9uIGJlZm9yZUVudGVyKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy5wb3NpdGlvbigpO1xuXHQgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gX3RoaXMucG9zaXRpb24oKTtcblx0ICAgICAgfSwgMzApO1xuXHQgICAgfSxcblx0ICAgIHBvc2l0aW9uOiBmdW5jdGlvbiBwb3NpdGlvbigpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHBvcG92ZXIgPSBfdGhpczIuJHJlZnMucG9wb3Zlcjtcblx0ICAgICAgICB2YXIgdHJpZ2dlciA9IF90aGlzMi4kcmVmcy50cmlnZ2VyLmNoaWxkcmVuWzBdO1xuXHQgICAgICAgIHN3aXRjaCAoX3RoaXMyLnBsYWNlbWVudCkge1xuXHQgICAgICAgICAgY2FzZSAndG9wJzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgLSBwb3BvdmVyLm9mZnNldFdpZHRoIC8gMiArIHRyaWdnZXIub2Zmc2V0V2lkdGggLyAyO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgLSBwb3BvdmVyLm9mZnNldEhlaWdodDtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlICdsZWZ0Jzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgLSBwb3BvdmVyLm9mZnNldFdpZHRoO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgKyB0cmlnZ2VyLm9mZnNldEhlaWdodCAvIDIgLSBwb3BvdmVyLm9mZnNldEhlaWdodCAvIDI7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSAncmlnaHQnOlxuXHQgICAgICAgICAgICBfdGhpczIubGVmdCA9IHRyaWdnZXIub2Zmc2V0TGVmdCArIHRyaWdnZXIub2Zmc2V0V2lkdGg7XG5cdCAgICAgICAgICAgIF90aGlzMi50b3AgPSB0cmlnZ2VyLm9mZnNldFRvcCArIHRyaWdnZXIub2Zmc2V0SGVpZ2h0IC8gMiAtIHBvcG92ZXIub2Zmc2V0SGVpZ2h0IC8gMjtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlICdib3R0b20nOlxuXHQgICAgICAgICAgICBfdGhpczIubGVmdCA9IHRyaWdnZXIub2Zmc2V0TGVmdCAtIHBvcG92ZXIub2Zmc2V0V2lkdGggLyAyICsgdHJpZ2dlci5vZmZzZXRXaWR0aCAvIDI7XG5cdCAgICAgICAgICAgIF90aGlzMi50b3AgPSB0cmlnZ2VyLm9mZnNldFRvcCArIHRyaWdnZXIub2Zmc2V0SGVpZ2h0O1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgIGNvbnNvbGUud2FybignV3JvbmcgcGxhY2VtZW50IHByb3AnKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcG9wb3Zlci5zdHlsZS50b3AgPSBfdGhpczIudG9wICsgJ3B4Jztcblx0ICAgICAgICBwb3BvdmVyLnN0eWxlLmxlZnQgPSBfdGhpczIubGVmdCArICdweCc7XG5cdCAgICAgIH0pO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKGUpIHtcblx0ICAgICAgaWYgKGUgJiYgdGhpcy50cmlnZ2VyID09PSAnY29udGV4dG1lbnUnKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgIHRoaXMuc2hvdyA9ICF0aGlzLnNob3c7XG5cdCAgICAgIGlmICh0aGlzLnNob3cpIHRoaXMuYmVmb3JlRW50ZXIoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgICB2YXIgdHJpZ2dlciA9IHRoaXMuJHJlZnMudHJpZ2dlci5jaGlsZHJlblswXTtcblx0ICAgIGlmICghdHJpZ2dlcikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHRyaWdnZXIgdi1lbCBpbiB5b3VyIGNvbXBvbmVudCB0aGF0IHVzZXMgcG9wb3Zlck1peGluLicpO1xuXHRcblx0ICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycgJiYgIX50cmlnZ2VyLnRhYkluZGV4KSB7XG5cdCAgICAgIHRyaWdnZXIgPSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnYSxpbnB1dCxzZWxlY3QsdGV4dGFyZWEsYnV0dG9uJywgdHJpZ2dlcik7XG5cdCAgICAgIGlmICghdHJpZ2dlci5sZW5ndGgpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRyaWdnZXIpLm9uKGV2ZW50LCBfdGhpczMudG9nZ2xlKTtcblx0ICAgIH0pO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl90cmlnZ2VyKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLl90cmlnZ2VyKS5vZmYoKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHJlZjogXCJ0cmlnZ2VyXCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6IF92bS5lZmZlY3Rcblx0ICAgIH1cblx0ICB9LCBbKF92bS5zaG93KSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgcmVmOiBcInBvcG92ZXJcIixcblx0ICAgIGNsYXNzOiBbJ3BvcG92ZXInLCBfdm0ucGxhY2VtZW50XVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFycm93XCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgKF92bS50aXRsZSkgPyBfdm0uX2MoJ2gzJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicG9wb3Zlci10aXRsZVwiXG5cdCAgfSwgW192bS5fdChcInRpdGxlXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50aXRsZSkpXSldLCAyKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBvcG92ZXItY29udGVudFwiXG5cdCAgfSwgW192bS5fdChcImNvbnRlbnRcIiwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhfdm0uY29udGVudClcblx0ICAgIH1cblx0ICB9KV0pXSwgMildKSA6IF92bS5fZSgpXSldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0yNDY1YmY1NFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE0NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDYpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ3KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFByb2dyZXNzYmFyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi02OGFhMzM3NVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNjhhYTMzNzVcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBQcm9ncmVzc2Jhci52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNDYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBhbmltYXRlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFiZWw6IHsgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5vdzogeyByZXF1aXJlZDogdHJ1ZSB9LFxuXHQgICAgc3RyaXBlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGxhYmVsQm9vbDogZnVuY3Rpb24gbGFiZWxCb29sKCkge1xuXHQgICAgICByZXR1cm4gX3V0aWxzLmNvZXJjZS5ib29sZWFuKHRoaXMubGFiZWwpO1xuXHQgICAgfSxcblx0ICAgIG5vd051bTogZnVuY3Rpb24gbm93TnVtKCkge1xuXHQgICAgICByZXR1cm4gX3V0aWxzLmNvZXJjZS5udW1iZXIodGhpcy5ub3cpO1xuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDE0NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWydwcm9ncmVzcy1iYXInLCAncHJvZ3Jlc3MtYmFyLScgKyBfdm0udHlwZSwge1xuXHQgICAgICBhY3RpdmU6IF92bS5hbmltYXRlZCxcblx0ICAgICAgJ3Byb2dyZXNzLWJhci1zdHJpcGVkJzogX3ZtLnN0cmlwZWRcblx0ICAgIH1dLFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIHdpZHRoOiBfdm0ubm93TnVtICsgJyUnXG5cdCAgICB9KSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidGV4dENvbnRlbnRcIjogX3ZtLl9zKF92bS5sYWJlbEJvb2wgPyBfdm0ubm93TnVtICsgJyUnIDogbnVsbClcblx0ICAgIH1cblx0ICB9KVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi02OGFhMzM3NVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE0OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxNDkpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTEpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUyKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFJhZGlvLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi03NGNmZDkyY1wiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNzRjZmQ5MmNcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBSYWRpby52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1MCk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzRjZmQ5MmMhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1JhZGlvLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzRjZmQ5MmMhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1JhZGlvLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4ucmFkaW8geyBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi5yYWRpbyA+IGxhYmVsID4gaW5wdXQge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICB6LWluZGV4OiAtMTtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcbi5yYWRpbyA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAuMTVyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IC43cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxufVxcbi5yYWRpbzpub3QoLmFjdGl2ZSkgPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xcbn1cXG4ucmFkaW8gPiBsYWJlbCA+IGlucHV0OmZvY3VzIH4gLmljb24ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcbn1cXG4ucmFkaW8uYWN0aXZlID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lQanhqYVhKamJHVWdZM2c5SWpVaUlHTjVQU0kxSWlCeVBTSTBJaUJtYVd4c1BTSWpabVptSWk4K1BDOXpkbWMrKTtcXG59XFxuLnJhZGlvLmFjdGl2ZSAuYnRuLWRlZmF1bHQgeyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTtcXG59XFxuLnJhZGlvLmRpc2FibGVkID4gbGFiZWwgPiAuaWNvbixcXHJcXG4ucmFkaW8ucmVhZG9ubHkgPiBsYWJlbCA+IC5pY29uLFxcclxcbi5idG4ucmVhZG9ubHkge1xcclxcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1KTtcXHJcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICBvcGFjaXR5OiAuNjU7XFxufVxcbmxhYmVsLmJ0biA+IGlucHV0W3R5cGU9cmFkaW9dIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9SYWRpby52dWU/MjZkZTYxODRcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQW1HQSxTQUFBLG1CQUFBO0NBQUE7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsVUFBQTtFQUNBLFdBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLHVCQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLFFBQUE7RUFDQSxlQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0VBQ0EscUJBQUE7RUFDQSw2QkFBQTtFQUNBLG1DQUFBO0VBQ0EseUJBQUE7Q0FDQTtBQUNBO0VBQ0EsdUJBQUE7RUFDQSx1QkFBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsMEJBQUE7RUFDQSwwRUFBQTtDQUNBO0FBQ0E7RUFDQSwyQkFBQTtFQUNBLDhPQUFBO0NBQ0E7QUFDQSw2QkFBQSx3QkFBQTtDQUFBO0FBRUE7OztFQUdBLDBCQUFBO0VBQ0EsaUJBQUE7RUFDQSxhQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0Esb0JBQUE7RUFDQSxxQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJSYWRpby52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiA6aXM9XFxcImJ1dHRvblN0eWxlPydsYWJlbCc6J2RpdidcXFwiIEBjbGljay5wcmV2ZW50PVxcXCJ0b2dnbGVcXFwiXFxyXFxuICAgIDpjbGFzcz1cXFwiWyhidXR0b25TdHlsZT8nYnRuIGJ0bi0nK3R5cGVDb2xvcjoncmFkaW8gJyt0eXBlQ29sb3IpLHthY3RpdmU6YWN0aXZlLGRpc2FibGVkOmRpc2FibGVkLHJlYWRvbmx5OnJlYWRvbmx5fV1cXFwiXFxyXFxuICA+XFxyXFxuICAgIDx0ZW1wbGF0ZSB2LWlmPVxcXCJidXR0b25TdHlsZVxcXCI+XFxyXFxuICAgICAgPGlucHV0IHR5cGU9XFxcInJhZGlvXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJpbnB1dFxcXCJcXHJcXG4gICAgICAgIHYtc2hvdz1cXFwiIXJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgdi1tb2RlbD1cXFwiY2hlY2tcXFwiXFxyXFxuICAgICAgICA6dmFsdWU9XFxcImNoZWNrZWRWYWx1ZVxcXCJcXHJcXG4gICAgICAgIDpuYW1lPVxcXCJuYW1lXFxcIlxcclxcbiAgICAgICAgOnJlYWRvbmx5PVxcXCJyZWFkb25seVxcXCJcXHJcXG4gICAgICAgIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiXFxyXFxuICAgICAgLz5cXHJcXG4gICAgICA8c2xvdD48L3Nsb3Q+XFxyXFxuICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgIDxsYWJlbCB2LWVsc2UgY2xhc3M9XFxcIm9wZW5cXFwiPlxcclxcbiAgICAgIDxpbnB1dCB0eXBlPVxcXCJyYWRpb1xcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICB2LW1vZGVsPVxcXCJjaGVja1xcXCJcXHJcXG4gICAgICAgIDp2YWx1ZT1cXFwiY2hlY2tlZFZhbHVlXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAvPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbYWN0aXZlPydidG4tJyt0eXBlQ29sb3I6Jycse2JnOnR5cGVDb2xvcj09PSdkZWZhdWx0J31dXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiYWN0aXZlJiZ0eXBlQ29sb3I9PT0nZGVmYXVsdCdcXFwiIGNsYXNzPVxcXCJpY29uXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8L2xhYmVsPlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgY2hlY2tlZFZhbHVlOiB7ZGVmYXVsdDogdHJ1ZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcmVhZG9ubHk6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGNoZWNrOiB0aGlzLnZhbHVlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBhY3RpdmUgKCkgeyByZXR1cm4gdGhpcy5jaGVjayA9PT0gdGhpcy5jaGVja2VkVmFsdWUgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKCkgeyByZXR1cm4gdGhpcy5faW5Hcm91cCA/IHRoaXMuJHBhcmVudC52YWwgPT09IHRoaXMudmFsdWUgOiBudWxsIH0sXFxyXFxuICAgIGJ1dHRvblN0eWxlICgpIHsgcmV0dXJuIHRoaXMuYnV0dG9uIHx8ICh0aGlzLl9pbkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zKSB9LFxcclxcbiAgICB0eXBlQ29sb3IgKCkgeyByZXR1cm4gKHRoaXMudHlwZSB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC50eXBlKSkgfHwgJ2RlZmF1bHQnIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBjaGVjayAodmFsKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuY2hlY2tlZFZhbHVlID09PSB2YWwpIHtcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hlY2tlZCcsIHRydWUpXFxyXFxuICAgICAgICBpZiAodGhpcy5faW5Hcm91cCkgeyB0aGlzLiRwYXJlbnQudmFsID0gdmFsIH1cXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHBhcmVudFZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy5jaGVjayAhPT0gdmFsICYmIHRoaXMuY2hlY2tlZFZhbHVlID09PSB2YWwpIHsgdGhpcy5jaGVjayA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICB0aGlzLmNoZWNrID0gdGhpcy5jaGVja2VkVmFsdWUgPT09IHZhbCA/IHZhbCA6IG51bGxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9idG5Hcm91cCAmJiAhcGFyZW50Ll9jaGVja2JveEdyb3VwKSB7XFxyXFxuICAgICAgdGhpcy5faW5Hcm91cCA9IHRydWVcXHJcXG4gICAgICBwYXJlbnQuX3JhZGlvR3JvdXAgPSB0cnVlXFxyXFxuICAgIH1cXHJcXG4gICAgaWYgKHRoaXMuJHBhcmVudC5fcmFkaW9Hcm91cCkge1xcclxcbiAgICAgIGlmICh0aGlzLiRwYXJlbnQudmFsKSB7XFxyXFxuICAgICAgICB0aGlzLmNoZWNrID0gKHRoaXMuJHBhcmVudC52YWwgPT09IHRoaXMuY2hlY2tlZFZhbHVlKVxcclxcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGVjaykge1xcclxcbiAgICAgICAgdGhpcy4kcGFyZW50LnZhbCA9IHRoaXMuY2hlY2tlZFZhbHVlXFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBmb2N1cyAoKSB7XFxyXFxuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsgcmV0dXJuIH1cXHJcXG4gICAgICB0aGlzLmZvY3VzKClcXHJcXG4gICAgICBpZiAodGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLmNoZWNrZWRWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLl9pbkdyb3VwKSB7XFxyXFxuICAgICAgICB0aGlzLiRwYXJlbnQudmFsID0gdGhpcy5jaGVja2VkVmFsdWVcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlIHNjb3BlPlxcclxcbi5yYWRpbyB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgfVxcclxcbi5yYWRpbyA+IGxhYmVsID4gaW5wdXQge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICB6LWluZGV4OiAtMTtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxufVxcclxcbi5yYWRpbyA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAuMTVyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IC43cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxyXFxufVxcclxcbi5yYWRpbzpub3QoLmFjdGl2ZSkgPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xcclxcbn1cXHJcXG4ucmFkaW8gPiBsYWJlbCA+IGlucHV0OmZvY3VzIH4gLmljb24ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcclxcbn1cXHJcXG4ucmFkaW8uYWN0aXZlID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lQanhqYVhKamJHVWdZM2c5SWpVaUlHTjVQU0kxSWlCeVBTSTBJaUJtYVd4c1BTSWpabVptSWk4K1BDOXpkbWMrKTtcXHJcXG59XFxyXFxuLnJhZGlvLmFjdGl2ZSAuYnRuLWRlZmF1bHQgeyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTsgfVxcclxcblxcclxcbi5yYWRpby5kaXNhYmxlZCA+IGxhYmVsID4gLmljb24sXFxyXFxuLnJhZGlvLnJlYWRvbmx5ID4gbGFiZWwgPiAuaWNvbixcXHJcXG4uYnRuLnJlYWRvbmx5IHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcclxcbn1cXHJcXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPXJhZGlvXSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBidXR0b246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGNoZWNrZWRWYWx1ZTogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGNoZWNrOiB0aGlzLnZhbHVlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY2hlY2sgPT09IHRoaXMuY2hlY2tlZFZhbHVlO1xuXHQgICAgfSxcblx0ICAgIHBhcmVudFZhbHVlOiBmdW5jdGlvbiBwYXJlbnRWYWx1ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX2luR3JvdXAgPyB0aGlzLiRwYXJlbnQudmFsID09PSB0aGlzLnZhbHVlIDogbnVsbDtcblx0ICAgIH0sXG5cdCAgICBidXR0b25TdHlsZTogZnVuY3Rpb24gYnV0dG9uU3R5bGUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmJ1dHRvbiB8fCB0aGlzLl9pbkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zO1xuXHQgICAgfSxcblx0ICAgIHR5cGVDb2xvcjogZnVuY3Rpb24gdHlwZUNvbG9yKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50eXBlIHx8IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSB8fCAnZGVmYXVsdCc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgY2hlY2s6IGZ1bmN0aW9uIGNoZWNrKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy5jaGVja2VkVmFsdWUgPT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgICAgICB0aGlzLiRlbWl0KCdjaGVja2VkJywgdHJ1ZSk7XG5cdCAgICAgICAgaWYgKHRoaXMuX2luR3JvdXApIHtcblx0ICAgICAgICAgIHRoaXMuJHBhcmVudC52YWwgPSB2YWw7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy5jaGVjayAhPT0gdmFsICYmIHRoaXMuY2hlY2tlZFZhbHVlID09PSB2YWwpIHtcblx0ICAgICAgICB0aGlzLmNoZWNrID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICB0aGlzLmNoZWNrID0gdGhpcy5jaGVja2VkVmFsdWUgPT09IHZhbCA/IHZhbCA6IG51bGw7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcblx0ICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9idG5Hcm91cCAmJiAhcGFyZW50Ll9jaGVja2JveEdyb3VwKSB7XG5cdCAgICAgIHRoaXMuX2luR3JvdXAgPSB0cnVlO1xuXHQgICAgICBwYXJlbnQuX3JhZGlvR3JvdXAgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuJHBhcmVudC5fcmFkaW9Hcm91cCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50LnZhbCkge1xuXHQgICAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLiRwYXJlbnQudmFsID09PSB0aGlzLmNoZWNrZWRWYWx1ZTtcblx0ICAgICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrKSB7XG5cdCAgICAgICAgdGhpcy4kcGFyZW50LnZhbCA9IHRoaXMuY2hlY2tlZFZhbHVlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0XG5cdCAgbWV0aG9kczoge1xuXHQgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHQgICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuZm9jdXMoKTtcblx0ICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5jaGVjayA9IHRoaXMuY2hlY2tlZFZhbHVlO1xuXHQgICAgICBpZiAodGhpcy5faW5Hcm91cCkge1xuXHQgICAgICAgIHRoaXMuJHBhcmVudC52YWwgPSB0aGlzLmNoZWNrZWRWYWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDE1MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKF92bS5idXR0b25TdHlsZSA/ICdsYWJlbCcgOiAnZGl2Jywge1xuXHQgICAgdGFnOiBcImRpdlwiLFxuXHQgICAgY2xhc3M6IFsoX3ZtLmJ1dHRvblN0eWxlID8gJ2J0biBidG4tJyArIF92bS50eXBlQ29sb3IgOiAncmFkaW8gJyArIF92bS50eXBlQ29sb3IpLCB7XG5cdCAgICAgIGFjdGl2ZTogX3ZtLmFjdGl2ZSxcblx0ICAgICAgZGlzYWJsZWQ6IF92bS5kaXNhYmxlZCxcblx0ICAgICAgcmVhZG9ubHk6IF92bS5yZWFkb25seVxuXHQgICAgfV0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS50b2dnbGUoJGV2ZW50KVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uYnV0dG9uU3R5bGUpID8gW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6ICghX3ZtLnJlYWRvbmx5KSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCIhcmVhZG9ubHlcIlxuXHQgICAgfSwge1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jaGVjayksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY2hlY2tcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInJhZGlvXCIsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCIsXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJ2YWx1ZVwiOiBfdm0uY2hlY2tlZFZhbHVlLFxuXHQgICAgICBcImNoZWNrZWRcIjogX3ZtLl9xKF92bS5jaGVjaywgX3ZtLmNoZWNrZWRWYWx1ZSlcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jaGVjayA9IF92bS5jaGVja2VkVmFsdWVcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSA6IF92bS5fYygnbGFiZWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJvcGVuXCJcblx0ICB9LCBbX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwibW9kZWxcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LW1vZGVsXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmNoZWNrKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJjaGVja1wiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJpbnB1dFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwicmFkaW9cIixcblx0ICAgICAgXCJhdXRvY29tcGxldGVcIjogXCJvZmZcIixcblx0ICAgICAgXCJuYW1lXCI6IF92bS5uYW1lLFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seSxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5jaGVja2VkVmFsdWUsXG5cdCAgICAgIFwiY2hlY2tlZFwiOiBfdm0uX3EoX3ZtLmNoZWNrLCBfdm0uY2hlY2tlZFZhbHVlKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLmNoZWNrID0gX3ZtLmNoZWNrZWRWYWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb24gZHJvcGRvd24tdG9nZ2xlXCIsXG5cdCAgICBjbGFzczogW192bS5hY3RpdmUgPyAnYnRuLScgKyBfdm0udHlwZUNvbG9yIDogJycsIHtcblx0ICAgICAgYmc6IF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0J1xuXHQgICAgfV1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgKF92bS5hY3RpdmUgJiYgX3ZtLnR5cGVDb2xvciA9PT0gJ2RlZmF1bHQnKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb25cIlxuXHQgIH0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRlZmF1bHRcIildLCAyKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTc0Y2ZkOTJjXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTUzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE1NClcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1Nilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcU2VsZWN0LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtZTUxNGRiYzZcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWU1MTRkYmM2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1lNTE0ZGJjNlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFNlbGVjdC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1NSk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtZTUxNGRiYzYmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1NlbGVjdC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWU1MTRkYmM2JnNjb3BlZD10cnVlIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TZWxlY3QudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTU1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlW2RhdGEtdi1lNTE0ZGJjNl17XFxyXFxuICBoZWlnaHQ6IGF1dG87XFxyXFxuICBwYWRkaW5nLXJpZ2h0OiAyNHB4O1xcbn1cXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZVtkYXRhLXYtZTUxNGRiYzZdOmFmdGVye1xcclxcbiAgY29udGVudDogJyAnO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgcmlnaHQ6IDEzcHg7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIG1hcmdpbjogLTFweCAwIDA7XFxyXFxuICBib3JkZXItdG9wOiA0cHggZGFzaGVkO1xcclxcbiAgYm9yZGVyLXRvcDogNHB4IHNvbGlkIFxcXFw5O1xcclxcbiAgYm9yZGVyLXJpZ2h0OiA0cHggc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxuICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbn1cXG4uYnMtc2VhcmNoYm94W2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgbWFyZ2luOiA0cHggOHB4O1xcbn1cXG4uYnMtc2VhcmNoYm94IC5jbG9zZVtkYXRhLXYtZTUxNGRiYzZdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmJzLXNlYXJjaGJveCBpbnB1dFtkYXRhLXYtZTUxNGRiYzZdOmZvY3VzLFxcclxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlW2RhdGEtdi1lNTE0ZGJjNl06Zm9jdXMge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlci1jb2xvcjogIzY2YWZlOSAhaW1wb3J0YW50O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXG59XFxuLnNlY3JldFtkYXRhLXYtZTUxNGRiYzZdIHtcXHJcXG4gIGJvcmRlcjogMDtcXHJcXG4gIGNsaXA6IHJlY3QoMCAwIDAgMCk7XFxyXFxuICBoZWlnaHQ6IDFweDtcXHJcXG4gIG1hcmdpbjogLTFweDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgd2lkdGg6IDFweDtcXG59XFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU+LmNsb3NlW2RhdGEtdi1lNTE0ZGJjNl0geyBtYXJnaW4tbGVmdDogNXB4O1xcbn1cXG4ubm90aWZ5Lm91dFtkYXRhLXYtZTUxNGRiYzZdIHsgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4ubm90aWZ5LmluW2RhdGEtdi1lNTE0ZGJjNl0sXFxyXFxuLm5vdGlmeT5kaXZbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB3aWR0aDogOTYlO1xcclxcbiAgbWFyZ2luOiAwIDIlO1xcclxcbiAgbWluLWhlaWdodDogMjZweDtcXHJcXG4gIHBhZGRpbmc6IDNweCA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2UzZTNlMztcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLm5vdGlmeT5kaXZbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICB0b3A6IDVweDtcXHJcXG4gIHotaW5kZXg6IDE7XFxufVxcbi5ub3RpZnkuaW5bZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXHJcXG4gIGJvdHRvbTogNXB4O1xcbn1cXG4uYnRuLWdyb3VwLWp1c3RpZmllZCAuZHJvcGRvd24tdG9nZ2xlPnNwYW5bZGF0YS12LWU1MTRkYmM2XTpub3QoLmNsb3NlKSB7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gMThweCk7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogLTRweDtcXG59XFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLW1lbnVbZGF0YS12LWU1MTRkYmM2XSB7IHdpZHRoOiAxMDAlO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1NlbGVjdC52dWU/M2VkNWE0MjJcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQW1RQTtFQUNBLGFBQUE7RUFDQSxvQkFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsU0FBQTtFQUNBLGlCQUFBO0VBQ0EsdUJBQUE7RUFDQSx5QkFBQTtFQUNBLG9DQUFBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxnQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLGVBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBOztFQUVBLFdBQUE7RUFDQSxpQ0FBQTtFQUNBLDBFQUFBO0NBQ0E7QUFDQTtFQUNBLFVBQUE7RUFDQSxvQkFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0EsaUJBQUE7RUFDQSxXQUFBO0VBQ0EsbUJBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQSx3REFBQSxpQkFBQTtDQUFBO0FBQ0EsK0JBQUEsbUJBQUE7Q0FBQTtBQUNBOztFQUVBLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLGFBQUE7RUFDQSxpQkFBQTtFQUNBLGlCQUFBO0VBQ0Esb0JBQUE7RUFDQSwwQkFBQTtFQUNBLDRDQUFBO0VBQ0EscUJBQUE7Q0FDQTtBQUNBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsWUFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EseUJBQUE7RUFDQSxzQkFBQTtFQUNBLGlCQUFBO0VBQ0Esb0JBQUE7RUFDQSx3QkFBQTtFQUNBLG9CQUFBO0NBQ0E7QUFDQSx1REFBQSxZQUFBO0NBQUFcIixcImZpbGVcIjpcIlNlbGVjdC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiByZWY9XFxcInNlbGVjdFxcXCIgOmNsYXNzPVxcXCJjbGFzc2VzXFxcIiB2LWNsaWNrLW91dHNpZGU9XFxcImNsb3NlXFxcIj5cXHJcXG4gICAgPGRpdiByZWY9XFxcImJ0blxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBkcm9wZG93bi10b2dnbGVcXFwiIHRhYmluZGV4PVxcXCIxXFxcIiA6ZGlzYWJsZWQ9XFxcImRpc2FibGVkIHx8ICFoYXNQYXJlbnRcXFwiIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiXFxyXFxuICAgICAgQGJsdXI9XFxcImNhblNlYXJjaCA/IG51bGwgOiBjbG9zZSgpXFxcIlxcclxcbiAgICAgIEBjbGljaz1cXFwidG9nZ2xlKClcXFwiXFxyXFxuICAgICAgQGtleWRvd24uZXNjLnN0b3AucHJldmVudD1cXFwiY2xvc2VcXFwiXFxyXFxuICAgICAgQGtleWRvd24uc3BhY2Uuc3RvcC5wcmV2ZW50PVxcXCJ0b2dnbGVcXFwiXFxyXFxuICAgICAgQGtleWRvd24uZW50ZXIuc3RvcC5wcmV2ZW50PVxcXCJ0b2dnbGVcXFwiXFxyXFxuICAgID5cXHJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiYnRuLWNvbnRlbnRcXFwiIHYtaHRtbD1cXFwibG9hZGluZyA/IHRleHQubG9hZGluZyA6IHNob3dQbGFjZWhvbGRlciB8fCBzZWxlY3RlZFxcXCI+PC9zcGFuPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImNsZWFyQnV0dG9uJiZ2YWx1ZXMubGVuZ3RoXFxcIiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwiY2xlYXIoKVxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDxzZWxlY3QgcmVmPVxcXCJzZWxcXFwiIHYtbW9kZWw9XFxcInZhbFxcXCIgOm5hbWU9XFxcIm5hbWVcXFwiIGNsYXNzPVxcXCJzZWNyZXRcXFwiIDptdWx0aXBsZT1cXFwibXVsdGlwbGVcXFwiIDpyZXF1aXJlZD1cXFwicmVxdWlyZWRcXFwiIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiPlxcclxcbiAgICAgIDxvcHRpb24gdi1pZj1cXFwicmVxdWlyZWRcXFwiIHZhbHVlPVxcXCJcXFwiPjwvb3B0aW9uPlxcclxcbiAgICAgIDxvcHRpb24gdi1mb3I9XFxcIm9wdGlvbiBpbiBsaXN0XFxcIiA6dmFsdWU9XFxcIm9wdGlvbltvcHRpb25zVmFsdWVdXFxcIj57eyBvcHRpb25bb3B0aW9uc0xhYmVsXSB9fTwvb3B0aW9uPlxcclxcbiAgICA8L3NlbGVjdD5cXHJcXG4gICAgPHVsIGNsYXNzPVxcXCJkcm9wZG93bi1tZW51XFxcIj5cXHJcXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cXFwibGlzdC5sZW5ndGhcXFwiPlxcclxcbiAgICAgICAgPGxpIHYtaWY9XFxcImNhblNlYXJjaFxcXCIgY2xhc3M9XFxcImJzLXNlYXJjaGJveFxcXCI+XFxyXFxuICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiA6cGxhY2Vob2xkZXI9XFxcInNlYXJjaFRleHR8fHRleHQuc2VhcmNoXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJzZWFyY2hcXFwiXFxyXFxuICAgICAgICAgICAgdi1tb2RlbD1cXFwic2VhcmNoVmFsdWVcXFwiXFxyXFxuICAgICAgICAgICAgQGtleXVwLmVzYz1cXFwiY2xvc2VcXFwiXFxyXFxuICAgICAgICAgIC8+XFxyXFxuICAgICAgICAgIDxzcGFuIHYtc2hvdz1cXFwic2VhcmNoVmFsdWVcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJjbGVhclNlYXJjaFxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDwvbGk+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwicmVxdWlyZWQmJiFjbGVhckJ1dHRvblxcXCI+PGEgQG1vdXNlZG93bi5wcmV2ZW50PVxcXCJjbGVhcigpICYmIGNsb3NlKClcXFwiPnt7IHBsYWNlaG9sZGVyIHx8IHRleHQubm90U2VsZWN0ZWQgfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDxsaSB2LWZvcj1cXFwib3B0aW9uIGluIGZpbHRlcmVkT3B0aW9uc1xcXCIgOmlkPVxcXCJvcHRpb25bb3B0aW9uc1ZhbHVlXVxcXCI+XFxyXFxuICAgICAgICAgIDxhIEBtb3VzZWRvd24ucHJldmVudD1cXFwic2VsZWN0KG9wdGlvbltvcHRpb25zVmFsdWVdKVxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gdi1odG1sPVxcXCJvcHRpb25bb3B0aW9uc0xhYmVsXVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcXFwiIHYtc2hvdz1cXFwiaXNTZWxlY3RlZChvcHRpb25bb3B0aW9uc1ZhbHVlXSlcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgPC9hPlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgIWNsb3NlT25TZWxlY3RcXFwiIG5hbWU9XFxcImZhZGVpblxcXCI+PGRpdiBjbGFzcz1cXFwibm90aWZ5IGluXFxcIj57e2xpbWl0VGV4dH19PC9kaXY+PC90cmFuc2l0aW9uPlxcclxcbiAgICA8L3VsPlxcclxcbiAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgY2xvc2VPblNlbGVjdFxcXCIgbmFtZT1cXFwiZmFkZWluXFxcIj48ZGl2IGNsYXNzPVxcXCJub3RpZnkgb3V0XFxcIj48ZGl2Pnt7bGltaXRUZXh0fX08L2Rpdj48L2Rpdj48L3RyYW5zaXRpb24+XFxyXFxuICAgIDwhLS0gPHByZT5PcHRpb25zOiB7e2xpc3R9fTwvcHJlPiAtLT5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge3RyYW5zbGF0aW9uc30gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgQ2xpY2tPdXRzaWRlIGZyb20gJy4vZGlyZWN0aXZlcy9DbGlja091dHNpZGUuanMnXFxyXFxuXFxyXFxudmFyIHRpbWVvdXQgPSB7fVxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIGRpcmVjdGl2ZXM6IHtcXHJcXG4gICAgQ2xpY2tPdXRzaWRlXFxyXFxuICB9LFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGNsb3NlT25TZWxlY3Q6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYW5nOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2V9LFxcclxcbiAgICBsaW1pdDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMTAyNH0sXFxyXFxuICAgIG1pblNlYXJjaDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMH0sXFxyXFxuICAgIG11bHRpcGxlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgb3B0aW9uczoge3R5cGU6IEFycmF5LCBkZWZhdWx0ICgpIHsgcmV0dXJuIFtdIH19LFxcclxcbiAgICBvcHRpb25zTGFiZWw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdsYWJlbCd9LFxcclxcbiAgICBvcHRpb25zVmFsdWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd2YWx1ZSd9LFxcclxcbiAgICBwYXJlbnQ6IHtkZWZhdWx0OiB0cnVlfSxcXHJcXG4gICAgcGxhY2Vob2xkZXI6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZXF1aXJlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBzZWFyY2g6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHNlYXJjaFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB1cmw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB2YWx1ZTogbnVsbFxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGxpc3Q6IFtdLFxcclxcbiAgICAgIGxvYWRpbmc6IG51bGwsXFxyXFxuICAgICAgc2VhcmNoVmFsdWU6IG51bGwsXFxyXFxuICAgICAgc2hvdzogZmFsc2UsXFxyXFxuICAgICAgbm90aWZ5OiBmYWxzZSxcXHJcXG4gICAgICB2YWw6IG51bGwsXFxyXFxuICAgICAgdmFsaWQ6IG51bGxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGNhblNlYXJjaCAoKSB7IHJldHVybiB0aGlzLm1pblNlYXJjaCA/IHRoaXMubGlzdC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2ggOiB0aGlzLnNlYXJjaCB9LFxcclxcbiAgICBjbGFzc2VzICgpIHsgcmV0dXJuIFt7b3BlbjogdGhpcy5zaG93LCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZH0sIHRoaXMuY2xhc3MsIHRoaXMuaXNMaSA/ICdkcm9wZG93bicgOiB0aGlzLmluSW5wdXQgPyAnaW5wdXQtZ3JvdXAtYnRuJyA6ICdidG4tZ3JvdXAnXSB9LFxcclxcbiAgICBmaWx0ZXJlZE9wdGlvbnMgKCkge1xcclxcbiAgICAgIHZhciBzZWFyY2ggPSAodGhpcy5zZWFyY2hWYWx1ZSB8fCAnJykudG9Mb3dlckNhc2UoKVxcclxcbiAgICAgIHJldHVybiAhc2VhcmNoID8gdGhpcy5saXN0IDogdGhpcy5saXN0LmZpbHRlcihlbCA9PiB7XFxyXFxuICAgICAgICByZXR1cm4gfmVsW3RoaXMub3B0aW9uc0xhYmVsXS50b0xvd2VyQ2FzZSgpLnNlYXJjaChzZWFyY2gpXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgaGFzUGFyZW50ICgpIHsgcmV0dXJuIHRoaXMucGFyZW50IGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLnBhcmVudC5sZW5ndGggOiB0aGlzLnBhcmVudCB9LFxcclxcbiAgICBpbklucHV0ICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQgfSxcXHJcXG4gICAgaXNMaSAoKSB7IHJldHVybiB0aGlzLiRwYXJlbnQuX25hdmJhciB8fCB0aGlzLiRwYXJlbnQubWVudSB8fCB0aGlzLiRwYXJlbnQuX3RhYnNldCB9LFxcclxcbiAgICBsaW1pdFRleHQgKCkgeyByZXR1cm4gdGhpcy50ZXh0LmxpbWl0LnJlcGxhY2UoJ3t7bGltaXR9fScsIHRoaXMubGltaXQpIH0sXFxyXFxuICAgIHNlbGVjdGVkICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJycgfVxcclxcbiAgICAgIHZhciBzZWwgPSB0aGlzLnZhbHVlcy5tYXAodmFsID0+ICh0aGlzLmxpc3QuZmluZChvID0+IG9bdGhpcy5vcHRpb25zVmFsdWVdID09PSB2YWwpIHx8IHt9KVt0aGlzLm9wdGlvbnNMYWJlbF0pLmZpbHRlcih2YWwgPT4gdmFsICE9PSB1bmRlZmluZWQpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0ZWQnLCBzZWwpXFxyXFxuICAgICAgcmV0dXJuIHNlbC5qb2luKCcsICcpXFxyXFxuICAgIH0sXFxyXFxuICAgIHNob3dQbGFjZWhvbGRlciAoKSB7IHJldHVybiAodGhpcy52YWx1ZXMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmhhc1BhcmVudCkgPyAodGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLnRleHQubm90U2VsZWN0ZWQpIDogbnVsbCB9LFxcclxcbiAgICB0ZXh0ICgpIHsgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpIH0sXFxyXFxuICAgIHZhbHVlcyAoKSB7IHJldHVybiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwgOiB+W251bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih0aGlzLnZhbCkgPyBbXSA6IFt0aGlzLnZhbF0gfSxcXHJcXG4gICAgdmFsT3B0aW9ucyAoKSB7IHJldHVybiB0aGlzLmxpc3QubWFwKGVsID0+IGVsW3RoaXMub3B0aW9uc1ZhbHVlXSkgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIG9wdGlvbnMgKG9wdGlvbnMpIHtcXHJcXG4gICAgICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5KSB0aGlzLnNldE9wdGlvbnMob3B0aW9ucylcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAodmFsKSB7XFxyXFxuICAgICAgaWYgKHZhbCkge1xcclxcbiAgICAgICAgdGhpcy4kcmVmcy5zZWFyY2ggPyB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpIDogdGhpcy4kcmVmcy5idG4uZm9jdXMoKVxcclxcbiAgICAgICAgLy8gb25CbHVyKHRoaXMuJHJlZnMuc2VsZWN0LCBlID0+IHsgdGhpcy5zaG93ID0gZmFsc2UgfSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgLy8gb2ZmQmx1cih0aGlzLiRyZWZzLnNlbGVjdClcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHVybCAoKSB7XFxyXFxuICAgICAgdGhpcy51cmxDaGFuZ2VkKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKVxcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsgdGhpcy52YWwgPSB2YWwgPSBudWxsIH1cXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHtcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbClcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXkgJiYgdmFsLmxlbmd0aCA+IHRoaXMubGltaXQpIHtcXHJcXG4gICAgICAgIHRoaXMudmFsID0gdmFsLnNsaWNlKDAsIHRoaXMubGltaXQpXFxyXFxuICAgICAgICB0aGlzLm5vdGlmeSA9IHRydWVcXHJcXG4gICAgICAgIGlmICh0aW1lb3V0LmxpbWl0KSBjbGVhclRpbWVvdXQodGltZW91dC5saW1pdClcXHJcXG4gICAgICAgIHRpbWVvdXQubGltaXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgdGltZW91dC5saW1pdCA9IGZhbHNlXFxyXFxuICAgICAgICAgIHRoaXMubm90aWZ5ID0gZmFsc2VcXHJcXG4gICAgICAgIH0sIDE1MDApXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgY2xvc2UgKCkge1xcclxcbiAgICAgIHRoaXMuc2hvdyA9IGZhbHNlXFxyXFxuICAgIH0sXFxyXFxuICAgIGNoZWNrRGF0YSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcXHJcXG4gICAgICAgIGlmICh0aGlzLmxpbWl0IDwgMSkgeyB0aGlzLmxpbWl0ID0gMSB9XFxyXFxuICAgICAgICBpZiAoISh0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xcclxcbiAgICAgICAgICB0aGlzLnZhbCA9ICh0aGlzLnZhbCA9PT0gbnVsbCB8fCB0aGlzLnZhbCA9PT0gdW5kZWZpbmVkKSA/IFtdIDogW3RoaXMudmFsXVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsT3B0aW9uc1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbC5maWx0ZXIoZWwgPT4gfnZhbHVlcy5pbmRleE9mKGVsKSlcXHJcXG4gICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgaWYgKCF+dGhpcy52YWxPcHRpb25zLmluZGV4T2YodGhpcy52YWwpKSB7IHRoaXMudmFsID0gbnVsbCB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBjbGVhciAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDogbnVsbFxcclxcbiAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgY2xlYXJTZWFyY2ggKCkge1xcclxcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJ1xcclxcbiAgICAgIHRoaXMuJHJlZnMuc2VhcmNoLmZvY3VzKClcXHJcXG4gICAgfSxcXHJcXG4gICAgaXNTZWxlY3RlZCAodikge1xcclxcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5pbmRleE9mKHYpID4gLTFcXHJcXG4gICAgfSxcXHJcXG4gICAgc2VsZWN0ICh2KSB7XFxyXFxuICAgICAgaWYgKHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcXHJcXG4gICAgICAgIHZhciBuZXdWYWwgPSB0aGlzLnZhbC5zbGljZSgwKVxcclxcbiAgICAgICAgaWYgKH5uZXdWYWwuaW5kZXhPZih2KSkge1xcclxcbiAgICAgICAgICBuZXdWYWwuc3BsaWNlKG5ld1ZhbC5pbmRleE9mKHYpLCAxKVxcclxcbiAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgbmV3VmFsLnB1c2godilcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMudmFsID0gbmV3VmFsXFxyXFxuICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB2XFxyXFxuICAgICAgICB0aGlzLnRvZ2dsZSgpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzZXRPcHRpb25zIChvcHRpb25zKSB7XFxyXFxuICAgICAgdGhpcy5saXN0ID0gb3B0aW9ucy5tYXAoZWwgPT4ge1xcclxcbiAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgT2JqZWN0KSB7IHJldHVybiBlbCB9XFxyXFxuICAgICAgICBsZXQgb2JqID0ge31cXHJcXG4gICAgICAgIG9ialt0aGlzLm9wdGlvbnNMYWJlbF0gPSBlbFxcclxcbiAgICAgICAgb2JqW3RoaXMub3B0aW9uc1ZhbHVlXSA9IGVsXFxyXFxuICAgICAgICByZXR1cm4gb2JqXFxyXFxuICAgICAgfSlcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdvcHRpb25zJywgdGhpcy5saXN0KVxcclxcbiAgICB9LFxcclxcbiAgICB0b2dnbGUgKCkge1xcclxcbiAgICAgIHRoaXMuc2hvdyA9ICF0aGlzLnNob3dcXHJcXG4gICAgICBpZiAoIXRoaXMuc2hvdykgdGhpcy4kcmVmcy5idG4uZm9jdXMoKVxcclxcbiAgICB9LFxcclxcbiAgICB1cmxDaGFuZ2VkICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMudXJsIHx8ICF0aGlzLiRodHRwKSB7IHJldHVybiB9XFxyXFxuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxcclxcbiAgICAgIHRoaXMuJGh0dHAuZ2V0KHRoaXMudXJsKS50aGVuKHJlc3BvbnNlID0+IHtcXHJcXG4gICAgICAgIHZhciBkYXRhID0gcmVzcG9uc2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5ID8gcmVzcG9uc2UuZGF0YSA6IFtdXFxyXFxuICAgICAgICB0cnkgeyBkYXRhID0gSlNPTi5wYXJzZShkYXRhKSB9IGNhdGNoIChlKSB7fVxcclxcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zKGRhdGEpXFxyXFxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgICAgdGhpcy5jaGVja0RhdGEoKVxcclxcbiAgICAgIH0sIHJlc3BvbnNlID0+IHtcXHJcXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWRhdGUgKCkge1xcclxcbiAgICAgIHJldHVybiAhdGhpcy5yZXF1aXJlZCA/IHRydWUgOiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwubGVuZ3RoID4gMCA6IHRoaXMudmFsICE9PSBudWxsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucylcXHJcXG4gICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHRoaXMuX3NlbGVjdCA9IHRydWVcXHJcXG4gICAgaWYgKHRoaXMudmFsID09PSB1bmRlZmluZWQgfHwgIXRoaXMucGFyZW50KSB7IHRoaXMudmFsID0gbnVsbCB9XFxyXFxuICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XFxyXFxuICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbFswXVxcclxcbiAgICB9XFxyXFxuICAgIHRoaXMuY2hlY2tEYXRhKClcXHJcXG4gICAgaWYgKHRoaXMudXJsKSB0aGlzLnVybENoYW5nZWQoKVxcclxcbiAgICBsZXQgcGFyZW50ID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5fZm9ybVZhbGlkYXRvcikgeyBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudCB9XFxyXFxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XFxyXFxuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcylcXHJcXG4gICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnRcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICBpZiAodGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKVxcclxcbiAgICB0aGlzLnNldE9wdGlvbnModGhpcy5vcHRpb25zKVxcclxcbiAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWVcXHJcXG4gICAgdGhpcy5jaGVja0RhdGEoKVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICBpZiAodGhpcy5fcGFyZW50KSB7XFxyXFxuICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcylcXHJcXG4gICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKVxcclxcbiAgICB9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZSBzY29wZWQ+XFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGV7XFxyXFxuICBoZWlnaHQ6IGF1dG87XFxyXFxuICBwYWRkaW5nLXJpZ2h0OiAyNHB4O1xcclxcbn1cXHJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZTphZnRlcntcXHJcXG4gIGNvbnRlbnQ6ICcgJztcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHJpZ2h0OiAxM3B4O1xcclxcbiAgdG9wOiA1MCU7XFxyXFxuICBtYXJnaW46IC0xcHggMCAwO1xcclxcbiAgYm9yZGVyLXRvcDogNHB4IGRhc2hlZDtcXHJcXG4gIGJvcmRlci10b3A6IDRweCBzb2xpZCBcXFxcOTtcXHJcXG4gIGJvcmRlci1yaWdodDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcXHJcXG59XFxyXFxuLmJzLXNlYXJjaGJveCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBtYXJnaW46IDRweCA4cHg7XFxyXFxufVxcclxcbi5icy1zZWFyY2hib3ggLmNsb3NlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmJzLXNlYXJjaGJveCBpbnB1dDpmb2N1cyxcXHJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZTpmb2N1cyB7XFxyXFxuICBvdXRsaW5lOiAwO1xcclxcbiAgYm9yZGVyLWNvbG9yOiAjNjZhZmU5ICFpbXBvcnRhbnQ7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcclxcbn1cXHJcXG4uc2VjcmV0IHtcXHJcXG4gIGJvcmRlcjogMDtcXHJcXG4gIGNsaXA6IHJlY3QoMCAwIDAgMCk7XFxyXFxuICBoZWlnaHQ6IDFweDtcXHJcXG4gIG1hcmdpbjogLTFweDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgd2lkdGg6IDFweDtcXHJcXG59XFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU+LmNsb3NlIHsgbWFyZ2luLWxlZnQ6IDVweDt9XFxyXFxuLm5vdGlmeS5vdXQgeyBwb3NpdGlvbjogcmVsYXRpdmU7IH1cXHJcXG4ubm90aWZ5LmluLFxcclxcbi5ub3RpZnk+ZGl2IHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiA5NiU7XFxyXFxuICBtYXJnaW46IDAgMiU7XFxyXFxuICBtaW4taGVpZ2h0OiAyNnB4O1xcclxcbiAgcGFkZGluZzogM3B4IDVweDtcXHJcXG4gIGJhY2tncm91bmQ6ICNmNWY1ZjU7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjZTNlM2UzO1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA1KTtcXHJcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcclxcbn1cXHJcXG4ubm90aWZ5PmRpdiB7XFxyXFxuICB0b3A6IDVweDtcXHJcXG4gIHotaW5kZXg6IDE7XFxyXFxufVxcclxcbi5ub3RpZnkuaW4ge1xcclxcbiAgb3BhY2l0eTogLjk7XFxyXFxuICBib3R0b206IDVweDtcXHJcXG59XFxyXFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLXRvZ2dsZT5zcGFuOm5vdCguY2xvc2UpIHtcXHJcXG4gIHdpZHRoOiBjYWxjKDEwMCUgLSAxOHB4KTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAtNHB4O1xcclxcbn1cXHJcXG4uYnRuLWdyb3VwLWp1c3RpZmllZCAuZHJvcGRvd24tbWVudSB7IHdpZHRoOiAxMDAlOyB9XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE1NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgX0NsaWNrT3V0c2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xpY2tPdXRzaWRlKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0dmFyIHRpbWVvdXQgPSB7fTtcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIENsaWNrT3V0c2lkZTogX0NsaWNrT3V0c2lkZTIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIGNsZWFyQnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBjbG9zZU9uU2VsZWN0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgbGltaXQ6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMDI0IH0sXG5cdCAgICBtaW5TZWFyY2g6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG5cdCAgICBtdWx0aXBsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIG9wdGlvbnM6IHsgdHlwZTogQXJyYXksIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuXHQgICAgICAgIHJldHVybiBbXTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG9wdGlvbnNMYWJlbDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdsYWJlbCcgfSxcblx0ICAgIG9wdGlvbnNWYWx1ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd2YWx1ZScgfSxcblx0ICAgIHBhcmVudDogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlcXVpcmVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHNlYXJjaDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2VhcmNoVGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHVybDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiBudWxsXG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgbGlzdDogW10sXG5cdCAgICAgIGxvYWRpbmc6IG51bGwsXG5cdCAgICAgIHNlYXJjaFZhbHVlOiBudWxsLFxuXHQgICAgICBzaG93OiBmYWxzZSxcblx0ICAgICAgbm90aWZ5OiBmYWxzZSxcblx0ICAgICAgdmFsOiBudWxsLFxuXHQgICAgICB2YWxpZDogbnVsbFxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgY2FuU2VhcmNoOiBmdW5jdGlvbiBjYW5TZWFyY2goKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLm1pblNlYXJjaCA/IHRoaXMubGlzdC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2ggOiB0aGlzLnNlYXJjaDtcblx0ICAgIH0sXG5cdCAgICBjbGFzc2VzOiBmdW5jdGlvbiBjbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gW3sgb3BlbjogdGhpcy5zaG93LCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCB0aGlzLmNsYXNzLCB0aGlzLmlzTGkgPyAnZHJvcGRvd24nIDogdGhpcy5pbklucHV0ID8gJ2lucHV0LWdyb3VwLWJ0bicgOiAnYnRuLWdyb3VwJ107XG5cdCAgICB9LFxuXHQgICAgZmlsdGVyZWRPcHRpb25zOiBmdW5jdGlvbiBmaWx0ZXJlZE9wdGlvbnMoKSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICB2YXIgc2VhcmNoID0gKHRoaXMuc2VhcmNoVmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cdCAgICAgIHJldHVybiAhc2VhcmNoID8gdGhpcy5saXN0IDogdGhpcy5saXN0LmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gfmVsW190aGlzLm9wdGlvbnNMYWJlbF0udG9Mb3dlckNhc2UoKS5zZWFyY2goc2VhcmNoKTtcblx0ICAgICAgfSk7XG5cdCAgICB9LFxuXHQgICAgaGFzUGFyZW50OiBmdW5jdGlvbiBoYXNQYXJlbnQoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnBhcmVudCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy5wYXJlbnQubGVuZ3RoIDogdGhpcy5wYXJlbnQ7XG5cdCAgICB9LFxuXHQgICAgaW5JbnB1dDogZnVuY3Rpb24gaW5JbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgaXNMaTogZnVuY3Rpb24gaXNMaSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5fdGFic2V0O1xuXHQgICAgfSxcblx0ICAgIGxpbWl0VGV4dDogZnVuY3Rpb24gbGltaXRUZXh0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0LmxpbWl0LnJlcGxhY2UoJ3t7bGltaXR9fScsIHRoaXMubGltaXQpO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdGVkOiBmdW5jdGlvbiBzZWxlY3RlZCgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgc2VsID0gdGhpcy52YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICByZXR1cm4gKF90aGlzMi5saXN0LmZpbmQoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgICAgIHJldHVybiBvW190aGlzMi5vcHRpb25zVmFsdWVdID09PSB2YWw7XG5cdCAgICAgICAgfSkgfHwge30pW190aGlzMi5vcHRpb25zTGFiZWxdO1xuXHQgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZDtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdGVkJywgc2VsKTtcblx0ICAgICAgcmV0dXJuIHNlbC5qb2luKCcsICcpO1xuXHQgICAgfSxcblx0ICAgIHNob3dQbGFjZWhvbGRlcjogZnVuY3Rpb24gc2hvd1BsYWNlaG9sZGVyKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmhhc1BhcmVudCA/IHRoaXMucGxhY2Vob2xkZXIgfHwgdGhpcy50ZXh0Lm5vdFNlbGVjdGVkIDogbnVsbDtcblx0ICAgIH0sXG5cdCAgICB0ZXh0OiBmdW5jdGlvbiB0ZXh0KCkge1xuXHQgICAgICByZXR1cm4gKDAsIF91dGlscy50cmFuc2xhdGlvbnMpKHRoaXMubGFuZyk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwgOiB+W251bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih0aGlzLnZhbCkgPyBbXSA6IFt0aGlzLnZhbF07XG5cdCAgICB9LFxuXHQgICAgdmFsT3B0aW9uczogZnVuY3Rpb24gdmFsT3B0aW9ucygpIHtcblx0ICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cdFxuXHQgICAgICByZXR1cm4gdGhpcy5saXN0Lm1hcChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWxbX3RoaXMzLm9wdGlvbnNWYWx1ZV07XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIG9wdGlvbnM6IGZ1bmN0aW9uIG9wdGlvbnMoX29wdGlvbnMpIHtcblx0ICAgICAgaWYgKF9vcHRpb25zIGluc3RhbmNlb2YgQXJyYXkpIHRoaXMuc2V0T3B0aW9ucyhfb3B0aW9ucyk7XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyh2YWwpIHtcblx0ICAgICAgaWYgKHZhbCkge1xuXHQgICAgICAgIHRoaXMuJHJlZnMuc2VhcmNoID8gdGhpcy4kcmVmcy5zZWFyY2guZm9jdXMoKSA6IHRoaXMuJHJlZnMuYnRuLmZvY3VzKCk7XG5cdCAgICAgICAgLy8gb25CbHVyKHRoaXMuJHJlZnMuc2VsZWN0LCBlID0+IHsgdGhpcy5zaG93ID0gZmFsc2UgfSlcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIC8vIG9mZkJsdXIodGhpcy4kcmVmcy5zZWxlY3QpXG5cdCAgICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHVybDogZnVuY3Rpb24gdXJsKCkge1xuXHQgICAgICB0aGlzLnVybENoYW5nZWQoKTtcblx0ICAgIH0sXG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQgJiYgdGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoX3ZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSBfdmFsID0gbnVsbDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoX3ZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgX3ZhbCk7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoX3ZhbCBpbnN0YW5jZW9mIEFycmF5ICYmIF92YWwubGVuZ3RoID4gdGhpcy5saW1pdCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gX3ZhbC5zbGljZSgwLCB0aGlzLmxpbWl0KTtcblx0ICAgICAgICB0aGlzLm5vdGlmeSA9IHRydWU7XG5cdCAgICAgICAgaWYgKHRpbWVvdXQubGltaXQpIGNsZWFyVGltZW91dCh0aW1lb3V0LmxpbWl0KTtcblx0ICAgICAgICB0aW1lb3V0LmxpbWl0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICB0aW1lb3V0LmxpbWl0ID0gZmFsc2U7XG5cdCAgICAgICAgICBfdGhpczQubm90aWZ5ID0gZmFsc2U7XG5cdCAgICAgICAgfSwgMTUwMCk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcblx0ICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgY2hlY2tEYXRhOiBmdW5jdGlvbiBjaGVja0RhdGEoKSB7XG5cdCAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG5cdCAgICAgICAgaWYgKHRoaXMubGltaXQgPCAxKSB7XG5cdCAgICAgICAgICB0aGlzLmxpbWl0ID0gMTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCEodGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkpIHtcblx0ICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwgPT09IG51bGwgfHwgdGhpcy52YWwgPT09IHVuZGVmaW5lZCA/IFtdIDogW3RoaXMudmFsXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsT3B0aW9ucztcblx0ICAgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIHJldHVybiB+dmFsdWVzLmluZGV4T2YoZWwpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XG5cdCAgICAgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBpZiAoIX50aGlzLnZhbE9wdGlvbnMuaW5kZXhPZih0aGlzLnZhbCkpIHtcblx0ICAgICAgICAgIHRoaXMudmFsID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gW10gOiBudWxsO1xuXHQgICAgICB0aGlzLnRvZ2dsZSgpO1xuXHQgICAgfSxcblx0ICAgIGNsZWFyU2VhcmNoOiBmdW5jdGlvbiBjbGVhclNlYXJjaCgpIHtcblx0ICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuXHQgICAgICB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpO1xuXHQgICAgfSxcblx0ICAgIGlzU2VsZWN0ZWQ6IGZ1bmN0aW9uIGlzU2VsZWN0ZWQodikge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZXMuaW5kZXhPZih2KSA+IC0xO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHYpIHtcblx0ICAgICAgaWYgKHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcblx0ICAgICAgICB2YXIgbmV3VmFsID0gdGhpcy52YWwuc2xpY2UoMCk7XG5cdCAgICAgICAgaWYgKH5uZXdWYWwuaW5kZXhPZih2KSkge1xuXHQgICAgICAgICAgbmV3VmFsLnNwbGljZShuZXdWYWwuaW5kZXhPZih2KSwgMSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIG5ld1ZhbC5wdXNoKHYpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnZhbCA9IG5ld1ZhbDtcblx0ICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XG5cdCAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLnZhbCA9IHY7XG5cdCAgICAgICAgdGhpcy50b2dnbGUoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuXHQgICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblx0XG5cdCAgICAgIHRoaXMubGlzdCA9IG9wdGlvbnMubWFwKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIE9iamVjdCkge1xuXHQgICAgICAgICAgcmV0dXJuIGVsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgb2JqID0ge307XG5cdCAgICAgICAgb2JqW190aGlzNS5vcHRpb25zTGFiZWxdID0gZWw7XG5cdCAgICAgICAgb2JqW190aGlzNS5vcHRpb25zVmFsdWVdID0gZWw7XG5cdCAgICAgICAgcmV0dXJuIG9iajtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ29wdGlvbnMnLCB0aGlzLmxpc3QpO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgICBpZiAoIXRoaXMuc2hvdykgdGhpcy4kcmVmcy5idG4uZm9jdXMoKTtcblx0ICAgIH0sXG5cdCAgICB1cmxDaGFuZ2VkOiBmdW5jdGlvbiB1cmxDaGFuZ2VkKCkge1xuXHQgICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblx0XG5cdCAgICAgIGlmICghdGhpcy51cmwgfHwgIXRoaXMuJGh0dHApIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblx0ICAgICAgdGhpcy4kaHR0cC5nZXQodGhpcy51cmwpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdCAgICAgICAgdmFyIGRhdGEgPSByZXNwb25zZS5kYXRhIGluc3RhbmNlb2YgQXJyYXkgPyByZXNwb25zZS5kYXRhIDogW107XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cdCAgICAgICAgX3RoaXM2LnNldE9wdGlvbnMoZGF0YSk7XG5cdCAgICAgICAgX3RoaXM2LmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgICBfdGhpczYuY2hlY2tEYXRhKCk7XG5cdCAgICAgIH0sIGZ1bmN0aW9uIChyZXNwb25zZSkge1xuXHQgICAgICAgIF90aGlzNi5sb2FkaW5nID0gZmFsc2U7XG5cdCAgICAgIH0pO1xuXHQgICAgfSxcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgcmV0dXJuICF0aGlzLnJlcXVpcmVkID8gdHJ1ZSA6IHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLnZhbC5sZW5ndGggPiAwIDogdGhpcy52YWwgIT09IG51bGw7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucyk7XG5cdCAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWU7XG5cdCAgICB0aGlzLl9zZWxlY3QgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMudmFsID09PSB1bmRlZmluZWQgfHwgIXRoaXMucGFyZW50KSB7XG5cdCAgICAgIHRoaXMudmFsID0gbnVsbDtcblx0ICAgIH1cblx0ICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgIHRoaXMudmFsID0gdGhpcy52YWxbMF07XG5cdCAgICB9XG5cdCAgICB0aGlzLmNoZWNrRGF0YSgpO1xuXHQgICAgaWYgKHRoaXMudXJsKSB0aGlzLnVybENoYW5nZWQoKTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuXHQgICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucyk7XG5cdCAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWU7XG5cdCAgICB0aGlzLmNoZWNrRGF0YSgpO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcblx0ICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDE1NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcImNsaWNrLW91dHNpZGVcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LWNsaWNrLW91dHNpZGVcIixcblx0ICAgICAgdmFsdWU6IChfdm0uY2xvc2UpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImNsb3NlXCJcblx0ICAgIH1dLFxuXHQgICAgcmVmOiBcInNlbGVjdFwiLFxuXHQgICAgY2xhc3M6IF92bS5jbGFzc2VzXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgcmVmOiBcImJ0blwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sIGRyb3Bkb3duLXRvZ2dsZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0YWJpbmRleFwiOiBcIjFcIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWQgfHwgIV92bS5oYXNQYXJlbnQsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5XG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jYW5TZWFyY2ggPyBudWxsIDogX3ZtLmNsb3NlKClcblx0ICAgICAgfSxcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udG9nZ2xlKClcblx0ICAgICAgfSxcblx0ICAgICAgXCJrZXlkb3duXCI6IFtmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS5jbG9zZSgkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwic3BhY2VcIiwgMzIpKSB7IHJldHVybjsgfVxuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfSwgZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlbnRlclwiLCAxMykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS50b2dnbGUoJGV2ZW50KVxuXHQgICAgICB9XVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJidG4tY29udGVudFwiLFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJpbm5lckhUTUxcIjogX3ZtLl9zKF92bS5sb2FkaW5nID8gX3ZtLnRleHQubG9hZGluZyA6IF92bS5zaG93UGxhY2Vob2xkZXIgfHwgX3ZtLnNlbGVjdGVkKVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWx1ZXMubGVuZ3RoKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNsb3NlXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jbGVhcigpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc2VsZWN0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VsXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJzZWNyZXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJtdWx0aXBsZVwiOiBfdm0ubXVsdGlwbGUsXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seSxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNoYW5nZVwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udmFsID0gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKCRldmVudC50YXJnZXQub3B0aW9ucywgZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgcmV0dXJuIG8uc2VsZWN0ZWRcblx0ICAgICAgICB9KS5tYXAoZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgdmFyIHZhbCA9IFwiX3ZhbHVlXCIgaW4gbyA/IG8uX3ZhbHVlIDogby52YWx1ZTtcblx0ICAgICAgICAgIHJldHVybiB2YWxcblx0ICAgICAgICB9KVswXVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ucmVxdWlyZWQpID8gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInZhbHVlXCI6IFwiXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2woKF92bS5saXN0KSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJ2YWx1ZVwiOiBvcHRpb25bX3ZtLm9wdGlvbnNWYWx1ZV1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdihfdm0uX3Mob3B0aW9uW192bS5vcHRpb25zTGFiZWxdKSldKVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkcm9wZG93bi1tZW51XCJcblx0ICB9LCBbKF92bS5saXN0Lmxlbmd0aCkgPyBbKF92bS5jYW5TZWFyY2gpID8gX3ZtLl9jKCdsaScsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJzLXNlYXJjaGJveFwiXG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VhcmNoXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInRleHRcIixcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0uc2VhcmNoVGV4dCB8fCBfdm0udGV4dC5zZWFyY2gsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCJcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0uc2VhcmNoVmFsdWUpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLmNsb3NlKCRldmVudClcblx0ICAgICAgfSxcblx0ICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnNlYXJjaFZhbHVlID0gJGV2ZW50LnRhcmdldC52YWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uY2xlYXJTZWFyY2hcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0ucmVxdWlyZWQgJiYgIV92bS5jbGVhckJ1dHRvbikgPyBfdm0uX2MoJ2xpJywgW192bS5fYygnYScsIHtcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS5jbGVhcigpICYmIF92bS5jbG9zZSgpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0ucGxhY2Vob2xkZXIgfHwgX3ZtLnRleHQubm90U2VsZWN0ZWQpKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9sKChfdm0uZmlsdGVyZWRPcHRpb25zKSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgYXR0cnM6IHtcblx0ICAgICAgICBcImlkXCI6IG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uc2VsZWN0KG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXSlcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJpbm5lckhUTUxcIjogX3ZtLl9zKG9wdGlvbltfdm0ub3B0aW9uc0xhYmVsXSlcblx0ICAgICAgfVxuXHQgICAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICAgIHZhbHVlOiAoX3ZtLmlzU2VsZWN0ZWQob3B0aW9uW192bS5vcHRpb25zVmFsdWVdKSksXG5cdCAgICAgICAgZXhwcmVzc2lvbjogXCJpc1NlbGVjdGVkKG9wdGlvbltvcHRpb25zVmFsdWVdKVwiXG5cdCAgICAgIH1dLFxuXHQgICAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcIlxuXHQgICAgfSldKV0pXG5cdCAgfSldIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmICFfdm0uY2xvc2VPblNlbGVjdCkgPyBfdm0uX2MoJ3RyYW5zaXRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcIm5hbWVcIjogXCJmYWRlaW5cIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5vdGlmeSBpblwiXG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKSA6IF92bS5fZSgpXSwgMiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmIF92bS5jbG9zZU9uU2VsZWN0KSA/IF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImZhZGVpblwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibm90aWZ5IG91dFwiXG5cdCAgfSwgW192bS5fYygnZGl2JywgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKV0pIDogX3ZtLl9lKCldLCAxKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1lNTE0ZGJjNlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFNsaWRlci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzIxODViODJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTMyMTg1YjgyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gU2xpZGVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE1OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC4kY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcblx0ICAgIH0sXG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LmluZGV4ID09PSB0aGlzLmluZGV4O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLiRwYXJlbnQuaW5kaWNhdG9yX2xpc3QpIHtcblx0ICAgICAgdGhpcy4kcGFyZW50LmluZGljYXRvcl9saXN0LnB1c2godGhpcy5pbmRleCk7XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKHRoaXMuaW5kZXggPT09IDApIHtcblx0ICAgICAgdGhpcy4kZWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTYwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIml0ZW1cIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzIxODViODJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTYyKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTY0KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2NSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxTcGlubmVyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi04YjI5OGU3MFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtOGIyOThlNzBcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBTcGlubmVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE2MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYzKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi04YjI5OGU3MCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vU3Bpbm5lci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LThiMjk4ZTcwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TcGlubmVyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE2MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5Aa2V5ZnJhbWVzIHNwaW4ge1xcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbn1cXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXG59XFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvU3Bpbm5lci52dWU/NjVmYzVhOGZcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJGQTtBQUNBO0lBQ0EsMEJBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSxPQUFBO0VBQ0EsUUFBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0VBQ0EsY0FBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLGlDQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLDRCQUFBO0VBQ0EsbUJBQUE7RUFDQSxzQkFBQTtFQUNBLDRCQUFBO0VBQ0Esb0NBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxlQUFBO0VBQ0EsZUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsWUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7Ozs7O0VBS0EsNklBQUE7RUFDQSxnQkFBQTtFQUNBLGVBQUE7RUFDQSxnQkFBQTtFQUNBLGFBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtDQUNBXCIsXCJmaWxlXCI6XCJTcGlubmVyLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IDpjbGFzcz1cXFwiWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLHNwaW5uZXJTaXplLHsnc3Bpbm5lci1maXhlZCc6Zml4ZWR9XVxcXCIgdi1zaG93PVxcXCJhY3RpdmV8fGxvY2tlZFxcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItd3JhcHBlclxcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3Bpbm5lci1jaXJjbGVcXFwiPjwvZGl2PlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItdGV4dFxcXCI+e3t0ZXh0fX08L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtjb2VyY2UsIGRlbGF5ZXJ9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuY29uc3QgTUlOX1dBSVQgPSA1MDAgLy8gaW4gbXNcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBmaXhlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZ2xvYmFsOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBzaXplOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbWQnfSxcXHJcXG4gICAgdGV4dDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcXHJcXG4gICAgICBsb2NrZWQ6IGZhbHNlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBzcGlubmVyU2l6ZSAoKSB7IHJldHVybiAnc3Bpbm5lci0nICsgKHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZSA6ICdzbScpIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBhY3RpdmUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7IHRoaXNbdmFsID8gJ3Nob3cnIDogJ2hpZGUnXSgpIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgaGlkZSAoKSB7XFxyXFxuICAgICAgdmFyIGRlbGF5ID0gMFxcclxcbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAob3B0aW9ucykge1xcclxcbiAgICAgIGlmIChvcHRpb25zKSB7XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy50ZXh0KSB7IHRoaXMudGV4dCA9IG9wdGlvbnMudGV4dCB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7IHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZSB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5maXhlZCkgeyB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZCB9XFxyXFxuICAgICAgfVxcclxcbiAgICAgIC8vIGJsb2NrIHNjcm9sbGluZyB3aGVuIHNwaW5uZXIgaXMgb25cXHJcXG4gICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nXFxyXFxuICAgICAgLy8gYWN0aXZhdGUgc3Bpbm5lclxcclxcbiAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpXFxyXFxuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5sb2NrZWQgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5fdW5sb2NrKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9ib2R5ID0gZG9jdW1lbnQuYm9keVxcclxcbiAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WVxcclxcbiAgICB0aGlzLl91bmxvY2sgPSBkZWxheWVyKGZ1bmN0aW9uICgpIHtcXHJcXG4gICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gICAgfSwgTUlOX1dBSVQpXFxyXFxuICAgIGlmICh0aGlzLmdsb2JhbCkge1xcclxcbiAgICAgIGlmICghdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lcikge1xcclxcbiAgICAgICAgdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lciA9IHRydWVcXHJcXG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xcclxcbiAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xcclxcbiAgICAgICAgICBoaWRlICgpIHsgc2VsZi5oaWRlKCkgfSxcXHJcXG4gICAgICAgICAgc2hvdyAoKSB7IHNlbGYuc2hvdygpIH1cXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuJHJvb3QuJG9uKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICBpZiAodGhpcy5fZ2xvYmFsKSB7XFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpoaWRlJywgdGhpcy5fZ2xvYmFsLmhpZGUpXFxyXFxuICAgICAgZGVsZXRlIHRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXJcXHJcXG4gICAgfVxcclxcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc3Bpbm5lckFuaW1hdGlvbilcXHJcXG4gICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbkBrZXlmcmFtZXMgc3BpbiB7XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXHJcXG59XFxyXFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIE1JTl9XQUlUID0gNTAwOyAvLyBpbiBtc1xuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZml4ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGdsb2JhbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2l6ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdtZCcgfSxcblx0ICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcblx0ICAgICAgbG9ja2VkOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgc3Bpbm5lclNpemU6IGZ1bmN0aW9uIHNwaW5uZXJTaXplKCkge1xuXHQgICAgICByZXR1cm4gJ3NwaW5uZXItJyArICh0aGlzLnNpemUgPyB0aGlzLnNpemUgOiAnc20nKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpc1t2YWwgPyAnc2hvdycgOiAnaGlkZSddKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGhpZGU6IGZ1bmN0aW9uIGhpZGUoKSB7XG5cdCAgICAgIHZhciBkZWxheSA9IDA7XG5cdCAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyhvcHRpb25zKSB7XG5cdCAgICAgIGlmIChvcHRpb25zKSB7XG5cdCAgICAgICAgaWYgKG9wdGlvbnMudGV4dCkge1xuXHQgICAgICAgICAgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7XG5cdCAgICAgICAgICB0aGlzLnNpemUgPSBvcHRpb25zLnNpemU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChvcHRpb25zLmZpeGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgLy8gYmxvY2sgc2Nyb2xsaW5nIHdoZW4gc3Bpbm5lciBpcyBvblxuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuXHQgICAgICAvLyBhY3RpdmF0ZSBzcGlubmVyXG5cdCAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpO1xuXHQgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cdCAgICAgIHRoaXMubG9ja2VkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fdW5sb2NrKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5fYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WTtcblx0ICAgIHRoaXMuX3VubG9jayA9ICgwLCBfdXRpbHMuZGVsYXllcikoZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9IHRoaXMuX2JvZHlPdmVyZmxvdztcblx0ICAgIH0sIE1JTl9XQUlUKTtcblx0ICAgIGlmICh0aGlzLmdsb2JhbCkge1xuXHQgICAgICBpZiAoIXRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXIpIHtcblx0ICAgICAgICB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xuXHQgICAgICAgICAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcblx0ICAgICAgICAgICAgc2VsZi5oaWRlKCk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgICAgICAgc2VsZi5zaG93KCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6c2hvdycsIHRoaXMuX2dsb2JhbC5zaG93KTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9nbG9iYWwpIHtcblx0ICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpO1xuXHQgICAgICB0aGlzLiRyb290LiRvZmYoJ3NwaW5uZXI6OmhpZGUnLCB0aGlzLl9nbG9iYWwuaGlkZSk7XG5cdCAgICAgIGRlbGV0ZSB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyO1xuXHQgICAgfVxuXHQgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NwaW5uZXJBbmltYXRpb24pO1xuXHQgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3c7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5hY3RpdmUgfHwgX3ZtLmxvY2tlZCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiYWN0aXZlfHxsb2NrZWRcIlxuXHQgICAgfV0sXG5cdCAgICBjbGFzczogWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLCBfdm0uc3Bpbm5lclNpemUsIHtcblx0ICAgICAgJ3NwaW5uZXItZml4ZWQnOiBfdm0uZml4ZWRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci13cmFwcGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJzcGlubmVyLWNpcmNsZVwiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci10ZXh0XCJcblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSldKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LThiMjk4ZTcwXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTY2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFiLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0wOTg1ZTg3OFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtMDk4NWU4NzhcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBUYWIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTY3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGZhZGVpbjogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdmFyIGFjdGl2ZSA9ICF0aGlzLl90YWJzIHx8IHRoaXMuX3RhYnMuc2hvdyA9PT0gdGhpcztcblx0ICAgICAgdGhpcy5mYWRlaW4gPSBmYWxzZTtcblx0ICAgICAgaWYgKGFjdGl2ZSkge1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgX3RoaXMuZmFkZWluID0gdHJ1ZTtcblx0ICAgICAgICB9LCAwKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gYWN0aXZlO1xuXHQgICAgfSxcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3RhYnMudGFicy5pbmRleE9mKHRoaXMpO1xuXHQgICAgfSxcblx0ICAgIHRyYW5zaXRpb246IGZ1bmN0aW9uIHRyYW5zaXRpb24oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl90YWJzID8gdGhpcy5fdGFicy5lZmZlY3QgOiBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiID0gdHJ1ZTtcblx0ICAgIHZhciB0YWJzID0gdGhpcztcblx0ICAgIHdoaWxlICghdGhpcy5fdGFicyAmJiB0YWJzLiRwYXJlbnQpIHtcblx0ICAgICAgaWYgKHRhYnMuX2lzVGFiR3JvdXApIHtcblx0ICAgICAgICB0YWJzLnRhYnMucHVzaCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl90YWJHcm91cCA9IHRhYnM7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRhYnMuX2lzVGFicykge1xuXHQgICAgICAgIHRhYnMudGFicy5wdXNoKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3RhYnMgPSB0YWJzO1xuXHQgICAgICAgIGlmICghdGhpcy5fdGFiR3JvdXApIHRhYnMuaGVhZGVycy5wdXNoKHRoaXMpO1xuXHQgICAgICB9XG5cdCAgICAgIHRhYnMgPSB0YWJzLiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMuX3RhYnMpIHRocm93IEVycm9yKCd0YWIgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgaWYgKHRoaXMuX3RhYkdyb3VwKSB7XG5cdCAgICAgIHRoaXMuX3RhYkdyb3VwLnRhYnMgPSB0aGlzLl90YWJHcm91cC50YWJzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwgIT09IF90aGlzMjtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB0aGlzLl90YWJzLnRhYnMgPSB0aGlzLl90YWJzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbCAhPT0gX3RoaXMyO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl90YWJzKSB7XG5cdCAgICAgIGlmICh0aGlzLl90YWJzLmFjdGl2ZSA9PT0gdGhpcy5pbmRleCkge1xuXHQgICAgICAgIHRoaXMuX3RhYnMuaW5kZXggPSAwO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9pbmdyb3VwKSB7XG5cdCAgICAgICAgdmFyIGlkID0gdGhpcy4kcGFyZW50LnRhYnMuaW5kZXhPZih0aGlzKTtcblx0ICAgICAgICBpZiAofmlkKSB0aGlzLiRwYXJlbnQudGFicy5zcGxpY2UoaWQsIDEpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB2YXIgX2lkID0gdGhpcy5fdGFicy50YWJzLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIGlmICh+X2lkKSB0aGlzLl90YWJzLnRhYnMuc3BsaWNlKF9pZCwgMSk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwYW5lbFwiLFxuXHQgICAgY2xhc3M6IFsndGFiLXBhbmUnLCB7XG5cdCAgICAgICdhY3RpdmUgZmFkZSc6IF92bS5hY3RpdmUsXG5cdCAgICAgICdpbic6IF92bS5mYWRlaW5cblx0ICAgIH1dLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwidGFicGFuZWxcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMDk4NWU4NzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTcwKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTcyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Mylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUYWJHcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNTVmYWYzY2JcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTU1ZmFmM2NiXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFiR3JvdXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTcwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzEpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLnRhYi1jb250ZW50IC50YWItcGFuZSB7IGRpc3BsYXk6IG5vbmU7XFxufVxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVGFiR3JvdXAudnVlPzIyYWUxYzA4XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrQ0EseUJBQUEsY0FBQTtDQUFBO0FBQ0EsZ0NBQUEsZUFBQTtDQUFBXCIsXCJmaWxlXCI6XCJUYWJHcm91cC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPjxzcGFuPjxzbG90Pjwvc2xvdD48L3NwYW4+PC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgc2hvdzogZmFsc2UsXFxyXFxuICAgICAgdGFiczogW11cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGFjdGl2ZSAoKSB7IHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KSB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBibHVyICgpIHsgdGhpcy5zaG93ID0gZmFsc2UgfSxcXHJcXG4gICAgdG9nZ2xlICgpIHsgdGhpcy5zaG93ID0gIXRoaXMuc2hvdyB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlXFxyXFxuICAgIGlmICh0aGlzLiRwYXJlbnQpIHtcXHJcXG4gICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFxcXCd0IG5lc3QgdGFiLWdyb3Vwcy4nKVxcclxcbiAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJylcXHJcXG4gICAgfVxcclxcbiAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIHRoaXMuX3RhYnMuaGVhZGVycy5wdXNoKHRoaXMpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4udGFiLWNvbnRlbnQgLnRhYi1wYW5lIHsgZGlzcGxheTogbm9uZTsgfVxcclxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7IH1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTcyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHNob3c6IGZhbHNlLFxuXHQgICAgICB0YWJzOiBbXVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYWN0aXZlOiBmdW5jdGlvbiBhY3RpdmUoKSB7XG5cdCAgICAgIHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMuJHBhcmVudCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFwndCBuZXN0IHRhYi1ncm91cHMuJyk7XG5cdCAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50O1xuXHQgICAgdGhpcy5fdGFicy5oZWFkZXJzLnB1c2godGhpcyk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTczICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTU1ZmFmM2NiXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTc0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFicy52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzAxMDBkZGZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTcwMTAwZGRmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFicy52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzAxMDBkZGYhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1RhYnMudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi03MDEwMGRkZiEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vVGFicy52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1RhYnMudnVlPzQzMTdiOWFmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUEwRUE7RUFDQSxlQUFBO0NBQ0FcIixcImZpbGVcIjpcIlRhYnMudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgdGFicz5cXHJcXG4gICAgPHVsIDpjbGFzcz1cXFwibmF2U3R5bGVDbGFzc1xcXCIgcm9sZT1cXFwidGFibGlzdFxcXCI+XFxyXFxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVxcXCJoZWFkZXIgaW4gaGVhZGVyc1xcXCI+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwiaGVhZGVyLl9pc1RhYlxcXCIgOmNsYXNzPVxcXCJ7YWN0aXZlOmhlYWRlci5hY3RpdmUsIGRpc2FibGVkOmhlYWRlci5kaXNhYmxlZH1cXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QoaGVhZGVyKVxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+PGEgaHJlZj1cXFwiI1xcXCIgdi1odG1sPVxcXCJoZWFkZXIuaGVhZGVyXFxcIj48L2E+PC9zbG90PlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICAgIDxkcm9wZG93biB2LWlmPVxcXCJoZWFkZXIuX2lzVGFiR3JvdXBcXFwiIDp0ZXh0PVxcXCJoZWFkZXIuaGVhZGVyXFxcIiA6Y2xhc3M9XFxcInthY3RpdmU6aGVhZGVyLmFjdGl2ZX1cXFwiIDpkaXNhYmxlZD1cXFwiaGVhZGVyLmRpc2FibGVkXFxcIj5cXHJcXG4gICAgICAgICAgPGxpIHYtZm9yPVxcXCJ0YWIgaW4gaGVhZGVyLnRhYnNcXFwiIDpjbGFzcz1cXFwie2Rpc2FibGVkOnRhYi5kaXNhYmxlZH1cXFwiPjxhIGhyZWY9XFxcIiNcXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QodGFiKVxcXCI+e3t0YWIuaGVhZGVyfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDwvZHJvcGRvd24+XFxyXFxuICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPC91bD5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwidGFiLWNvbnRlbnRcXFwiPjxzbG90Pjwvc2xvdD48L2Rpdj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2NvZXJjZX0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgZHJvcGRvd24gZnJvbSAnLi9Ecm9wZG93bi52dWUnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgY29tcG9uZW50czoge1xcclxcbiAgICBkcm9wZG93blxcclxcbiAgfSxcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIC8vIGVmZmVjdDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2ZhZGVpbid9LFxcclxcbiAgICBqdXN0aWZpZWQ6IGZhbHNlLFxcclxcbiAgICBuYXZTdHlsZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICB2YXIgaW5kZXggPSB0aGlzLnZhbHVlIHx8IDBcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBpbmRleCxcXHJcXG4gICAgICBoZWFkZXJzOiBbXSxcXHJcXG4gICAgICB0YWJzOiBbXVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaW5kZXggKHZhbCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2FjdGl2ZScsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHRoaXMuaW5kZXggPSB2YWxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIG5hdlN0eWxlQ2xhc3MgKCkge1xcclxcbiAgICAgIHJldHVybiBbXFxyXFxuICAgICAgICAnbmF2JyxcXHJcXG4gICAgICAgIH5bJ3BpbGxzJywgJ3N0YWNrZWQnXS5pbmRleE9mKHRoaXMubmF2U3R5bGUpID8gJ25hdi0nICsgdGhpcy5uYXZTdHlsZSA6ICduYXYtdGFicycsXFxyXFxuICAgICAgICB7XFxyXFxuICAgICAgICAgICduYXYtanVzdGlmaWVkJzogY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxcclxcbiAgICAgICAgICAnbmF2LXBpbGxzJzogdGhpcy5uYXZTdHlsZSA9PT0gJ3N0YWNrZWQnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgXVxcclxcbiAgICB9LFxcclxcbiAgICBzaG93ICgpIHsgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF0gfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgc2VsZWN0ICh0YWIpIHtcXHJcXG4gICAgICBpZiAoIXRhYi5kaXNhYmxlZCkge1xcclxcbiAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMudGFicy5pbmRleE9mKHRhYilcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5faXNUYWJzID0gdHJ1ZVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcclxcbn1cXHJcXG48L3N0eWxlPlwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTc3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdHZhciBfRHJvcGRvd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNSk7XG5cdFxuXHR2YXIgX0Ryb3Bkb3duMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Ryb3Bkb3duKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGNvbXBvbmVudHM6IHtcblx0ICAgIGRyb3Bkb3duOiBfRHJvcGRvd24yLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICAvLyBlZmZlY3Q6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdmYWRlaW4nfSxcblx0ICAgIGp1c3RpZmllZDogZmFsc2UsXG5cdCAgICBuYXZTdHlsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIGluZGV4ID0gdGhpcy52YWx1ZSB8fCAwO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaW5kZXg6IGluZGV4LFxuXHQgICAgICBoZWFkZXJzOiBbXSxcblx0ICAgICAgdGFiczogW11cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCh2YWwpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnYWN0aXZlJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy5pbmRleCA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBuYXZTdHlsZUNsYXNzOiBmdW5jdGlvbiBuYXZTdHlsZUNsYXNzKCkge1xuXHQgICAgICByZXR1cm4gWyduYXYnLCB+WydwaWxscycsICdzdGFja2VkJ10uaW5kZXhPZih0aGlzLm5hdlN0eWxlKSA/ICduYXYtJyArIHRoaXMubmF2U3R5bGUgOiAnbmF2LXRhYnMnLCB7XG5cdCAgICAgICAgJ25hdi1qdXN0aWZpZWQnOiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxuXHQgICAgICAgICduYXYtcGlsbHMnOiB0aGlzLm5hdlN0eWxlID09PSAnc3RhY2tlZCdcblx0ICAgICAgfV07XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF07XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdCh0YWIpIHtcblx0ICAgICAgaWYgKCF0YWIuZGlzYWJsZWQpIHtcblx0ICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy50YWJzLmluZGV4T2YodGFiKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFicyA9IHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTc4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidGFic1wiOiBcIlwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygndWwnLCB7XG5cdCAgICBjbGFzczogX3ZtLm5hdlN0eWxlQ2xhc3MsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJ0YWJsaXN0XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9sKChfdm0uaGVhZGVycyksIGZ1bmN0aW9uKGhlYWRlcikge1xuXHQgICAgcmV0dXJuIFsoaGVhZGVyLl9pc1RhYikgPyBfdm0uX2MoJ2xpJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZSwgZGlzYWJsZWQ6IGhlYWRlci5kaXNhYmxlZFxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICAgIF92bS5zZWxlY3QoaGVhZGVyKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICB9LFxuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhoZWFkZXIuaGVhZGVyKVxuXHQgICAgICB9XG5cdCAgICB9KV0pXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKGhlYWRlci5faXNUYWJHcm91cCkgPyBfdm0uX2MoJ2Ryb3Bkb3duJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZVxuXHQgICAgICB9LFxuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwidGV4dFwiOiBoZWFkZXIuaGVhZGVyLFxuXHQgICAgICAgIFwiZGlzYWJsZWRcIjogaGVhZGVyLmRpc2FibGVkXG5cdCAgICAgIH1cblx0ICAgIH0sIF92bS5fbCgoaGVhZGVyLnRhYnMpLCBmdW5jdGlvbih0YWIpIHtcblx0ICAgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAgIGRpc2FibGVkOiB0YWIuZGlzYWJsZWRcblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX2MoJ2EnLCB7XG5cdCAgICAgICAgYXR0cnM6IHtcblx0ICAgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgb246IHtcblx0ICAgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICBfdm0uc2VsZWN0KHRhYilcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX3YoX3ZtLl9zKHRhYi5oZWFkZXIpKV0pXSlcblx0ICAgIH0pKSA6IF92bS5fZSgpXVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwidGFiLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03MDEwMGRkZlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE3OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODApXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTgxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvZ2dsZUJ1dHRvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtZjAzNGE1ZjJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWYwMzRhNWYyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVG9nZ2xlQnV0dG9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE4MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGRpc2FibGVkOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGZhbHNlVHlwZTogeyBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBuYW1lOiBudWxsLFxuXHQgICAgcmVhZG9ubHk6IHsgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHJ1ZVR5cGU6IHsgZGVmYXVsdDogJ3ByaW1hcnknIH0sXG5cdCAgICB2YWx1ZTogZmFsc2Vcblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBhY3RpdmU6IF91dGlscy5jb2VyY2UuYm9vbGVhbih0aGlzLnZhbHVlKSxcblx0ICAgICAgdHlwZXM6IHtcblx0ICAgICAgICBkYW5nZXI6ICdidG4tZGFuZ2VyJyxcblx0ICAgICAgICBpbmZvOiAnYnRuLWluZm8nLFxuXHQgICAgICAgIHByaW1hcnk6ICdidG4tcHJpbWFyeScsXG5cdCAgICAgICAgc3VjY2VzczogJ2J0bi1zdWNjZXNzJyxcblx0ICAgICAgICB3YXJuaW5nOiAnYnRuLXdhcm5pbmcnXG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZWQnLCB2YWwpO1xuXHQgICAgICAgIHRoaXMuJGVtaXQodmFsID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJyk7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuYWN0aXZlID0gX3V0aWxzLmNvZXJjZS5ib29sZWFuKHRoaXMudmFsdWUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYm9vbERpc2FibGVkOiBmdW5jdGlvbiBib29sRGlzYWJsZWQoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5kaXNhYmxlZCk7XG5cdCAgICB9LFxuXHQgICAgYm9vbFJlYWRvbmx5OiBmdW5jdGlvbiBib29sUmVhZG9ubHkoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5yZWFkb25seSk7XG5cdCAgICB9LFxuXHQgICAgdHlwZTogZnVuY3Rpb24gdHlwZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZXNbdGhpcy52YWx1ZSA/IHRoaXMudHJ1ZVR5cGUgOiB0aGlzLmZhbHNlVHlwZV0gfHwgJ2J0bi1kZWZhdWx0Jztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAodGhpcy5ib29sRGlzYWJsZWQgfHwgdGhpcy5ib29sUmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5hY3RpdmUgPSAhdGhpcy5hY3RpdmU7XG5cdCAgICB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTgxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2EnLCB7XG5cdCAgICBjbGFzczogWydidG4nLCBfdm0udHlwZSwge1xuXHQgICAgICByZWFkb25seTogX3ZtLmJvb2xSZWFkb25seVxuXHQgICAgfV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImhyZWZcIjogXCJqYXZhc2NyaXB0OnZvaWQoMClcIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uYm9vbERpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2dseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsdWUgPyAnb2snIDogJ3JlbW92ZScpXVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLm5hbWUpID8gX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImhpZGRlblwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5hY3RpdmUgPyAxIDogMFxuXHQgICAgfVxuXHQgIH0pIDogX3ZtLl9lKCldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1mMDM0YTVmMlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE4MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxODMpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODUpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTg2KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvb2x0aXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTQ4ZmI1MWIyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi00OGZiNTFiMlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFRvb2x0aXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTgzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODQpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQ4ZmI1MWIyIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Ub29sdGlwLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNDhmYjUxYjIhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1Rvb2x0aXAudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXG59XFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXG59XFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXG59XFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcbjAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG59XFxuQGtleWZyYW1lcyBmYWRlaW4tb3V0IHtcXG4wJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVG9vbHRpcC52dWU/MzdkMTgzZWNcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJCQTs7OztFQUlBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtBQUNBO0lBQ0EsV0FBQTtDQUNBO0NBQ0FcIixcImZpbGVcIjpcIlRvb2x0aXAudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxzcGFuIHJlZj1cXFwidHJpZ2dlclxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPHRyYW5zaXRpb24gOm5hbWU9XFxcImVmZmVjdFxcXCI+XFxyXFxuICAgICAgPGRpdiByZWY9XFxcInBvcG92ZXJcXFwiIHYtaWY9XFxcInNob3dcXFwiIDpjbGFzcz1cXFwiWyd0b29sdGlwJyxwbGFjZW1lbnRdXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInRvb2x0aXAtYXJyb3dcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwidG9vbHRpcC1pbm5lclxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImNvbnRlbnRcXFwiPjxkaXYgdi1odG1sPVxcXCJjb250ZW50XFxcIj48L2Rpdj48L3Nsb3Q+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC90cmFuc2l0aW9uPlxcclxcbiAgPC9zcGFuPlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQgUG9wb3Zlck1peGluIGZyb20gJy4vdXRpbHMvcG9wb3Zlck1peGlucy5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBtaXhpbnM6IFtQb3BvdmVyTWl4aW5dLFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgZWZmZWN0OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnfSxcXHJcXG4gICAgdHJpZ2dlcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJ31cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXHJcXG59XFxyXFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXHJcXG59XFxyXFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIGZhZGVpbi1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAuOTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTg1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGlucyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQzKTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3BvdmVyTWl4aW5zKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgbWl4aW5zOiBbX3BvcG92ZXJNaXhpbnMyLmRlZmF1bHRdLFxuXHQgIHByb3BzOiB7XG5cdCAgICBlZmZlY3Q6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnIH0sXG5cdCAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJyB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTg2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICByZWY6IFwidHJpZ2dlclwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0uZWZmZWN0XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwb3BvdmVyXCIsXG5cdCAgICBjbGFzczogWyd0b29sdGlwJywgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWFycm93XCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWlubmVyXCJcblx0ICB9LCBbX3ZtLl90KFwiY29udGVudFwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcImlubmVySFRNTFwiOiBfdm0uX3MoX3ZtLmNvbnRlbnQpXG5cdCAgICB9XG5cdCAgfSldKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDhmYjUxYjJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxODcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTg4KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwNilcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUeXBlYWhlYWQudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTViNWY1ZTk0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi01YjVmNWU5NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFR5cGVhaGVhZC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxODggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4OSk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNWI1ZjVlOTQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1R5cGVhaGVhZC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTViNWY1ZTk0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UeXBlYWhlYWQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9UeXBlYWhlYWQudnVlPzZhMDM5OTdmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFvSUE7RUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJUeXBlYWhlYWQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgc3R5bGU9XFxcInBvc2l0aW9uOiByZWxhdGl2ZVxcXCIgOmNsYXNzPVxcXCJ7J29wZW4nOnNob3dEcm9wZG93bn1cXFwiPlxcclxcbiAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiXFxyXFxuICAgICAgdi1tb2RlbD1cXFwidmFsXFxcIlxcclxcbiAgICAgIDpwbGFjZWhvbGRlcj1cXFwicGxhY2Vob2xkZXJcXFwiXFxyXFxuICAgICAgQGJsdXI9XFxcInNob3dEcm9wZG93biA9IGZhbHNlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmRvd249XFxcImRvd25cXFwiXFxyXFxuICAgICAgQGtleWRvd24uZW50ZXI9IFxcXCJoaXRcXFwiXFxyXFxuICAgICAgQGtleWRvd24uZXNjPVxcXCJyZXNldFxcXCJcXHJcXG4gICAgICBAa2V5ZG93bi51cD1cXFwidXBcXFwiXFxyXFxuICAgIC8+XFxyXFxuICAgIDx1bCBjbGFzcz1cXFwiZHJvcGRvd24tbWVudVxcXCIgcmVmPVxcXCJkcm9wZG93blxcXCI+XFxyXFxuICAgICAgPGxpIHYtZm9yPVxcXCIoaXRlbSwgaSkgaW4gaXRlbXNcXFwiIDpjbGFzcz1cXFwieydhY3RpdmUnOiBpc0FjdGl2ZShpKX1cXFwiPlxcclxcbiAgICAgICAgPGEgQG1vdXNlZG93bi5wcmV2ZW50PVxcXCJoaXRcXFwiIEBtb3VzZW1vdmU9XFxcInNldEFjdGl2ZShpKVxcXCI+XFxyXFxuICAgICAgICAgIDxjb21wb25lbnQgOmlzPVxcXCJ0bXBsXFxcIiA6aXRlbT1cXFwiaXRlbVxcXCI+PC9jb21wb25lbnQ+XFxyXFxuICAgICAgICA8L2E+XFxyXFxuICAgICAgPC9saT5cXHJcXG4gICAgPC91bD5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2RlbGF5ZXIsIGdldEpTT059IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxudmFyIERFTEFZID0gMzAwXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgYXN5bmM6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBkYXRhOiB7dHlwZTogQXJyYXl9LFxcclxcbiAgICBkZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogREVMQVl9LFxcclxcbiAgICBhc3luY0tleToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxpbWl0OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiA4fSxcXHJcXG4gICAgbWF0Y2hDYXNlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBtYXRjaFN0YXJ0OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBvbkhpdDoge1xcclxcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxcclxcbiAgICAgIGRlZmF1bHQgKGl0ZW0pIHtcXHJcXG4gICAgICAgIHRoaXMucmVzZXQoKVxcclxcbiAgICAgICAgdGhpcy52YWx1ZSA9IGl0ZW1cXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHBsYWNlaG9sZGVyOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgdGVtcGxhdGU6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICB2YWx1ZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgc2hvd0Ryb3Bkb3duOiBmYWxzZSxcXHJcXG4gICAgICBub1Jlc3VsdHM6IHRydWUsXFxyXFxuICAgICAgY3VycmVudDogMCxcXHJcXG4gICAgICBpdGVtczogW10sXFxyXFxuICAgICAgdmFsOiAnJ1xcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgdGVtcGxhdGVIdG1sICgpIHsgcmV0dXJuIHR5cGVvZiB0aGlzLnRlbXBsYXRlID09PSAnc3RyaW5nJyA/ICc8c3Bhbj4nICsgdGhpcy50ZW1wbGF0ZSArICc8L3NwYW4+JyA6IG51bGwgfSxcXHJcXG4gICAgdG1wbCAoKSB7IHJldHVybiB0aGlzLl90bXBsfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuX3VwZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIHNldEl0ZW1zIChkYXRhKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcXHJcXG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmFzeW5jS2V5ID8gZGF0YVt0aGlzLmFzeW5jS2V5XSA6IGRhdGFcXHJcXG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHRoaXMubGltaXQpXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIHRoaXMuaXRlbXMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKHZhbHVlID0+IHtcXHJcXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHsgcmV0dXJuIHRydWUgfVxcclxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMubWF0Y2hDYXNlID8gdmFsdWUgOiB2YWx1ZS50b0xvd2VyQ2FzZSgpXFxyXFxuICAgICAgICAgIHZhciBxdWVyeSA9IHRoaXMubWF0Y2hDYXNlID8gdGhpcy52YWwgOiB0aGlzLnZhbC50b0xvd2VyQ2FzZSgpXFxyXFxuICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoU3RhcnQgPyB2YWx1ZS5pbmRleE9mKHF1ZXJ5KSA9PT0gMCA6IHZhbHVlLmluZGV4T2YocXVlcnkpICE9PSAtMVxcclxcbiAgICAgICAgfSkuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICB9XFxyXFxuICAgICAgdGhpcy5zaG93RHJvcGRvd24gPSB0aGlzLml0ZW1zLmxlbmd0aCA+IDBcXHJcXG4gICAgfSxcXHJcXG4gICAgcmVzZXQgKCkge1xcclxcbiAgICAgIHRoaXMuaXRlbXMgPSBbXVxcclxcbiAgICAgIHRoaXMudmFsID0gJydcXHJcXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgc2V0QWN0aXZlIChpbmRleCkge1xcclxcbiAgICAgIHRoaXMuY3VycmVudCA9IGluZGV4XFxyXFxuICAgIH0sXFxyXFxuICAgIGlzQWN0aXZlIChpbmRleCkge1xcclxcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQgPT09IGluZGV4XFxyXFxuICAgIH0sXFxyXFxuICAgIGhpdCAoZSkge1xcclxcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxcclxcbiAgICAgIHRoaXMub25IaXQodGhpcy5pdGVtc1t0aGlzLmN1cnJlbnRdLCB0aGlzKVxcclxcbiAgICB9LFxcclxcbiAgICB1cCAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuY3VycmVudCA+IDApIHRoaXMuY3VycmVudC0tXFxyXFxuICAgIH0sXFxyXFxuICAgIGRvd24gKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmN1cnJlbnQgPCB0aGlzLml0ZW1zLmxlbmd0aCAtIDEpIHRoaXMuY3VycmVudCsrXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHRoaXMuX3RtcGwgPSB7XFxyXFxuICAgICAgdGVtcGxhdGU6IHRoaXMudGVtcGxhdGVIdG1sIHx8ICc8c3Ryb25nIHYtaHRtbD1cXFwiaXRlbVxcXCI+PC9zdHJvbmc+JyxcXHJcXG4gICAgICBwcm9wczoge1xcclxcbiAgICAgICAgaXRlbToge2RlZmF1bHQ6IG51bGx9XFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICAgIHRoaXMuX3VwZGF0ZSA9IGRlbGF5ZXIoZnVuY3Rpb24gKCkge1xcclxcbiAgICAgIGlmICghdGhpcy52YWwpIHtcXHJcXG4gICAgICAgIHRoaXMucmVzZXQoKVxcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfVxcclxcbiAgICAgIGlmICh0aGlzLmFzeW5jKSB7XFxyXFxuICAgICAgICBnZXRKU09OKHRoaXMuYXN5bmMgKyB0aGlzLnZhbCkudGhlbihkYXRhID0+IHtcXHJcXG4gICAgICAgICAgdGhpcy5zZXRJdGVtcyhkYXRhKVxcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YSkge1xcclxcbiAgICAgICAgdGhpcy5zZXRJdGVtcyh0aGlzLmRhdGEpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LCAnZGVsYXknLCBERUxBWSlcXHJcXG4gICAgdGhpcy5fdXBkYXRlKClcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuPC9zdHlsZT5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE5MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3R5cGVvZjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5MSk7XG5cdFxuXHR2YXIgX3R5cGVvZjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90eXBlb2YyKTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHR2YXIgREVMQVkgPSAzMDA7IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGFzeW5jOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgZGF0YTogeyB0eXBlOiBBcnJheSB9LFxuXHQgICAgZGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBERUxBWSB9LFxuXHQgICAgYXN5bmNLZXk6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBsaW1pdDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDggfSxcblx0ICAgIG1hdGNoQ2FzZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbWF0Y2hTdGFydDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgb25IaXQ6IHtcblx0ICAgICAgdHlwZTogRnVuY3Rpb24sXG5cdCAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KGl0ZW0pIHtcblx0ICAgICAgICB0aGlzLnJlc2V0KCk7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IGl0ZW07XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHRlbXBsYXRlOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgc2hvd0Ryb3Bkb3duOiBmYWxzZSxcblx0ICAgICAgbm9SZXN1bHRzOiB0cnVlLFxuXHQgICAgICBjdXJyZW50OiAwLFxuXHQgICAgICBpdGVtczogW10sXG5cdCAgICAgIHZhbDogJydcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHRlbXBsYXRlSHRtbDogZnVuY3Rpb24gdGVtcGxhdGVIdG1sKCkge1xuXHQgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudGVtcGxhdGUgPT09ICdzdHJpbmcnID8gJzxzcGFuPicgKyB0aGlzLnRlbXBsYXRlICsgJzwvc3Bhbj4nIDogbnVsbDtcblx0ICAgIH0sXG5cdCAgICB0bXBsOiBmdW5jdGlvbiB0bXBsKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fdG1wbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgaWYgKF92YWwgIT09IG9sZCkgdGhpcy5fdXBkYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZXRJdGVtczogZnVuY3Rpb24gc2V0SXRlbXMoZGF0YSkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcblx0ICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5hc3luY0tleSA/IGRhdGFbdGhpcy5hc3luY0tleV0gOiBkYXRhO1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgICAgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkodmFsdWUpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB2YWx1ZSA9IF90aGlzLm1hdGNoQ2FzZSA/IHZhbHVlIDogdmFsdWUudG9Mb3dlckNhc2UoKTtcblx0ICAgICAgICAgIHZhciBxdWVyeSA9IF90aGlzLm1hdGNoQ2FzZSA/IF90aGlzLnZhbCA6IF90aGlzLnZhbC50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzLm1hdGNoU3RhcnQgPyB2YWx1ZS5pbmRleE9mKHF1ZXJ5KSA9PT0gMCA6IHZhbHVlLmluZGV4T2YocXVlcnkpICE9PSAtMTtcblx0ICAgICAgICB9KS5zbGljZSgwLCB0aGlzLmxpbWl0KTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnNob3dEcm9wZG93biA9IHRoaXMuaXRlbXMubGVuZ3RoID4gMDtcblx0ICAgIH0sXG5cdCAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG5cdCAgICAgIHRoaXMuaXRlbXMgPSBbXTtcblx0ICAgICAgdGhpcy52YWwgPSAnJztcblx0ICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2V0QWN0aXZlOiBmdW5jdGlvbiBzZXRBY3RpdmUoaW5kZXgpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50ID0gaW5kZXg7XG5cdCAgICB9LFxuXHQgICAgaXNBY3RpdmU6IGZ1bmN0aW9uIGlzQWN0aXZlKGluZGV4KSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQgPT09IGluZGV4O1xuXHQgICAgfSxcblx0ICAgIGhpdDogZnVuY3Rpb24gaGl0KGUpIHtcblx0ICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLm9uSGl0KHRoaXMuaXRlbXNbdGhpcy5jdXJyZW50XSwgdGhpcyk7XG5cdCAgICB9LFxuXHQgICAgdXA6IGZ1bmN0aW9uIHVwKCkge1xuXHQgICAgICBpZiAodGhpcy5jdXJyZW50ID4gMCkgdGhpcy5jdXJyZW50LS07XG5cdCAgICB9LFxuXHQgICAgZG93bjogZnVuY3Rpb24gZG93bigpIHtcblx0ICAgICAgaWYgKHRoaXMuY3VycmVudCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkgdGhpcy5jdXJyZW50Kys7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgdGhpcy5fdG1wbCA9IHtcblx0ICAgICAgdGVtcGxhdGU6IHRoaXMudGVtcGxhdGVIdG1sIHx8ICc8c3Ryb25nIHYtaHRtbD1cIml0ZW1cIj48L3N0cm9uZz4nLFxuXHQgICAgICBwcm9wczoge1xuXHQgICAgICAgIGl0ZW06IHsgZGVmYXVsdDogbnVsbCB9XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICB0aGlzLl91cGRhdGUgPSAoMCwgX3V0aWxzLmRlbGF5ZXIpKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoIXRoaXMudmFsKSB7XG5cdCAgICAgICAgdGhpcy5yZXNldCgpO1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5hc3luYykge1xuXHQgICAgICAgICgwLCBfdXRpbHMuZ2V0SlNPTikodGhpcy5hc3luYyArIHRoaXMudmFsKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICBfdGhpczIuc2V0SXRlbXMoZGF0YSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhKSB7XG5cdCAgICAgICAgdGhpcy5zZXRJdGVtcyh0aGlzLmRhdGEpO1xuXHQgICAgICB9XG5cdCAgICB9LCAnZGVsYXknLCBERUxBWSk7XG5cdCAgICB0aGlzLl91cGRhdGUoKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0XG5cdHZhciBfaXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcblx0XG5cdHZhciBfaXRlcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXRlcmF0b3IpO1xuXHRcblx0dmFyIF9zeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5Mik7XG5cdFxuXHR2YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXHRcblx0dmFyIF90eXBlb2YgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBfaXRlcmF0b3IyLmRlZmF1bHQgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBfc3ltYm9sMi5kZWZhdWx0ICYmIG9iaiAhPT0gX3N5bWJvbDIuZGVmYXVsdC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YoX2l0ZXJhdG9yMi5kZWZhdWx0KSA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcblx0ICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKG9iaik7XG5cdH0gOiBmdW5jdGlvbiAob2JqKSB7XG5cdCAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTkyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oMTkzKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogMTkzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE5NCk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMjAzKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMDQpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIwNSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KS5TeW1ib2w7XG5cbi8qKiovIH0sXG4vKiAxOTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0Ly8gRUNNQVNjcmlwdCA2IHN5bWJvbHMgc2hpbVxuXHR2YXIgZ2xvYmFsICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBoYXMgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBERVNDUklQVE9SUyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpXG5cdCAgLCAkZXhwb3J0ICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNSlcblx0ICAsIHJlZGVmaW5lICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOClcblx0ICAsIE1FVEEgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTUpLktFWVxuXHQgICwgJGZhaWxzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KVxuXHQgICwgc2hhcmVkICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzKVxuXHQgICwgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KVxuXHQgICwgdWlkICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KVxuXHQgICwgd2tzICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KVxuXHQgICwgd2tzRXh0ICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1KVxuXHQgICwgd2tzRGVmaW5lICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5Nilcblx0ICAsIGtleU9mICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTcpXG5cdCAgLCBlbnVtS2V5cyAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk4KVxuXHQgICwgaXNBcnJheSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMSlcblx0ICAsIGFuT2JqZWN0ICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcblx0ICAsIHRvSU9iamVjdCAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIHRvUHJpbWl0aXZlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0ICAsIGNyZWF0ZURlc2MgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSlcblx0ICAsIF9jcmVhdGUgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMilcblx0ICAsIGdPUE5FeHQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MClcblx0ICAsICRHT1BEICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDIpXG5cdCAgLCAkRFAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG5cdCAgLCAka2V5cyAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpXG5cdCAgLCBnT1BEICAgICAgICAgICA9ICRHT1BELmZcblx0ICAsIGRQICAgICAgICAgICAgID0gJERQLmZcblx0ICAsIGdPUE4gICAgICAgICAgID0gZ09QTkV4dC5mXG5cdCAgLCAkU3ltYm9sICAgICAgICA9IGdsb2JhbC5TeW1ib2xcblx0ICAsICRKU09OICAgICAgICAgID0gZ2xvYmFsLkpTT05cblx0ICAsIF9zdHJpbmdpZnkgICAgID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5XG5cdCAgLCBQUk9UT1RZUEUgICAgICA9ICdwcm90b3R5cGUnXG5cdCAgLCBISURERU4gICAgICAgICA9IHdrcygnX2hpZGRlbicpXG5cdCAgLCBUT19QUklNSVRJVkUgICA9IHdrcygndG9QcmltaXRpdmUnKVxuXHQgICwgaXNFbnVtICAgICAgICAgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZVxuXHQgICwgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpXG5cdCAgLCBBbGxTeW1ib2xzICAgICA9IHNoYXJlZCgnc3ltYm9scycpXG5cdCAgLCBPUFN5bWJvbHMgICAgICA9IHNoYXJlZCgnb3Atc3ltYm9scycpXG5cdCAgLCBPYmplY3RQcm90byAgICA9IE9iamVjdFtQUk9UT1RZUEVdXG5cdCAgLCBVU0VfTkFUSVZFICAgICA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbidcblx0ICAsIFFPYmplY3QgICAgICAgID0gZ2xvYmFsLlFPYmplY3Q7XG5cdC8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xuXHR2YXIgc2V0dGVyID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblx0XG5cdC8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xuXHR2YXIgc2V0U3ltYm9sRGVzYyA9IERFU0NSSVBUT1JTICYmICRmYWlscyhmdW5jdGlvbigpe1xuXHQgIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcblx0ICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIGRQKHRoaXMsICdhJywge3ZhbHVlOiA3fSkuYTsgfVxuXHQgIH0pKS5hICE9IDc7XG5cdH0pID8gZnVuY3Rpb24oaXQsIGtleSwgRCl7XG5cdCAgdmFyIHByb3RvRGVzYyA9IGdPUEQoT2JqZWN0UHJvdG8sIGtleSk7XG5cdCAgaWYocHJvdG9EZXNjKWRlbGV0ZSBPYmplY3RQcm90b1trZXldO1xuXHQgIGRQKGl0LCBrZXksIEQpO1xuXHQgIGlmKHByb3RvRGVzYyAmJiBpdCAhPT0gT2JqZWN0UHJvdG8pZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcblx0fSA6IGRQO1xuXHRcblx0dmFyIHdyYXAgPSBmdW5jdGlvbih0YWcpe1xuXHQgIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG5cdCAgc3ltLl9rID0gdGFnO1xuXHQgIHJldHVybiBzeW07XG5cdH07XG5cdFxuXHR2YXIgaXNTeW1ib2wgPSBVU0VfTkFUSVZFICYmIHR5cGVvZiAkU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnID8gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG5cdH0gOiBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcblx0fTtcblx0XG5cdHZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKXtcblx0ICBpZihpdCA9PT0gT2JqZWN0UHJvdG8pJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKTtcblx0ICBhbk9iamVjdChpdCk7XG5cdCAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcblx0ICBhbk9iamVjdChEKTtcblx0ICBpZihoYXMoQWxsU3ltYm9scywga2V5KSl7XG5cdCAgICBpZighRC5lbnVtZXJhYmxlKXtcblx0ICAgICAgaWYoIWhhcyhpdCwgSElEREVOKSlkUChpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG5cdCAgICAgIGl0W0hJRERFTl1ba2V5XSA9IHRydWU7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBpZihoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKWl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuXHQgICAgICBEID0gX2NyZWF0ZShELCB7ZW51bWVyYWJsZTogY3JlYXRlRGVzYygwLCBmYWxzZSl9KTtcblx0ICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG5cdCAgfSByZXR1cm4gZFAoaXQsIGtleSwgRCk7XG5cdH07XG5cdHZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApe1xuXHQgIGFuT2JqZWN0KGl0KTtcblx0ICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpXG5cdCAgICAsIGkgICAgPSAwXG5cdCAgICAsIGwgPSBrZXlzLmxlbmd0aFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobCA+IGkpJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG5cdCAgcmV0dXJuIGl0O1xuXHR9O1xuXHR2YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCl7XG5cdCAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xuXHR9O1xuXHR2YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KXtcblx0ICB2YXIgRSA9IGlzRW51bS5jYWxsKHRoaXMsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpO1xuXHQgIGlmKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKXJldHVybiBmYWxzZTtcblx0ICByZXR1cm4gRSB8fCAhaGFzKHRoaXMsIGtleSkgfHwgIWhhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IGhhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtrZXldID8gRSA6IHRydWU7XG5cdH07XG5cdHZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuXHQgIGl0ICA9IHRvSU9iamVjdChpdCk7XG5cdCAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcblx0ICBpZihpdCA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpcmV0dXJuO1xuXHQgIHZhciBEID0gZ09QRChpdCwga2V5KTtcblx0ICBpZihEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpRC5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0ICByZXR1cm4gRDtcblx0fTtcblx0dmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG5cdCAgdmFyIG5hbWVzICA9IGdPUE4odG9JT2JqZWN0KGl0KSlcblx0ICAgICwgcmVzdWx0ID0gW11cblx0ICAgICwgaSAgICAgID0gMFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSl7XG5cdCAgICBpZighaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIGtleSAhPSBISURERU4gJiYga2V5ICE9IE1FVEEpcmVzdWx0LnB1c2goa2V5KTtcblx0ICB9IHJldHVybiByZXN1bHQ7XG5cdH07XG5cdHZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KXtcblx0ICB2YXIgSVNfT1AgID0gaXQgPT09IE9iamVjdFByb3RvXG5cdCAgICAsIG5hbWVzICA9IGdPUE4oSVNfT1AgPyBPUFN5bWJvbHMgOiB0b0lPYmplY3QoaXQpKVxuXHQgICAgLCByZXN1bHQgPSBbXVxuXHQgICAgLCBpICAgICAgPSAwXG5cdCAgICAsIGtleTtcblx0ICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKXtcblx0ICAgIGlmKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAoSVNfT1AgPyBoYXMoT2JqZWN0UHJvdG8sIGtleSkgOiB0cnVlKSlyZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuXHQgIH0gcmV0dXJuIHJlc3VsdDtcblx0fTtcblx0XG5cdC8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuXHRpZighVVNFX05BVElWRSl7XG5cdCAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpe1xuXHQgICAgaWYodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG5cdCAgICB2YXIgdGFnID0gdWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcblx0ICAgIHZhciAkc2V0ID0gZnVuY3Rpb24odmFsdWUpe1xuXHQgICAgICBpZih0aGlzID09PSBPYmplY3RQcm90bykkc2V0LmNhbGwoT1BTeW1ib2xzLCB2YWx1ZSk7XG5cdCAgICAgIGlmKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcblx0ICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcblx0ICAgIH07XG5cdCAgICBpZihERVNDUklQVE9SUyAmJiBzZXR0ZXIpc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7Y29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6ICRzZXR9KTtcblx0ICAgIHJldHVybiB3cmFwKHRhZyk7XG5cdCAgfTtcblx0ICByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG5cdCAgICByZXR1cm4gdGhpcy5faztcblx0ICB9KTtcblx0XG5cdCAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdCAgJERQLmYgICA9ICRkZWZpbmVQcm9wZXJ0eTtcblx0ICBfX3dlYnBhY2tfcmVxdWlyZV9fKDYxKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG5cdCAgX193ZWJwYWNrX3JlcXVpcmVfXygyMDApLmYgID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXHQgIF9fd2VicGFja19yZXF1aXJlX18oMTk5KS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblx0XG5cdCAgaWYoREVTQ1JJUFRPUlMgJiYgIV9fd2VicGFja19yZXF1aXJlX18oMjcpKXtcblx0ICAgIHJlZGVmaW5lKE9iamVjdFByb3RvLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHRydWUpO1xuXHQgIH1cblx0XG5cdCAgd2tzRXh0LmYgPSBmdW5jdGlvbihuYW1lKXtcblx0ICAgIHJldHVybiB3cmFwKHdrcyhuYW1lKSk7XG5cdCAgfVxuXHR9XG5cdFxuXHQkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7U3ltYm9sOiAkU3ltYm9sfSk7XG5cdFxuXHRmb3IodmFyIHN5bWJvbHMgPSAoXG5cdCAgLy8gMTkuNC4yLjIsIDE5LjQuMi4zLCAxOS40LjIuNCwgMTkuNC4yLjYsIDE5LjQuMi44LCAxOS40LjIuOSwgMTkuNC4yLjEwLCAxOS40LjIuMTEsIDE5LjQuMi4xMiwgMTkuNC4yLjEzLCAxOS40LjIuMTRcblx0ICAnaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLHNwZWNpZXMsc3BsaXQsdG9QcmltaXRpdmUsdG9TdHJpbmdUYWcsdW5zY29wYWJsZXMnXG5cdCkuc3BsaXQoJywnKSwgaSA9IDA7IHN5bWJvbHMubGVuZ3RoID4gaTsgKXdrcyhzeW1ib2xzW2krK10pO1xuXHRcblx0Zm9yKHZhciBzeW1ib2xzID0gJGtleXMod2tzLnN0b3JlKSwgaSA9IDA7IHN5bWJvbHMubGVuZ3RoID4gaTsgKXdrc0RlZmluZShzeW1ib2xzW2krK10pO1xuXHRcblx0JGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ1N5bWJvbCcsIHtcblx0ICAvLyAxOS40LjIuMSBTeW1ib2wuZm9yKGtleSlcblx0ICAnZm9yJzogZnVuY3Rpb24oa2V5KXtcblx0ICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcblx0ICAgICAgPyBTeW1ib2xSZWdpc3RyeVtrZXldXG5cdCAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcblx0ICB9LFxuXHQgIC8vIDE5LjQuMi41IFN5bWJvbC5rZXlGb3Ioc3ltKVxuXHQgIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKGtleSl7XG5cdCAgICBpZihpc1N5bWJvbChrZXkpKXJldHVybiBrZXlPZihTeW1ib2xSZWdpc3RyeSwga2V5KTtcblx0ICAgIHRocm93IFR5cGVFcnJvcihrZXkgKyAnIGlzIG5vdCBhIHN5bWJvbCEnKTtcblx0ICB9LFxuXHQgIHVzZVNldHRlcjogZnVuY3Rpb24oKXsgc2V0dGVyID0gdHJ1ZTsgfSxcblx0ICB1c2VTaW1wbGU6IGZ1bmN0aW9uKCl7IHNldHRlciA9IGZhbHNlOyB9XG5cdH0pO1xuXHRcblx0JGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcblx0ICAvLyAxOS4xLjIuMiBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG5cdCAgY3JlYXRlOiAkY3JlYXRlLFxuXHQgIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuXHQgIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG5cdCAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcblx0ICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcblx0ICAvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG5cdCAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuXHQgIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG5cdCAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG5cdCAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuXHQgIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xuXHR9KTtcblx0XG5cdC8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuXHQkSlNPTiAmJiAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCAkZmFpbHMoZnVuY3Rpb24oKXtcblx0ICB2YXIgUyA9ICRTeW1ib2woKTtcblx0ICAvLyBNUyBFZGdlIGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyB7fVxuXHQgIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuXHQgIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG5cdCAgcmV0dXJuIF9zdHJpbmdpZnkoW1NdKSAhPSAnW251bGxdJyB8fCBfc3RyaW5naWZ5KHthOiBTfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcblx0fSkpLCAnSlNPTicsIHtcblx0ICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCl7XG5cdCAgICBpZihpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSlyZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcblx0ICAgIHZhciBhcmdzID0gW2l0XVxuXHQgICAgICAsIGkgICAgPSAxXG5cdCAgICAgICwgcmVwbGFjZXIsICRyZXBsYWNlcjtcblx0ICAgIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG5cdCAgICByZXBsYWNlciA9IGFyZ3NbMV07XG5cdCAgICBpZih0eXBlb2YgcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykkcmVwbGFjZXIgPSByZXBsYWNlcjtcblx0ICAgIGlmKCRyZXBsYWNlciB8fCAhaXNBcnJheShyZXBsYWNlcikpcmVwbGFjZXIgPSBmdW5jdGlvbihrZXksIHZhbHVlKXtcblx0ICAgICAgaWYoJHJlcGxhY2VyKXZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG5cdCAgICAgIGlmKCFpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIHZhbHVlO1xuXHQgICAgfTtcblx0ICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcblx0ICAgIHJldHVybiBfc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmdzKTtcblx0ICB9XG5cdH0pO1xuXHRcblx0Ly8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuXHQkU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSB8fCBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpO1xuXHQvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5cdHNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcblx0Ly8gMjAuMi4xLjkgTWF0aFtAQHRvU3RyaW5nVGFnXVxuXHRzZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuXHQvLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuXHRzZXRUb1N0cmluZ1RhZyhnbG9iYWwuSlNPTiwgJ0pTT04nLCB0cnVlKTtcblxuLyoqKi8gfSxcbi8qIDE5NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIE1FVEEgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NCkoJ21ldGEnKVxuXHQgICwgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKVxuXHQgICwgaGFzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgc2V0RGVzYyAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKS5mXG5cdCAgLCBpZCAgICAgICA9IDA7XG5cdHZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uKCl7XG5cdCAgcmV0dXJuIHRydWU7XG5cdH07XG5cdHZhciBGUkVFWkUgPSAhX193ZWJwYWNrX3JlcXVpcmVfXygxNikoZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xuXHR9KTtcblx0dmFyIHNldE1ldGEgPSBmdW5jdGlvbihpdCl7XG5cdCAgc2V0RGVzYyhpdCwgTUVUQSwge3ZhbHVlOiB7XG5cdCAgICBpOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSURcblx0ICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG5cdCAgfX0pO1xuXHR9O1xuXHR2YXIgZmFzdEtleSA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuXHQgIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcblx0ICBpZighaXNPYmplY3QoaXQpKXJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG5cdCAgaWYoIWhhcyhpdCwgTUVUQSkpe1xuXHQgICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3Rcblx0ICAgIGlmKCFpc0V4dGVuc2libGUoaXQpKXJldHVybiAnRic7XG5cdCAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuXHQgICAgaWYoIWNyZWF0ZSlyZXR1cm4gJ0UnO1xuXHQgICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcblx0ICAgIHNldE1ldGEoaXQpO1xuXHQgIC8vIHJldHVybiBvYmplY3QgSURcblx0ICB9IHJldHVybiBpdFtNRVRBXS5pO1xuXHR9O1xuXHR2YXIgZ2V0V2VhayA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuXHQgIGlmKCFoYXMoaXQsIE1FVEEpKXtcblx0ICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG5cdCAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gdHJ1ZTtcblx0ICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG5cdCAgICBpZighY3JlYXRlKXJldHVybiBmYWxzZTtcblx0ICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG5cdCAgICBzZXRNZXRhKGl0KTtcblx0ICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuXHQgIH0gcmV0dXJuIGl0W01FVEFdLnc7XG5cdH07XG5cdC8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xuXHR2YXIgb25GcmVlemUgPSBmdW5jdGlvbihpdCl7XG5cdCAgaWYoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKXNldE1ldGEoaXQpO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblx0dmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcblx0ICBLRVk6ICAgICAgTUVUQSxcblx0ICBORUVEOiAgICAgZmFsc2UsXG5cdCAgZmFzdEtleTogIGZhc3RLZXksXG5cdCAgZ2V0V2VhazogIGdldFdlYWssXG5cdCAgb25GcmVlemU6IG9uRnJlZXplXG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnbG9iYWwgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0ICAsIGNvcmUgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuXHQgICwgTElCUkFSWSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KVxuXHQgICwgd2tzRXh0ICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1KVxuXHQgICwgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKS5mO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuXHQgIHZhciAkU3ltYm9sID0gY29yZS5TeW1ib2wgfHwgKGNvcmUuU3ltYm9sID0gTElCUkFSWSA/IHt9IDogZ2xvYmFsLlN5bWJvbCB8fCB7fSk7XG5cdCAgaWYobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSlkZWZpbmVQcm9wZXJ0eSgkU3ltYm9sLCBuYW1lLCB7dmFsdWU6IHdrc0V4dC5mKG5hbWUpfSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnZXRLZXlzICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KVxuXHQgICwgdG9JT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNik7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBlbCl7XG5cdCAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG5cdCAgICAsIGtleXMgICA9IGdldEtleXMoTylcblx0ICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcblx0ICAgICwgaW5kZXggID0gMFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobGVuZ3RoID4gaW5kZXgpaWYoT1trZXkgPSBrZXlzW2luZGV4KytdXSA9PT0gZWwpcmV0dXJuIGtleTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gYWxsIGVudW1lcmFibGUgb2JqZWN0IGtleXMsIGluY2x1ZGVzIHN5bWJvbHNcblx0dmFyIGdldEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KVxuXHQgICwgZ09QUyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk5KVxuXHQgICwgcElFICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjAwKTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgdmFyIHJlc3VsdCAgICAgPSBnZXRLZXlzKGl0KVxuXHQgICAgLCBnZXRTeW1ib2xzID0gZ09QUy5mO1xuXHQgIGlmKGdldFN5bWJvbHMpe1xuXHQgICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KVxuXHQgICAgICAsIGlzRW51bSAgPSBwSUUuZlxuXHQgICAgICAsIGkgICAgICAgPSAwXG5cdCAgICAgICwga2V5O1xuXHQgICAgd2hpbGUoc3ltYm9scy5sZW5ndGggPiBpKWlmKGlzRW51bS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pKXJlc3VsdC5wdXNoKGtleSk7XG5cdCAgfSByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTk5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKioqLyB9LFxuLyogMjAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRleHBvcnRzLmYgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqKi8gfSxcbi8qIDIwMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcblx0dmFyIGNvZiA9IF9fd2VicGFja19yZXF1aXJlX18oMzgpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpe1xuXHQgIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjAyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgcElFICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMClcblx0ICAsIGNyZWF0ZURlc2MgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSlcblx0ICAsIHRvSU9iamVjdCAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIHRvUHJpbWl0aXZlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0ICAsIGhhcyAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNClcblx0ICAsIGdPUEQgICAgICAgICAgID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblx0XG5cdGV4cG9ydHMuZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpID8gZ09QRCA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKXtcblx0ICBPID0gdG9JT2JqZWN0KE8pO1xuXHQgIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcblx0ICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuXHQgICAgcmV0dXJuIGdPUEQoTywgUCk7XG5cdCAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuXHQgIGlmKGhhcyhPLCBQKSlyZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyMDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cblxuLyoqKi8gfSxcbi8qIDIwNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxOTYpKCdhc3luY0l0ZXJhdG9yJyk7XG5cbi8qKiovIH0sXG4vKiAyMDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTk2KSgnb2JzZXJ2YWJsZScpO1xuXG4vKioqLyB9LFxuLyogMjA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGNsYXNzOiB7XG5cdCAgICAgICdvcGVuJzogX3ZtLnNob3dEcm9wZG93blxuXHQgICAgfSxcblx0ICAgIHN0YXRpY1N0eWxlOiB7XG5cdCAgICAgIFwicG9zaXRpb25cIjogXCJyZWxhdGl2ZVwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImZvcm0tY29udHJvbFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwidGV4dFwiLFxuXHQgICAgICBcImF1dG9jb21wbGV0ZVwiOiBcIm9mZlwiLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlclxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5zaG93RHJvcGRvd24gPSBmYWxzZVxuXHQgICAgICB9LFxuXHQgICAgICBcImtleWRvd25cIjogW2Z1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZG93blwiLCA0MCkpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLmRvd24oJGV2ZW50KVxuXHQgICAgICB9LCBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzKSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0uaGl0KCRldmVudClcblx0ICAgICAgfSwgZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS5yZXNldCgkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwidXBcIiwgMzgpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS51cCgkZXZlbnQpXG5cdCAgICAgIH1dLFxuXHQgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmICgkZXZlbnQudGFyZ2V0LmNvbXBvc2luZykgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0udmFsID0gJGV2ZW50LnRhcmdldC52YWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygndWwnLCB7XG5cdCAgICByZWY6IFwiZHJvcGRvd25cIixcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRyb3Bkb3duLW1lbnVcIlxuXHQgIH0sIF92bS5fbCgoX3ZtLml0ZW1zKSwgZnVuY3Rpb24oaXRlbSwgaSkge1xuXHQgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgIGNsYXNzOiB7XG5cdCAgICAgICAgJ2FjdGl2ZSc6IF92bS5pc0FjdGl2ZShpKVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uaGl0KCRldmVudClcblx0ICAgICAgICB9LFxuXHQgICAgICAgIFwibW91c2Vtb3ZlXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLnNldEFjdGl2ZShpKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fYyhfdm0udG1wbCwge1xuXHQgICAgICB0YWc6IFwiY29tcG9uZW50XCIsXG5cdCAgICAgIGF0dHJzOiB7XG5cdCAgICAgICAgXCJpdGVtXCI6IGl0ZW1cblx0ICAgICAgfVxuXHQgICAgfSldLCAxKV0pXG5cdCAgfSkpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNWI1ZjVlOTRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH1cbi8qKioqKiovIF0pXG59KTtcbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZ1ZS1zdHJhcC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdnVlLXN0cmFwL2Rpc3QvdnVlLXN0cmFwLmpzXG4vLyBtb2R1bGUgaWQgPSA0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 44 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"// style-loader: Adds some css to the DOM by adding a \" ).appendTo( body );\n\t\t}\n\n\t\tif ( o.opacity ) { // opacity option\n\t\t\tif ( this.helper.css( \"opacity\" ) ) {\n\t\t\t\tthis._storedOpacity = this.helper.css( \"opacity\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"opacity\", o.opacity );\n\t\t}\n\n\t\tif ( o.zIndex ) { // zIndex option\n\t\t\tif ( this.helper.css( \"zIndex\" ) ) {\n\t\t\t\tthis._storedZIndex = this.helper.css( \"zIndex\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"zIndex\", o.zIndex );\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"start\", event, this._uiHash() );\n\n\t\t//Recache the helper size\n\t\tif ( !this._preserveHelperProportions ) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif ( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis._addClass( this.helper, \"ui-sortable-helper\" );\n\n\t\t// Execute the drag once - this causes the helper not to be visiblebefore getting its\n\t\t// correct position\n\t\tthis._mouseDrag( event );\n\t\treturn true;\n\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options,\n\t\t\tscrolled = false;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\tif ( !this.lastPositionAbs ) {\n\t\t\tthis.lastPositionAbs = this.positionAbs;\n\t\t}\n\n\t\t//Do scrolling\n\t\tif ( this.options.scroll ) {\n\t\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\n\t\t\t\tif ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -\n\t\t\t\t\t\tevent.pageY < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t\tif ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -\n\t\t\t\t\t\tevent.pageX < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );\n\t\t\t\t} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );\n\t\t\t\t}\n\n\t\t\t\tif ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() - o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\t\tthis.document.scrollLeft() + o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t\t}\n\t\t}\n\n\t\t//Regenerate the absolute position used for position checks\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Set the helper position\n\t\tif ( !this.options.axis || this.options.axis !== \"y\" ) {\n\t\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( !this.options.axis || this.options.axis !== \"x\" ) {\n\t\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\t\t}\n\n\t\t//Rearrange\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\n\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[ i ];\n\t\t\titemElement = item.item[ 0 ];\n\t\t\tintersection = this._intersectsWithPointer( item );\n\t\t\tif ( !intersection ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t// items from other containers. This works because when moving\n\t\t\t// an item from one container to another the\n\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t//\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t// the placeholder to jitter between the outer and inner container.\n\t\t\tif ( item.instance !== this.currentContainer ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Cannot intersect with itself\n\t\t\t// no useless actions that have been done before\n\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\tif ( itemElement !== this.currentItem[ 0 ] &&\n\t\t\t\tthis.placeholder[ intersection === 1 ? \"next\" : \"prev\" ]()[ 0 ] !== itemElement &&\n\t\t\t\t!$.contains( this.placeholder[ 0 ], itemElement ) &&\n\t\t\t\t( this.options.type === \"semi-dynamic\" ?\n\t\t\t\t\t!$.contains( this.element[ 0 ], itemElement ) :\n\t\t\t\t\ttrue\n\t\t\t\t)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif ( this.options.tolerance === \"pointer\" || this._intersectsWithSides( item ) ) {\n\t\t\t\t\tthis._rearrange( event, item );\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers( event );\n\n\t\t//Interconnect with droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"sort\", event, this._uiHash() );\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function( event, noPropagation ) {\n\n\t\tif ( !event ) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\tif ( this.options.revert ) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollLeft\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollTop\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$( this.helper ).animate(\n\t\t\t\tanimation,\n\t\t\t\tparseInt( this.options.revert, 10 ) || 500,\n\t\t\t\tfunction() {\n\t\t\t\t\tthat._clear( event );\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tthis._clear( event, noPropagation );\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: null } ) );\n\n\t\t\tif ( this.options.helper === \"original\" ) {\n\t\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor ( var i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"deactivate\", null, this._uiHash( this ) );\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", null, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.placeholder ) {\n\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t\t// it unbinds ALL events from the original node!\n\t\t\tif ( this.placeholder[ 0 ].parentNode ) {\n\t\t\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\t\t\t}\n\t\t\tif ( this.options.helper !== \"original\" && this.helper &&\n\t\t\t\t\tthis.helper[ 0 ].parentNode ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend( this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t} );\n\n\t\t\tif ( this.domPosition.prev ) {\n\t\t\t\t$( this.domPosition.prev ).after( this.currentItem );\n\t\t\t} else {\n\t\t\t\t$( this.domPosition.parent ).prepend( this.currentItem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$( items ).each( function() {\n\t\t\tvar res = ( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" )\n\t\t\t\t.match( o.expression || ( /(.+)[\\-=_](.+)/ ) );\n\t\t\tif ( res ) {\n\t\t\t\tstr.push(\n\t\t\t\t\t( o.key || res[ 1 ] + \"[]\" ) +\n\t\t\t\t\t\"=\" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );\n\t\t\t}\n\t\t} );\n\n\t\tif ( !str.length && o.key ) {\n\t\t\tstr.push( o.key + \"=\" );\n\t\t}\n\n\t\treturn str.join( \"&\" );\n\n\t},\n\n\ttoArray: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each( function() {\n\t\t\tret.push( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" );\n\t\t} );\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function( item ) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t &&\n\t\t\t\t( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l &&\n\t\t\t\t( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t( this.options.tolerance !== \"pointer\" &&\n\t\t\t\tthis.helperProportions[ this.floating ? \"width\" : \"height\" ] >\n\t\t\t\titem[ this.floating ? \"width\" : \"height\" ] )\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( this.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( this.helperProportions.height / 2 ) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function( item ) {\n\t\tvar verticalDirection, horizontalDirection,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.top + this.offset.click.top, item.top, item.height ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.left + this.offset.click.left, item.left, item.width ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( !isOverElement ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tverticalDirection = this._getDragVerticalDirection();\n\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\treturn this.floating ?\n\t\t\t( ( horizontalDirection === \"right\" || verticalDirection === \"down\" ) ? 2 : 1 )\n\t\t\t: ( verticalDirection && ( verticalDirection === \"down\" ? 2 : 1 ) );\n\n\t},\n\n\t_intersectsWithSides: function( item ) {\n\n\t\tvar isOverBottomHalf = this._isOverAxis( this.positionAbs.top +\n\t\t\t\tthis.offset.click.top, item.top + ( item.height / 2 ), item.height ),\n\t\t\tisOverRightHalf = this._isOverAxis( this.positionAbs.left +\n\t\t\t\tthis.offset.click.left, item.left + ( item.width / 2 ), item.width ),\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\n\n\t\tif ( this.floating && horizontalDirection ) {\n\t\t\treturn ( ( horizontalDirection === \"right\" && isOverRightHalf ) ||\n\t\t\t\t( horizontalDirection === \"left\" && !isOverRightHalf ) );\n\t\t} else {\n\t\t\treturn verticalDirection && ( ( verticalDirection === \"down\" && isOverBottomHalf ) ||\n\t\t\t\t( verticalDirection === \"up\" && !isOverBottomHalf ) );\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && ( delta > 0 ? \"down\" : \"up\" );\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && ( delta > 0 ? \"right\" : \"left\" );\n\t},\n\n\trefresh: function( event ) {\n\t\tthis._refreshItems( event );\n\t\tthis._setHandleClassName();\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ?\n\t\t\t[ options.connectWith ] :\n\t\t\toptions.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function( connected ) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif ( connectWith && connected ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items.call( inst.element ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-placeholder\" ), inst ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push( [ $.isFunction( this.options.items ) ?\n\t\t\tthis.options.items\n\t\t\t\t.call( this.element, null, { options: this.options, item: this.currentItem } ) :\n\t\t\t$( this.options.items, this.element )\n\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t.not( \".ui-sortable-placeholder\" ), this ] );\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\tqueries[ i ][ 0 ].each( addItems );\n\t\t}\n\n\t\treturn $( items );\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find( \":data(\" + this.widgetName + \"-item)\" );\n\n\t\tthis.items = $.grep( this.items, function( item ) {\n\t\t\tfor ( var j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === item.item[ 0 ] ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} );\n\n\t},\n\n\t_refreshItems: function( event ) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [ this ];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [ [ $.isFunction( this.options.items ) ?\n\t\t\t\tthis.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t$( this.options.items, this.element ), this ] ],\n\t\t\tconnectWith = this._connectWith();\n\n\t\t//Shouldn't be run the first time through due to massive slow-down\n\t\tif ( connectWith && this.ready ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ $.isFunction( inst.options.items ) ?\n\t\t\t\t\t\t\tinst.options.items\n\t\t\t\t\t\t\t\t.call( inst.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element ), inst ] );\n\t\t\t\t\t\tthis.containers.push( inst );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\ttargetData = queries[ i ][ 1 ];\n\t\t\t_queries = queries[ i ][ 0 ];\n\n\t\t\tfor ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {\n\t\t\t\titem = $( _queries[ j ] );\n\n\t\t\t\t// Data for target checking (mouse manager)\n\t\t\t\titem.data( this.widgetName + \"-item\", targetData );\n\n\t\t\t\titems.push( {\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t},\n\n\trefreshPositions: function( fast ) {\n\n\t\t// Determine whether items are being displayed horizontally\n\t\tthis.floating = this.items.length ?\n\t\t\tthis.options.axis === \"x\" || this._isFloating( this.items[ 0 ].item ) :\n\t\t\tfalse;\n\n\t\t//This has to be redone because due to the item being moved out/into the offsetParent,\n\t\t// the offsetParent's position will change\n\t\tif ( this.offsetParent && this.helper ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tvar i, item, t, p;\n\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\titem = this.items[ i ];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif ( item.instance !== this.currentContainer && this.currentContainer &&\n\t\t\t\t\titem.item[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ?\n\t\t\t\t$( this.options.toleranceElement, item.item ) :\n\t\t\t\titem.item;\n\n\t\t\tif ( !fast ) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\n\t\tif ( this.options.custom && this.options.custom.refreshContainers ) {\n\t\t\tthis.options.custom.refreshContainers.call( this );\n\t\t} else {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tp = this.containers[ i ].element.offset();\n\t\t\t\tthis.containers[ i ].containerCache.left = p.left;\n\t\t\t\tthis.containers[ i ].containerCache.top = p.top;\n\t\t\t\tthis.containers[ i ].containerCache.width =\n\t\t\t\t\tthis.containers[ i ].element.outerWidth();\n\t\t\t\tthis.containers[ i ].containerCache.height =\n\t\t\t\t\tthis.containers[ i ].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function( that ) {\n\t\tthat = that || this;\n\t\tvar className,\n\t\t\to = that.options;\n\n\t\tif ( !o.placeholder || o.placeholder.constructor === String ) {\n\t\t\tclassName = o.placeholder;\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),\n\t\t\t\t\t\telement = $( \"<\" + nodeName + \">\", that.document[ 0 ] );\n\n\t\t\t\t\t\tthat._addClass( element, \"ui-sortable-placeholder\",\n\t\t\t\t\t\t\t\tclassName || that.currentItem[ 0 ].className )\n\t\t\t\t\t\t\t._removeClass( element, \"ui-sortable-helper\" );\n\n\t\t\t\t\tif ( nodeName === \"tbody\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder(\n\t\t\t\t\t\t\tthat.currentItem.find( \"tr\" ).eq( 0 ),\n\t\t\t\t\t\t\t$( \"\", that.document[ 0 ] ).appendTo( element )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder( that.currentItem, element );\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function( container, p ) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes -\n\t\t\t\t\t// the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a\n\t\t\t\t\t// class name is specified\n\t\t\t\t\tif ( className && !o.forcePlaceholderSize ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t//If the element doesn't have a actual height by itself (without styles coming\n\t\t\t\t\t// from a stylesheet), it receives the inline height from the dragged item\n\t\t\t\t\tif ( !p.height() ) {\n\t\t\t\t\t\tp.height(\n\t\t\t\t\t\t\tthat.currentItem.innerHeight() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingTop\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingBottom\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t\tif ( !p.width() ) {\n\t\t\t\t\t\tp.width(\n\t\t\t\t\t\t\tthat.currentItem.innerWidth() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingLeft\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingRight\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after( that.placeholder );\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update( that, that.placeholder );\n\n\t},\n\n\t_createTrPlaceholder: function( sourceTr, targetTr ) {\n\t\tvar that = this;\n\n\t\tsourceTr.children().each( function() {\n\t\t\t$( \" \", that.document[ 0 ] )\n\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t.appendTo( targetTr );\n\t\t} );\n\t},\n\n\t_contactContainers: function( event ) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,\n\t\t\tfloating, axis,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// Get innermost container that intersects with item\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\n\t\t\t// Never consider a container that's located within the item itself\n\t\t\tif ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( this._intersectsWith( this.containers[ i ].containerCache ) ) {\n\n\t\t\t\t// If we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif ( innermostContainer &&\n\t\t\t\t\t\t$.contains(\n\t\t\t\t\t\t\tthis.containers[ i ].element[ 0 ],\n\t\t\t\t\t\t\tinnermostContainer.element[ 0 ] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[ i ];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", event, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// If no intersecting containers found, return\n\t\tif ( !innermostContainer ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Move the item into the container if it's not there already\n\t\tif ( this.containers.length === 1 ) {\n\t\t\tif ( !this.containers[ innermostIndex ].containerCache.over ) {\n\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// When entering a new container, we will find the item with the least distance and\n\t\t\t// append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || this._isFloating( this.currentItem );\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\taxis = floating ? \"pageX\" : \"pageY\";\n\n\t\t\tfor ( j = this.items.length - 1; j >= 0; j-- ) {\n\t\t\t\tif ( !$.contains(\n\t\t\t\t\t\tthis.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcur = this.items[ j ].item.offset()[ posProperty ];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t}\n\n\t\t\t\tif ( Math.abs( event[ axis ] - cur ) < dist ) {\n\t\t\t\t\tdist = Math.abs( event[ axis ] - cur );\n\t\t\t\t\titemWithLeastDistance = this.items[ j ];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\" : \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.currentContainer === this.containers[ innermostIndex ] ) {\n\t\t\t\tif ( !this.currentContainer.containerCache.over ) {\n\t\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash() );\n\t\t\t\t\tthis.currentContainer.containerCache.over = 1;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\titemWithLeastDistance ?\n\t\t\t\tthis._rearrange( event, itemWithLeastDistance, null, true ) :\n\t\t\t\tthis._rearrange( event, null, this.containers[ innermostIndex ].element, true );\n\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"change\", event, this._uiHash( this ) );\n\t\t\tthis.currentContainer = this.containers[ innermostIndex ];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update( this.currentContainer, this.placeholder );\n\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t}\n\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelper = $.isFunction( o.helper ) ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem );\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\t$( o.appendTo !== \"parent\" ?\n\t\t\t\to.appendTo :\n\t\t\t\tthis.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );\n\t\t}\n\n\t\tif ( helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tthis._storedCSS = {\n\t\t\t\twidth: this.currentItem[ 0 ].style.width,\n\t\t\t\theight: this.currentItem[ 0 ].style.height,\n\t\t\t\tposition: this.currentItem.css( \"position\" ),\n\t\t\t\ttop: this.currentItem.css( \"top\" ),\n\t\t\t\tleft: this.currentItem.css( \"left\" )\n\t\t\t};\n\t\t}\n\n\t\tif ( !helper[ 0 ].style.width || o.forceHelperSize ) {\n\t\t\thelper.width( this.currentItem.width() );\n\t\t}\n\t\tif ( !helper[ 0 ].style.height || o.forceHelperSize ) {\n\t\t\thelper.height( this.currentItem.height() );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( $.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this\n\t\t// information with an ugly IE fix\n\t\tif ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||\n\t\t\t\t( this.offsetParent[ 0 ].tagName &&\n\t\t\t\tthis.offsetParent[ 0 ].tagName.toLowerCase() === \"html\" && $.ui.ie ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif ( this.cssPosition === \"relative\" ) {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.currentItem.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.currentItem.css( \"marginTop\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\t\tif ( o.containment === \"document\" || o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\to.containment === \"document\" ?\n\t\t\t\t\tthis.document.width() :\n\t\t\t\t\tthis.window.width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( o.containment === \"document\" ?\n\t\t\t\t\t( this.document.height() || document.body.parentNode.scrollHeight ) :\n\t\t\t\t\tthis.window.height() || this.document[ 0 ].body.parentNode.scrollHeight\n\t\t\t\t) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {\n\t\t\tce = $( o.containment )[ 0 ];\n\t\t\tco = $( o.containment ).offset();\n\t\t\tover = ( $( ce ).css( \"overflow\" ) !== \"hidden\" );\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + ( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingLeft\" ), 10 ) || 0 ) - this.margins.left,\n\t\t\t\tco.top + ( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingTop\" ), 10 ) || 0 ) - this.margins.top,\n\t\t\t\tco.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\tco.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :\n\t\t\t\t\tscroll.scrollLeft() ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event ) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif ( this.cssPosition === \"relative\" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif ( this.originalPosition ) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {\n\t\t\t\t\tpageX = this.containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {\n\t\t\t\t\tpageY = this.containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {\n\t\t\t\t\tpageX = this.containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {\n\t\t\t\t\tpageY = this.containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\t\t\t\ttop = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /\n\t\t\t\t\to.grid[ 1 ] ) * o.grid[ 1 ];\n\t\t\t\tpageY = this.containment ?\n\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] &&\n\t\t\t\t\t\ttop - this.offset.click.top <= this.containment[ 3 ] ) ?\n\t\t\t\t\t\t\ttop :\n\t\t\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?\n\t\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :\n\t\t\t\t\t\t\t\ttop;\n\n\t\t\t\tleft = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /\n\t\t\t\t\to.grid[ 0 ] ) * o.grid[ 0 ];\n\t\t\t\tpageX = this.containment ?\n\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] &&\n\t\t\t\t\t\tleft - this.offset.click.left <= this.containment[ 2 ] ) ?\n\t\t\t\t\t\t\tleft :\n\t\t\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?\n\t\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :\n\t\t\t\t\t\t\t\tleft;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.left -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() :\n\t\t\t\t\tscrollIsRootNode ? 0 : scroll.scrollLeft() ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function( event, i, a, hardRefresh ) {\n\n\t\ta ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :\n\t\t\ti.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],\n\t\t\t\t( this.direction === \"down\" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );\n\n\t\t//Various things done here to improve the performance:\n\t\t// 1. we create a setTimeout, that calls refreshPositions\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout,\n\t\t// if it's still the same\n\t\t// 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay( function() {\n\t\t\tif ( counter === this.counter ) {\n\n\t\t\t\t//Precompute after each DOM insertion, NOT on mousemove\n\t\t\t\tthis.refreshPositions( !hardRefresh );\n\t\t\t}\n\t\t} );\n\n\t},\n\n\t_clear: function( event, noPropagation ) {\n\n\t\tthis.reverting = false;\n\n\t\t// We delay all events that have to be triggered to after the point where the placeholder\n\t\t// has been removed and everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t// We first have to update the dom position of the actual currentItem\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets\n\t\t// reappended (see #4088)\n\t\tif ( !this._noFinalSort && this.currentItem.parent().length ) {\n\t\t\tthis.placeholder.before( this.currentItem );\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tfor ( i in this._storedCSS ) {\n\t\t\t\tif ( this._storedCSS[ i ] === \"auto\" || this._storedCSS[ i ] === \"static\" ) {\n\t\t\t\t\tthis._storedCSS[ i ] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif ( this.fromOutside && !noPropagation ) {\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"receive\", event, this._uiHash( this.fromOutside ) );\n\t\t\t} );\n\t\t}\n\t\tif ( ( this.fromOutside ||\n\t\t\t\tthis.domPosition.prev !==\n\t\t\t\tthis.currentItem.prev().not( \".ui-sortable-helper\" )[ 0 ] ||\n\t\t\t\tthis.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {\n\n\t\t\t// Trigger update callback if the DOM position has changed\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"update\", event, this._uiHash() );\n\t\t\t} );\n\t\t}\n\n\t\t// Check if the items Container has Changed and trigger appropriate\n\t\t// events.\n\t\tif ( this !== this.currentContainer ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\t\tthis._trigger( \"remove\", event, this._uiHash() );\n\t\t\t\t} );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"receive\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"update\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tfunction delayEvent( type, instance, container ) {\n\t\t\treturn function( event ) {\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\n\t\t\t};\n\t\t}\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\n\t\t\t}\n\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\n\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t//Do what was originally in plugins\n\t\tif ( this.storedCursor ) {\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\n\t\t\tthis.storedStylesheet.remove();\n\t\t}\n\t\tif ( this._storedOpacity ) {\n\t\t\tthis.helper.css( \"opacity\", this._storedOpacity );\n\t\t}\n\t\tif ( this._storedZIndex ) {\n\t\t\tthis.helper.css( \"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex );\n\t\t}\n\n\t\tthis.dragging = false;\n\n\t\tif ( !noPropagation ) {\n\t\t\tthis._trigger( \"beforeStop\", event, this._uiHash() );\n\t\t}\n\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t// it unbinds ALL events from the original node!\n\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\n\t\tif ( !this.cancelHelperRemoval ) {\n\t\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\t\t\tthis.helper = null;\n\t\t}\n\n\t\tif ( !noPropagation ) {\n\t\t\tfor ( i = 0; i < delayedTriggers.length; i++ ) {\n\n\t\t\t\t// Trigger all delayed events\n\t\t\t\tdelayedTriggers[ i ].call( this, event );\n\t\t\t}\n\t\t\tthis._trigger( \"stop\", event, this._uiHash() );\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn !this.cancelHelperRemoval;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function( _inst ) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $( [] ),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n} );\n\n\n/*!\n * jQuery UI Spinner 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Spinner\n//>>group: Widgets\n//>>description: Displays buttons to easily input numbers via the keyboard or mouse.\n//>>docs: http://api.jqueryui.com/spinner/\n//>>demos: http://jqueryui.com/spinner/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/spinner.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\nfunction spinnerModifer( fn ) {\n\treturn function() {\n\t\tvar previous = this.element.val();\n\t\tfn.apply( this, arguments );\n\t\tthis._refresh();\n\t\tif ( previous !== this.element.val() ) {\n\t\t\tthis._trigger( \"change\" );\n\t\t}\n\t};\n}\n\n$.widget( \"ui.spinner\", {\n\tversion: \"1.12.1\",\n\tdefaultElement: \"\",\n\twidgetEventPrefix: \"spin\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-spinner\": \"ui-corner-all\",\n\t\t\t\"ui-spinner-down\": \"ui-corner-br\",\n\t\t\t\"ui-spinner-up\": \"ui-corner-tr\"\n\t\t},\n\t\tculture: null,\n\t\ticons: {\n\t\t\tdown: \"ui-icon-triangle-1-s\",\n\t\t\tup: \"ui-icon-triangle-1-n\"\n\t\t},\n\t\tincremental: true,\n\t\tmax: null,\n\t\tmin: null,\n\t\tnumberFormat: null,\n\t\tpage: 10,\n\t\tstep: 1,\n\n\t\tchange: null,\n\t\tspin: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\n\t_create: function() {\n\n\t\t// handle string values that need to be parsed\n\t\tthis._setOption( \"max\", this.options.max );\n\t\tthis._setOption( \"min\", this.options.min );\n\t\tthis._setOption( \"step\", this.options.step );\n\n\t\t// Only format if there is a value, prevents the field from being marked\n\t\t// as invalid in Firefox, see #9573.\n\t\tif ( this.value() !== \"\" ) {\n\n\t\t\t// Format the value, but don't constrain.\n\t\t\tthis._value( this.element.val(), true );\n\t\t}\n\n\t\tthis._draw();\n\t\tthis._on( this._events );\n\t\tthis._refresh();\n\n\t\t// Turning off autocomplete prevents the browser from remembering the\n\t\t// value when navigating through history, so we re-enable autocomplete\n\t\t// if the page is unloaded before the widget is destroyed. #7790\n\t\tthis._on( this.window, {\n\t\t\tbeforeunload: function() {\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_getCreateOptions: function() {\n\t\tvar options = this._super();\n\t\tvar element = this.element;\n\n\t\t$.each( [ \"min\", \"max\", \"step\" ], function( i, option ) {\n\t\t\tvar value = element.attr( option );\n\t\t\tif ( value != null && value.length ) {\n\t\t\t\toptions[ option ] = value;\n\t\t\t}\n\t\t} );\n\n\t\treturn options;\n\t},\n\n\t_events: {\n\t\tkeydown: function( event ) {\n\t\t\tif ( this._start( event ) && this._keydown( event ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\t\tkeyup: \"_stop\",\n\t\tfocus: function() {\n\t\t\tthis.previous = this.element.val();\n\t\t},\n\t\tblur: function( event ) {\n\t\t\tif ( this.cancelBlur ) {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._stop();\n\t\t\tthis._refresh();\n\t\t\tif ( this.previous !== this.element.val() ) {\n\t\t\t\tthis._trigger( \"change\", event );\n\t\t\t}\n\t\t},\n\t\tmousewheel: function( event, delta ) {\n\t\t\tif ( !delta ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !this.spinning && !this._start( event ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event );\n\t\t\tclearTimeout( this.mousewheelTimer );\n\t\t\tthis.mousewheelTimer = this._delay( function() {\n\t\t\t\tif ( this.spinning ) {\n\t\t\t\t\tthis._stop( event );\n\t\t\t\t}\n\t\t\t}, 100 );\n\t\t\tevent.preventDefault();\n\t\t},\n\t\t\"mousedown .ui-spinner-button\": function( event ) {\n\t\t\tvar previous;\n\n\t\t\t// We never want the buttons to have focus; whenever the user is\n\t\t\t// interacting with the spinner, the focus should be on the input.\n\t\t\t// If the input is focused then this.previous is properly set from\n\t\t\t// when the input first received focus. If the input is not focused\n\t\t\t// then we need to set this.previous based on the value before spinning.\n\t\t\tprevious = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ?\n\t\t\t\tthis.previous : this.element.val();\n\t\t\tfunction checkFocus() {\n\t\t\t\tvar isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] );\n\t\t\t\tif ( !isActive ) {\n\t\t\t\t\tthis.element.trigger( \"focus\" );\n\t\t\t\t\tthis.previous = previous;\n\n\t\t\t\t\t// support: IE\n\t\t\t\t\t// IE sets focus asynchronously, so we need to check if focus\n\t\t\t\t\t// moved off of the input because the user clicked on the button.\n\t\t\t\t\tthis._delay( function() {\n\t\t\t\t\t\tthis.previous = previous;\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Ensure focus is on (or stays on) the text field\n\t\t\tevent.preventDefault();\n\t\t\tcheckFocus.call( this );\n\n\t\t\t// Support: IE\n\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\n\t\t\t// so we set a flag to know when we should ignore the blur event\n\t\t\t// and check (again) if focus moved off of the input.\n\t\t\tthis.cancelBlur = true;\n\t\t\tthis._delay( function() {\n\t\t\t\tdelete this.cancelBlur;\n\t\t\t\tcheckFocus.call( this );\n\t\t\t} );\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\t\t\"mouseup .ui-spinner-button\": \"_stop\",\n\t\t\"mouseenter .ui-spinner-button\": function( event ) {\n\n\t\t\t// button will add ui-state-active if mouse was down while mouseleave and kept down\n\t\t\tif ( !$( event.currentTarget ).hasClass( \"ui-state-active\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this._start( event ) === false ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis._repeat( null, $( event.currentTarget )\n\t\t\t\t.hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\n\t\t},\n\n\t\t// TODO: do we really want to consider this a stop?\n\t\t// shouldn't we just stop the repeater and wait until mouseup before\n\t\t// we trigger the stop event?\n\t\t\"mouseleave .ui-spinner-button\": \"_stop\"\n\t},\n\n\t// Support mobile enhanced option and make backcompat more sane\n\t_enhance: function() {\n\t\tthis.uiSpinner = this.element\n\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t.wrap( \"\" )\n\t\t\t.parent()\n\n\t\t\t\t// Add buttons\n\t\t\t\t.append(\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\t},\n\n\t_draw: function() {\n\t\tthis._enhance();\n\n\t\tthis._addClass( this.uiSpinner, \"ui-spinner\", \"ui-widget ui-widget-content\" );\n\t\tthis._addClass( \"ui-spinner-input\" );\n\n\t\tthis.element.attr( \"role\", \"spinbutton\" );\n\n\t\t// Button bindings\n\t\tthis.buttons = this.uiSpinner.children( \"a\" )\n\t\t\t.attr( \"tabIndex\", -1 )\n\t\t\t.attr( \"aria-hidden\", true )\n\t\t\t.button( {\n\t\t\t\tclasses: {\n\t\t\t\t\t\"ui-button\": \"\"\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// TODO: Right now button does not support classes this is already updated in button PR\n\t\tthis._removeClass( this.buttons, \"ui-corner-all\" );\n\n\t\tthis._addClass( this.buttons.first(), \"ui-spinner-button ui-spinner-up\" );\n\t\tthis._addClass( this.buttons.last(), \"ui-spinner-button ui-spinner-down\" );\n\t\tthis.buttons.first().button( {\n\t\t\t\"icon\": this.options.icons.up,\n\t\t\t\"showLabel\": false\n\t\t} );\n\t\tthis.buttons.last().button( {\n\t\t\t\"icon\": this.options.icons.down,\n\t\t\t\"showLabel\": false\n\t\t} );\n\n\t\t// IE 6 doesn't understand height: 50% for the buttons\n\t\t// unless the wrapper has an explicit height\n\t\tif ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&\n\t\t\t\tthis.uiSpinner.height() > 0 ) {\n\t\t\tthis.uiSpinner.height( this.uiSpinner.height() );\n\t\t}\n\t},\n\n\t_keydown: function( event ) {\n\t\tvar options = this.options,\n\t\t\tkeyCode = $.ui.keyCode;\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase keyCode.UP:\n\t\t\tthis._repeat( null, 1, event );\n\t\t\treturn true;\n\t\tcase keyCode.DOWN:\n\t\t\tthis._repeat( null, -1, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_UP:\n\t\t\tthis._repeat( null, options.page, event );\n\t\t\treturn true;\n\t\tcase keyCode.PAGE_DOWN:\n\t\t\tthis._repeat( null, -options.page, event );\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_start: function( event ) {\n\t\tif ( !this.spinning && this._trigger( \"start\", event ) === false ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\t\tthis.spinning = true;\n\t\treturn true;\n\t},\n\n\t_repeat: function( i, steps, event ) {\n\t\ti = i || 500;\n\n\t\tclearTimeout( this.timer );\n\t\tthis.timer = this._delay( function() {\n\t\t\tthis._repeat( 40, steps, event );\n\t\t}, i );\n\n\t\tthis._spin( steps * this.options.step, event );\n\t},\n\n\t_spin: function( step, event ) {\n\t\tvar value = this.value() || 0;\n\n\t\tif ( !this.counter ) {\n\t\t\tthis.counter = 1;\n\t\t}\n\n\t\tvalue = this._adjustValue( value + step * this._increment( this.counter ) );\n\n\t\tif ( !this.spinning || this._trigger( \"spin\", event, { value: value } ) !== false ) {\n\t\t\tthis._value( value );\n\t\t\tthis.counter++;\n\t\t}\n\t},\n\n\t_increment: function( i ) {\n\t\tvar incremental = this.options.incremental;\n\n\t\tif ( incremental ) {\n\t\t\treturn $.isFunction( incremental ) ?\n\t\t\t\tincremental( i ) :\n\t\t\t\tMath.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );\n\t\t}\n\n\t\treturn 1;\n\t},\n\n\t_precision: function() {\n\t\tvar precision = this._precisionOf( this.options.step );\n\t\tif ( this.options.min !== null ) {\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\n\t\t}\n\t\treturn precision;\n\t},\n\n\t_precisionOf: function( num ) {\n\t\tvar str = num.toString(),\n\t\t\tdecimal = str.indexOf( \".\" );\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\n\t},\n\n\t_adjustValue: function( value ) {\n\t\tvar base, aboveMin,\n\t\t\toptions = this.options;\n\n\t\t// Make sure we're at a valid step\n\t\t// - find out where we are relative to the base (min or 0)\n\t\tbase = options.min !== null ? options.min : 0;\n\t\taboveMin = value - base;\n\n\t\t// - round to the nearest step\n\t\taboveMin = Math.round( aboveMin / options.step ) * options.step;\n\n\t\t// - rounding is based on 0, so adjust back to our base\n\t\tvalue = base + aboveMin;\n\n\t\t// Fix precision from bad JS floating point math\n\t\tvalue = parseFloat( value.toFixed( this._precision() ) );\n\n\t\t// Clamp the value\n\t\tif ( options.max !== null && value > options.max ) {\n\t\t\treturn options.max;\n\t\t}\n\t\tif ( options.min !== null && value < options.min ) {\n\t\t\treturn options.min;\n\t\t}\n\n\t\treturn value;\n\t},\n\n\t_stop: function( event ) {\n\t\tif ( !this.spinning ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( this.timer );\n\t\tclearTimeout( this.mousewheelTimer );\n\t\tthis.counter = 0;\n\t\tthis.spinning = false;\n\t\tthis._trigger( \"stop\", event );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar prevValue, first, last;\n\n\t\tif ( key === \"culture\" || key === \"numberFormat\" ) {\n\t\t\tprevValue = this._parse( this.element.val() );\n\t\t\tthis.options[ key ] = value;\n\t\t\tthis.element.val( this._format( prevValue ) );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key === \"max\" || key === \"min\" || key === \"step\" ) {\n\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\tvalue = this._parse( value );\n\t\t\t}\n\t\t}\n\t\tif ( key === \"icons\" ) {\n\t\t\tfirst = this.buttons.first().find( \".ui-icon\" );\n\t\t\tthis._removeClass( first, null, this.options.icons.up );\n\t\t\tthis._addClass( first, null, value.up );\n\t\t\tlast = this.buttons.last().find( \".ui-icon\" );\n\t\t\tthis._removeClass( last, null, this.options.icons.down );\n\t\t\tthis._addClass( last, null, value.down );\n\t\t}\n\n\t\tthis._super( key, value );\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._super( value );\n\n\t\tthis._toggleClass( this.uiSpinner, null, \"ui-state-disabled\", !!value );\n\t\tthis.element.prop( \"disabled\", !!value );\n\t\tthis.buttons.button( value ? \"disable\" : \"enable\" );\n\t},\n\n\t_setOptions: spinnerModifer( function( options ) {\n\t\tthis._super( options );\n\t} ),\n\n\t_parse: function( val ) {\n\t\tif ( typeof val === \"string\" && val !== \"\" ) {\n\t\t\tval = window.Globalize && this.options.numberFormat ?\n\t\t\t\tGlobalize.parseFloat( val, 10, this.options.culture ) : +val;\n\t\t}\n\t\treturn val === \"\" || isNaN( val ) ? null : val;\n\t},\n\n\t_format: function( value ) {\n\t\tif ( value === \"\" ) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn window.Globalize && this.options.numberFormat ?\n\t\t\tGlobalize.format( value, this.options.numberFormat, this.options.culture ) :\n\t\t\tvalue;\n\t},\n\n\t_refresh: function() {\n\t\tthis.element.attr( {\n\t\t\t\"aria-valuemin\": this.options.min,\n\t\t\t\"aria-valuemax\": this.options.max,\n\n\t\t\t// TODO: what should we do with values that can't be parsed?\n\t\t\t\"aria-valuenow\": this._parse( this.element.val() )\n\t\t} );\n\t},\n\n\tisValid: function() {\n\t\tvar value = this.value();\n\n\t\t// Null is invalid\n\t\tif ( value === null ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If value gets adjusted, it's invalid\n\t\treturn value === this._adjustValue( value );\n\t},\n\n\t// Update the value without triggering change\n\t_value: function( value, allowAny ) {\n\t\tvar parsed;\n\t\tif ( value !== \"\" ) {\n\t\t\tparsed = this._parse( value );\n\t\t\tif ( parsed !== null ) {\n\t\t\t\tif ( !allowAny ) {\n\t\t\t\t\tparsed = this._adjustValue( parsed );\n\t\t\t\t}\n\t\t\t\tvalue = this._format( parsed );\n\t\t\t}\n\t\t}\n\t\tthis.element.val( value );\n\t\tthis._refresh();\n\t},\n\n\t_destroy: function() {\n\t\tthis.element\n\t\t\t.prop( \"disabled\", false )\n\t\t\t.removeAttr( \"autocomplete role aria-valuemin aria-valuemax aria-valuenow\" );\n\n\t\tthis.uiSpinner.replaceWith( this.element );\n\t},\n\n\tstepUp: spinnerModifer( function( steps ) {\n\t\tthis._stepUp( steps );\n\t} ),\n\t_stepUp: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tstepDown: spinnerModifer( function( steps ) {\n\t\tthis._stepDown( steps );\n\t} ),\n\t_stepDown: function( steps ) {\n\t\tif ( this._start() ) {\n\t\t\tthis._spin( ( steps || 1 ) * -this.options.step );\n\t\t\tthis._stop();\n\t\t}\n\t},\n\n\tpageUp: spinnerModifer( function( pages ) {\n\t\tthis._stepUp( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tpageDown: spinnerModifer( function( pages ) {\n\t\tthis._stepDown( ( pages || 1 ) * this.options.page );\n\t} ),\n\n\tvalue: function( newVal ) {\n\t\tif ( !arguments.length ) {\n\t\t\treturn this._parse( this.element.val() );\n\t\t}\n\t\tspinnerModifer( this._value ).call( this, newVal );\n\t},\n\n\twidget: function() {\n\t\treturn this.uiSpinner;\n\t}\n} );\n\n// DEPRECATED\n// TODO: switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for spinner html extension points\n\t$.widget( \"ui.spinner\", $.ui.spinner, {\n\t\t_enhance: function() {\n\t\t\tthis.uiSpinner = this.element\n\t\t\t\t.attr( \"autocomplete\", \"off\" )\n\t\t\t\t.wrap( this._uiSpinnerHtml() )\n\t\t\t\t.parent()\n\n\t\t\t\t\t// Add buttons\n\t\t\t\t\t.append( this._buttonHtml() );\n\t\t},\n\t\t_uiSpinnerHtml: function() {\n\t\t\treturn \"\";\n\t\t},\n\n\t\t_buttonHtml: function() {\n\t\t\treturn \"\";\n\t\t}\n\t} );\n}\n\nvar widgetsSpinner = $.ui.spinner;\n\n\n/*!\n * jQuery UI Tabs 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tabs\n//>>group: Widgets\n//>>description: Transforms a set of container elements into a tab structure.\n//>>docs: http://api.jqueryui.com/tabs/\n//>>demos: http://jqueryui.com/tabs/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tabs.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.tabs\", {\n\tversion: \"1.12.1\",\n\tdelay: 300,\n\toptions: {\n\t\tactive: null,\n\t\tclasses: {\n\t\t\t\"ui-tabs\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-nav\": \"ui-corner-all\",\n\t\t\t\"ui-tabs-panel\": \"ui-corner-bottom\",\n\t\t\t\"ui-tabs-tab\": \"ui-corner-top\"\n\t\t},\n\t\tcollapsible: false,\n\t\tevent: \"click\",\n\t\theightStyle: \"content\",\n\t\thide: null,\n\t\tshow: null,\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeActivate: null,\n\t\tbeforeLoad: null,\n\t\tload: null\n\t},\n\n\t_isLocal: ( function() {\n\t\tvar rhash = /#.*$/;\n\n\t\treturn function( anchor ) {\n\t\t\tvar anchorUrl, locationUrl;\n\n\t\t\tanchorUrl = anchor.href.replace( rhash, \"\" );\n\t\t\tlocationUrl = location.href.replace( rhash, \"\" );\n\n\t\t\t// Decoding may throw an error if the URL isn't UTF-8 (#9518)\n\t\t\ttry {\n\t\t\t\tanchorUrl = decodeURIComponent( anchorUrl );\n\t\t\t} catch ( error ) {}\n\t\t\ttry {\n\t\t\t\tlocationUrl = decodeURIComponent( locationUrl );\n\t\t\t} catch ( error ) {}\n\n\t\t\treturn anchor.hash.length > 1 && anchorUrl === locationUrl;\n\t\t};\n\t} )(),\n\n\t_create: function() {\n\t\tvar that = this,\n\t\t\toptions = this.options;\n\n\t\tthis.running = false;\n\n\t\tthis._addClass( \"ui-tabs\", \"ui-widget ui-widget-content\" );\n\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, options.collapsible );\n\n\t\tthis._processTabs();\n\t\toptions.active = this._initialActive();\n\n\t\t// Take disabling tabs via class attribute from HTML\n\t\t// into account and update option properly.\n\t\tif ( $.isArray( options.disabled ) ) {\n\t\t\toptions.disabled = $.unique( options.disabled.concat(\n\t\t\t\t$.map( this.tabs.filter( \".ui-state-disabled\" ), function( li ) {\n\t\t\t\t\treturn that.tabs.index( li );\n\t\t\t\t} )\n\t\t\t) ).sort();\n\t\t}\n\n\t\t// Check for length avoids error when initializing empty list\n\t\tif ( this.options.active !== false && this.anchors.length ) {\n\t\t\tthis.active = this._findActive( options.active );\n\t\t} else {\n\t\t\tthis.active = $();\n\t\t}\n\n\t\tthis._refresh();\n\n\t\tif ( this.active.length ) {\n\t\t\tthis.load( options.active );\n\t\t}\n\t},\n\n\t_initialActive: function() {\n\t\tvar active = this.options.active,\n\t\t\tcollapsible = this.options.collapsible,\n\t\t\tlocationHash = location.hash.substring( 1 );\n\n\t\tif ( active === null ) {\n\n\t\t\t// check the fragment identifier in the URL\n\t\t\tif ( locationHash ) {\n\t\t\t\tthis.tabs.each( function( i, tab ) {\n\t\t\t\t\tif ( $( tab ).attr( \"aria-controls\" ) === locationHash ) {\n\t\t\t\t\t\tactive = i;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Check for a tab marked active via a class\n\t\t\tif ( active === null ) {\n\t\t\t\tactive = this.tabs.index( this.tabs.filter( \".ui-tabs-active\" ) );\n\t\t\t}\n\n\t\t\t// No active tab, set to false\n\t\t\tif ( active === null || active === -1 ) {\n\t\t\t\tactive = this.tabs.length ? 0 : false;\n\t\t\t}\n\t\t}\n\n\t\t// Handle numbers: negative, out of range\n\t\tif ( active !== false ) {\n\t\t\tactive = this.tabs.index( this.tabs.eq( active ) );\n\t\t\tif ( active === -1 ) {\n\t\t\t\tactive = collapsible ? false : 0;\n\t\t\t}\n\t\t}\n\n\t\t// Don't allow collapsible: false and active: false\n\t\tif ( !collapsible && active === false && this.anchors.length ) {\n\t\t\tactive = 0;\n\t\t}\n\n\t\treturn active;\n\t},\n\n\t_getCreateEventData: function() {\n\t\treturn {\n\t\t\ttab: this.active,\n\t\t\tpanel: !this.active.length ? $() : this._getPanelForTab( this.active )\n\t\t};\n\t},\n\n\t_tabKeydown: function( event ) {\n\t\tvar focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( \"li\" ),\n\t\t\tselectedIndex = this.tabs.index( focusedTab ),\n\t\t\tgoingForward = true;\n\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( event.keyCode ) {\n\t\tcase $.ui.keyCode.RIGHT:\n\t\tcase $.ui.keyCode.DOWN:\n\t\t\tselectedIndex++;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.UP:\n\t\tcase $.ui.keyCode.LEFT:\n\t\t\tgoingForward = false;\n\t\t\tselectedIndex--;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.END:\n\t\t\tselectedIndex = this.anchors.length - 1;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.HOME:\n\t\t\tselectedIndex = 0;\n\t\t\tbreak;\n\t\tcase $.ui.keyCode.SPACE:\n\n\t\t\t// Activate only, no collapsing\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\t\t\tthis._activate( selectedIndex );\n\t\t\treturn;\n\t\tcase $.ui.keyCode.ENTER:\n\n\t\t\t// Toggle (cancel delayed activation, allow collapsing)\n\t\t\tevent.preventDefault();\n\t\t\tclearTimeout( this.activating );\n\n\t\t\t// Determine if we should collapse or activate\n\t\t\tthis._activate( selectedIndex === this.options.active ? false : selectedIndex );\n\t\t\treturn;\n\t\tdefault:\n\t\t\treturn;\n\t\t}\n\n\t\t// Focus the appropriate tab, based on which key was pressed\n\t\tevent.preventDefault();\n\t\tclearTimeout( this.activating );\n\t\tselectedIndex = this._focusNextTab( selectedIndex, goingForward );\n\n\t\t// Navigating with control/command key will prevent automatic activation\n\t\tif ( !event.ctrlKey && !event.metaKey ) {\n\n\t\t\t// Update aria-selected immediately so that AT think the tab is already selected.\n\t\t\t// Otherwise AT may confuse the user by stating that they need to activate the tab,\n\t\t\t// but the tab will already be activated by the time the announcement finishes.\n\t\t\tfocusedTab.attr( \"aria-selected\", \"false\" );\n\t\t\tthis.tabs.eq( selectedIndex ).attr( \"aria-selected\", \"true\" );\n\n\t\t\tthis.activating = this._delay( function() {\n\t\t\t\tthis.option( \"active\", selectedIndex );\n\t\t\t}, this.delay );\n\t\t}\n\t},\n\n\t_panelKeydown: function( event ) {\n\t\tif ( this._handlePageNav( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ctrl+up moves focus to the current tab\n\t\tif ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.active.trigger( \"focus\" );\n\t\t}\n\t},\n\n\t// Alt+page up/down moves focus to the previous/next tab (and activates)\n\t_handlePageNav: function( event ) {\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active - 1, false ) );\n\t\t\treturn true;\n\t\t}\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {\n\t\t\tthis._activate( this._focusNextTab( this.options.active + 1, true ) );\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t_findNextTab: function( index, goingForward ) {\n\t\tvar lastTabIndex = this.tabs.length - 1;\n\n\t\tfunction constrain() {\n\t\t\tif ( index > lastTabIndex ) {\n\t\t\t\tindex = 0;\n\t\t\t}\n\t\t\tif ( index < 0 ) {\n\t\t\t\tindex = lastTabIndex;\n\t\t\t}\n\t\t\treturn index;\n\t\t}\n\n\t\twhile ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {\n\t\t\tindex = goingForward ? index + 1 : index - 1;\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_focusNextTab: function( index, goingForward ) {\n\t\tindex = this._findNextTab( index, goingForward );\n\t\tthis.tabs.eq( index ).trigger( \"focus\" );\n\t\treturn index;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"active\" ) {\n\n\t\t\t// _activate() will handle invalid values and update this.options\n\t\t\tthis._activate( value );\n\t\t\treturn;\n\t\t}\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"collapsible\" ) {\n\t\t\tthis._toggleClass( \"ui-tabs-collapsible\", null, value );\n\n\t\t\t// Setting collapsible: false while collapsed; open first panel\n\t\t\tif ( !value && this.options.active === false ) {\n\t\t\t\tthis._activate( 0 );\n\t\t\t}\n\t\t}\n\n\t\tif ( key === \"event\" ) {\n\t\t\tthis._setupEvents( value );\n\t\t}\n\n\t\tif ( key === \"heightStyle\" ) {\n\t\t\tthis._setupHeightStyle( value );\n\t\t}\n\t},\n\n\t_sanitizeSelector: function( hash ) {\n\t\treturn hash ? hash.replace( /[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g, \"\\\\$&\" ) : \"\";\n\t},\n\n\trefresh: function() {\n\t\tvar options = this.options,\n\t\t\tlis = this.tablist.children( \":has(a[href])\" );\n\n\t\t// Get disabled tabs from class attribute from HTML\n\t\t// this will get converted to a boolean if needed in _refresh()\n\t\toptions.disabled = $.map( lis.filter( \".ui-state-disabled\" ), function( tab ) {\n\t\t\treturn lis.index( tab );\n\t\t} );\n\n\t\tthis._processTabs();\n\n\t\t// Was collapsed or no tabs\n\t\tif ( options.active === false || !this.anchors.length ) {\n\t\t\toptions.active = false;\n\t\t\tthis.active = $();\n\n\t\t// was active, but active tab is gone\n\t\t} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {\n\n\t\t\t// all remaining tabs are disabled\n\t\t\tif ( this.tabs.length === options.disabled.length ) {\n\t\t\t\toptions.active = false;\n\t\t\t\tthis.active = $();\n\n\t\t\t// activate previous tab\n\t\t\t} else {\n\t\t\t\tthis._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );\n\t\t\t}\n\n\t\t// was active, active tab still exists\n\t\t} else {\n\n\t\t\t// make sure active index is correct\n\t\t\toptions.active = this.tabs.index( this.active );\n\t\t}\n\n\t\tthis._refresh();\n\t},\n\n\t_refresh: function() {\n\t\tthis._setOptionDisabled( this.options.disabled );\n\t\tthis._setupEvents( this.options.event );\n\t\tthis._setupHeightStyle( this.options.heightStyle );\n\n\t\tthis.tabs.not( this.active ).attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\",\n\t\t\ttabIndex: -1\n\t\t} );\n\t\tthis.panels.not( this._getPanelForTab( this.active ) )\n\t\t\t.hide()\n\t\t\t.attr( {\n\t\t\t\t\"aria-hidden\": \"true\"\n\t\t\t} );\n\n\t\t// Make sure one tab is in the tab order\n\t\tif ( !this.active.length ) {\n\t\t\tthis.tabs.eq( 0 ).attr( \"tabIndex\", 0 );\n\t\t} else {\n\t\t\tthis.active\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-selected\": \"true\",\n\t\t\t\t\t\"aria-expanded\": \"true\",\n\t\t\t\t\ttabIndex: 0\n\t\t\t\t} );\n\t\t\tthis._addClass( this.active, \"ui-tabs-active\", \"ui-state-active\" );\n\t\t\tthis._getPanelForTab( this.active )\n\t\t\t\t.show()\n\t\t\t\t.attr( {\n\t\t\t\t\t\"aria-hidden\": \"false\"\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_processTabs: function() {\n\t\tvar that = this,\n\t\t\tprevTabs = this.tabs,\n\t\t\tprevAnchors = this.anchors,\n\t\t\tprevPanels = this.panels;\n\n\t\tthis.tablist = this._getList().attr( \"role\", \"tablist\" );\n\t\tthis._addClass( this.tablist, \"ui-tabs-nav\",\n\t\t\t\"ui-helper-reset ui-helper-clearfix ui-widget-header\" );\n\n\t\t// Prevent users from focusing disabled tabs via click\n\t\tthis.tablist\n\t\t\t.on( \"mousedown\" + this.eventNamespace, \"> li\", function( event ) {\n\t\t\t\tif ( $( this ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t} )\n\n\t\t\t// Support: IE <9\n\t\t\t// Preventing the default action in mousedown doesn't prevent IE\n\t\t\t// from focusing the element, so if the anchor gets focused, blur.\n\t\t\t// We don't have to worry about focusing the previously focused\n\t\t\t// element since clicking on a non-focusable element should focus\n\t\t\t// the body anyway.\n\t\t\t.on( \"focus\" + this.eventNamespace, \".ui-tabs-anchor\", function() {\n\t\t\t\tif ( $( this ).closest( \"li\" ).is( \".ui-state-disabled\" ) ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.tabs = this.tablist.find( \"> li:has(a[href])\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"tab\",\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.tabs, \"ui-tabs-tab\", \"ui-state-default\" );\n\n\t\tthis.anchors = this.tabs.map( function() {\n\t\t\treturn $( \"a\", this )[ 0 ];\n\t\t} )\n\t\t\t.attr( {\n\t\t\t\trole: \"presentation\",\n\t\t\t\ttabIndex: -1\n\t\t\t} );\n\t\tthis._addClass( this.anchors, \"ui-tabs-anchor\" );\n\n\t\tthis.panels = $();\n\n\t\tthis.anchors.each( function( i, anchor ) {\n\t\t\tvar selector, panel, panelId,\n\t\t\t\tanchorId = $( anchor ).uniqueId().attr( \"id\" ),\n\t\t\t\ttab = $( anchor ).closest( \"li\" ),\n\t\t\t\toriginalAriaControls = tab.attr( \"aria-controls\" );\n\n\t\t\t// Inline tab\n\t\t\tif ( that._isLocal( anchor ) ) {\n\t\t\t\tselector = anchor.hash;\n\t\t\t\tpanelId = selector.substring( 1 );\n\t\t\t\tpanel = that.element.find( that._sanitizeSelector( selector ) );\n\n\t\t\t// remote tab\n\t\t\t} else {\n\n\t\t\t\t// If the tab doesn't already have aria-controls,\n\t\t\t\t// generate an id by using a throw-away element\n\t\t\t\tpanelId = tab.attr( \"aria-controls\" ) || $( {} ).uniqueId()[ 0 ].id;\n\t\t\t\tselector = \"#\" + panelId;\n\t\t\t\tpanel = that.element.find( selector );\n\t\t\t\tif ( !panel.length ) {\n\t\t\t\t\tpanel = that._createPanel( panelId );\n\t\t\t\t\tpanel.insertAfter( that.panels[ i - 1 ] || that.tablist );\n\t\t\t\t}\n\t\t\t\tpanel.attr( \"aria-live\", \"polite\" );\n\t\t\t}\n\n\t\t\tif ( panel.length ) {\n\t\t\t\tthat.panels = that.panels.add( panel );\n\t\t\t}\n\t\t\tif ( originalAriaControls ) {\n\t\t\t\ttab.data( \"ui-tabs-aria-controls\", originalAriaControls );\n\t\t\t}\n\t\t\ttab.attr( {\n\t\t\t\t\"aria-controls\": panelId,\n\t\t\t\t\"aria-labelledby\": anchorId\n\t\t\t} );\n\t\t\tpanel.attr( \"aria-labelledby\", anchorId );\n\t\t} );\n\n\t\tthis.panels.attr( \"role\", \"tabpanel\" );\n\t\tthis._addClass( this.panels, \"ui-tabs-panel\", \"ui-widget-content\" );\n\n\t\t// Avoid memory leaks (#10056)\n\t\tif ( prevTabs ) {\n\t\t\tthis._off( prevTabs.not( this.tabs ) );\n\t\t\tthis._off( prevAnchors.not( this.anchors ) );\n\t\t\tthis._off( prevPanels.not( this.panels ) );\n\t\t}\n\t},\n\n\t// Allow overriding how to find the list for rare usage scenarios (#7715)\n\t_getList: function() {\n\t\treturn this.tablist || this.element.find( \"ol, ul\" ).eq( 0 );\n\t},\n\n\t_createPanel: function( id ) {\n\t\treturn $( \"
\" )\n\t\t\t.attr( \"id\", id )\n\t\t\t.data( \"ui-tabs-destroy\", true );\n\t},\n\n\t_setOptionDisabled: function( disabled ) {\n\t\tvar currentItem, li, i;\n\n\t\tif ( $.isArray( disabled ) ) {\n\t\t\tif ( !disabled.length ) {\n\t\t\t\tdisabled = false;\n\t\t\t} else if ( disabled.length === this.anchors.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\t\t}\n\n\t\t// Disable tabs\n\t\tfor ( i = 0; ( li = this.tabs[ i ] ); i++ ) {\n\t\t\tcurrentItem = $( li );\n\t\t\tif ( disabled === true || $.inArray( i, disabled ) !== -1 ) {\n\t\t\t\tcurrentItem.attr( \"aria-disabled\", \"true\" );\n\t\t\t\tthis._addClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t} else {\n\t\t\t\tcurrentItem.removeAttr( \"aria-disabled\" );\n\t\t\t\tthis._removeClass( currentItem, null, \"ui-state-disabled\" );\n\t\t\t}\n\t\t}\n\n\t\tthis.options.disabled = disabled;\n\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null,\n\t\t\tdisabled === true );\n\t},\n\n\t_setupEvents: function( event ) {\n\t\tvar events = {};\n\t\tif ( event ) {\n\t\t\t$.each( event.split( \" \" ), function( index, eventName ) {\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\n\t\t\t} );\n\t\t}\n\n\t\tthis._off( this.anchors.add( this.tabs ).add( this.panels ) );\n\n\t\t// Always prevent the default action, even when disabled\n\t\tthis._on( true, this.anchors, {\n\t\t\tclick: function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t} );\n\t\tthis._on( this.anchors, events );\n\t\tthis._on( this.tabs, { keydown: \"_tabKeydown\" } );\n\t\tthis._on( this.panels, { keydown: \"_panelKeydown\" } );\n\n\t\tthis._focusable( this.tabs );\n\t\tthis._hoverable( this.tabs );\n\t},\n\n\t_setupHeightStyle: function( heightStyle ) {\n\t\tvar maxHeight,\n\t\t\tparent = this.element.parent();\n\n\t\tif ( heightStyle === \"fill\" ) {\n\t\t\tmaxHeight = parent.height();\n\t\t\tmaxHeight -= this.element.outerHeight() - this.element.height();\n\n\t\t\tthis.element.siblings( \":visible\" ).each( function() {\n\t\t\t\tvar elem = $( this ),\n\t\t\t\t\tposition = elem.css( \"position\" );\n\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.element.children().not( this.panels ).each( function() {\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\n\t\t\t} );\n\n\t\t\tthis.panels.each( function() {\n\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\n\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\n\t\t\t} )\n\t\t\t\t.css( \"overflow\", \"auto\" );\n\t\t} else if ( heightStyle === \"auto\" ) {\n\t\t\tmaxHeight = 0;\n\t\t\tthis.panels.each( function() {\n\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).height( \"\" ).height() );\n\t\t\t} ).height( maxHeight );\n\t\t}\n\t},\n\n\t_eventHandler: function( event ) {\n\t\tvar options = this.options,\n\t\t\tactive = this.active,\n\t\t\tanchor = $( event.currentTarget ),\n\t\t\ttab = anchor.closest( \"li\" ),\n\t\t\tclickedIsActive = tab[ 0 ] === active[ 0 ],\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\n\t\t\ttoShow = collapsing ? $() : this._getPanelForTab( tab ),\n\t\t\ttoHide = !active.length ? $() : this._getPanelForTab( active ),\n\t\t\teventData = {\n\t\t\t\toldTab: active,\n\t\t\t\toldPanel: toHide,\n\t\t\t\tnewTab: collapsing ? $() : tab,\n\t\t\t\tnewPanel: toShow\n\t\t\t};\n\n\t\tevent.preventDefault();\n\n\t\tif ( tab.hasClass( \"ui-state-disabled\" ) ||\n\n\t\t\t\t// tab is already loading\n\t\t\t\ttab.hasClass( \"ui-tabs-loading\" ) ||\n\n\t\t\t\t// can't switch durning an animation\n\t\t\t\tthis.running ||\n\n\t\t\t\t// click on active header, but not collapsible\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\n\n\t\t\t\t// allow canceling activation\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\toptions.active = collapsing ? false : this.tabs.index( tab );\n\n\t\tthis.active = clickedIsActive ? $() : tab;\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tif ( !toHide.length && !toShow.length ) {\n\t\t\t$.error( \"jQuery UI Tabs: Mismatching fragment identifier.\" );\n\t\t}\n\n\t\tif ( toShow.length ) {\n\t\t\tthis.load( this.tabs.index( tab ), event );\n\t\t}\n\t\tthis._toggle( event, eventData );\n\t},\n\n\t// Handles show/hide for selecting tabs\n\t_toggle: function( event, eventData ) {\n\t\tvar that = this,\n\t\t\ttoShow = eventData.newPanel,\n\t\t\ttoHide = eventData.oldPanel;\n\n\t\tthis.running = true;\n\n\t\tfunction complete() {\n\t\t\tthat.running = false;\n\t\t\tthat._trigger( \"activate\", event, eventData );\n\t\t}\n\n\t\tfunction show() {\n\t\t\tthat._addClass( eventData.newTab.closest( \"li\" ), \"ui-tabs-active\", \"ui-state-active\" );\n\n\t\t\tif ( toShow.length && that.options.show ) {\n\t\t\t\tthat._show( toShow, that.options.show, complete );\n\t\t\t} else {\n\t\t\t\ttoShow.show();\n\t\t\t\tcomplete();\n\t\t\t}\n\t\t}\n\n\t\t// Start out by hiding, then showing, then completing\n\t\tif ( toHide.length && this.options.hide ) {\n\t\t\tthis._hide( toHide, this.options.hide, function() {\n\t\t\t\tthat._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\t\tshow();\n\t\t\t} );\n\t\t} else {\n\t\t\tthis._removeClass( eventData.oldTab.closest( \"li\" ),\n\t\t\t\t\"ui-tabs-active\", \"ui-state-active\" );\n\t\t\ttoHide.hide();\n\t\t\tshow();\n\t\t}\n\n\t\ttoHide.attr( \"aria-hidden\", \"true\" );\n\t\teventData.oldTab.attr( {\n\t\t\t\"aria-selected\": \"false\",\n\t\t\t\"aria-expanded\": \"false\"\n\t\t} );\n\n\t\t// If we're switching tabs, remove the old tab from the tab order.\n\t\t// If we're opening from collapsed state, remove the previous tab from the tab order.\n\t\t// If we're collapsing, then keep the collapsing tab in the tab order.\n\t\tif ( toShow.length && toHide.length ) {\n\t\t\teventData.oldTab.attr( \"tabIndex\", -1 );\n\t\t} else if ( toShow.length ) {\n\t\t\tthis.tabs.filter( function() {\n\t\t\t\treturn $( this ).attr( \"tabIndex\" ) === 0;\n\t\t\t} )\n\t\t\t\t.attr( \"tabIndex\", -1 );\n\t\t}\n\n\t\ttoShow.attr( \"aria-hidden\", \"false\" );\n\t\teventData.newTab.attr( {\n\t\t\t\"aria-selected\": \"true\",\n\t\t\t\"aria-expanded\": \"true\",\n\t\t\ttabIndex: 0\n\t\t} );\n\t},\n\n\t_activate: function( index ) {\n\t\tvar anchor,\n\t\t\tactive = this._findActive( index );\n\n\t\t// Trying to activate the already active panel\n\t\tif ( active[ 0 ] === this.active[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Trying to collapse, simulate a click on the current active header\n\t\tif ( !active.length ) {\n\t\t\tactive = this.active;\n\t\t}\n\n\t\tanchor = active.find( \".ui-tabs-anchor\" )[ 0 ];\n\t\tthis._eventHandler( {\n\t\t\ttarget: anchor,\n\t\t\tcurrentTarget: anchor,\n\t\t\tpreventDefault: $.noop\n\t\t} );\n\t},\n\n\t_findActive: function( index ) {\n\t\treturn index === false ? $() : this.tabs.eq( index );\n\t},\n\n\t_getIndex: function( index ) {\n\n\t\t// meta-function to give users option to provide a href string instead of a numerical index.\n\t\tif ( typeof index === \"string\" ) {\n\t\t\tindex = this.anchors.index( this.anchors.filter( \"[href$='\" +\n\t\t\t\t$.ui.escapeSelector( index ) + \"']\" ) );\n\t\t}\n\n\t\treturn index;\n\t},\n\n\t_destroy: function() {\n\t\tif ( this.xhr ) {\n\t\t\tthis.xhr.abort();\n\t\t}\n\n\t\tthis.tablist\n\t\t\t.removeAttr( \"role\" )\n\t\t\t.off( this.eventNamespace );\n\n\t\tthis.anchors\n\t\t\t.removeAttr( \"role tabIndex\" )\n\t\t\t.removeUniqueId();\n\n\t\tthis.tabs.add( this.panels ).each( function() {\n\t\t\tif ( $.data( this, \"ui-tabs-destroy\" ) ) {\n\t\t\t\t$( this ).remove();\n\t\t\t} else {\n\t\t\t\t$( this ).removeAttr( \"role tabIndex \" +\n\t\t\t\t\t\"aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.tabs.each( function() {\n\t\t\tvar li = $( this ),\n\t\t\t\tprev = li.data( \"ui-tabs-aria-controls\" );\n\t\t\tif ( prev ) {\n\t\t\t\tli\n\t\t\t\t\t.attr( \"aria-controls\", prev )\n\t\t\t\t\t.removeData( \"ui-tabs-aria-controls\" );\n\t\t\t} else {\n\t\t\t\tli.removeAttr( \"aria-controls\" );\n\t\t\t}\n\t\t} );\n\n\t\tthis.panels.show();\n\n\t\tif ( this.options.heightStyle !== \"content\" ) {\n\t\t\tthis.panels.css( \"height\", \"\" );\n\t\t}\n\t},\n\n\tenable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = false;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.map( disabled, function( num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tdisabled = $.map( this.tabs, function( li, num ) {\n\t\t\t\t\treturn num !== index ? num : null;\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tdisable: function( index ) {\n\t\tvar disabled = this.options.disabled;\n\t\tif ( disabled === true ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( index === undefined ) {\n\t\t\tdisabled = true;\n\t\t} else {\n\t\t\tindex = this._getIndex( index );\n\t\t\tif ( $.inArray( index, disabled ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( $.isArray( disabled ) ) {\n\t\t\t\tdisabled = $.merge( [ index ], disabled ).sort();\n\t\t\t} else {\n\t\t\t\tdisabled = [ index ];\n\t\t\t}\n\t\t}\n\t\tthis._setOptionDisabled( disabled );\n\t},\n\n\tload: function( index, event ) {\n\t\tindex = this._getIndex( index );\n\t\tvar that = this,\n\t\t\ttab = this.tabs.eq( index ),\n\t\t\tanchor = tab.find( \".ui-tabs-anchor\" ),\n\t\t\tpanel = this._getPanelForTab( tab ),\n\t\t\teventData = {\n\t\t\t\ttab: tab,\n\t\t\t\tpanel: panel\n\t\t\t},\n\t\t\tcomplete = function( jqXHR, status ) {\n\t\t\t\tif ( status === \"abort\" ) {\n\t\t\t\t\tthat.panels.stop( false, true );\n\t\t\t\t}\n\n\t\t\t\tthat._removeClass( tab, \"ui-tabs-loading\" );\n\t\t\t\tpanel.removeAttr( \"aria-busy\" );\n\n\t\t\t\tif ( jqXHR === that.xhr ) {\n\t\t\t\t\tdelete that.xhr;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Not remote\n\t\tif ( this._isLocal( anchor[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );\n\n\t\t// Support: jQuery <1.8\n\t\t// jQuery <1.8 returns false if the request is canceled in beforeSend,\n\t\t// but as of 1.8, $.ajax() always returns a jqXHR object.\n\t\tif ( this.xhr && this.xhr.statusText !== \"canceled\" ) {\n\t\t\tthis._addClass( tab, \"ui-tabs-loading\" );\n\t\t\tpanel.attr( \"aria-busy\", \"true\" );\n\n\t\t\tthis.xhr\n\t\t\t\t.done( function( response, status, jqXHR ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tpanel.html( response );\n\t\t\t\t\t\tthat._trigger( \"load\", event, eventData );\n\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} )\n\t\t\t\t.fail( function( jqXHR, status ) {\n\n\t\t\t\t\t// support: jQuery <1.8\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tcomplete( jqXHR, status );\n\t\t\t\t\t}, 1 );\n\t\t\t\t} );\n\t\t}\n\t},\n\n\t_ajaxSettings: function( anchor, event, eventData ) {\n\t\tvar that = this;\n\t\treturn {\n\n\t\t\t// Support: IE <11 only\n\t\t\t// Strip any hash that exists to prevent errors with the Ajax request\n\t\t\turl: anchor.attr( \"href\" ).replace( /#.*$/, \"\" ),\n\t\t\tbeforeSend: function( jqXHR, settings ) {\n\t\t\t\treturn that._trigger( \"beforeLoad\", event,\n\t\t\t\t\t$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );\n\t\t\t}\n\t\t};\n\t},\n\n\t_getPanelForTab: function( tab ) {\n\t\tvar id = $( tab ).attr( \"aria-controls\" );\n\t\treturn this.element.find( this._sanitizeSelector( \"#\" + id ) );\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for ui-tab class (now ui-tabs-tab)\n\t$.widget( \"ui.tabs\", $.ui.tabs, {\n\t\t_processTabs: function() {\n\t\t\tthis._superApply( arguments );\n\t\t\tthis._addClass( this.tabs, \"ui-tab\" );\n\t\t}\n\t} );\n}\n\nvar widgetsTabs = $.ui.tabs;\n\n\n/*!\n * jQuery UI Tooltip 1.12.1\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n//>>label: Tooltip\n//>>group: Widgets\n//>>description: Shows additional information for any element on hover or focus.\n//>>docs: http://api.jqueryui.com/tooltip/\n//>>demos: http://jqueryui.com/tooltip/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/tooltip.css\n//>>css.theme: ../../themes/base/theme.css\n\n\n\n$.widget( \"ui.tooltip\", {\n\tversion: \"1.12.1\",\n\toptions: {\n\t\tclasses: {\n\t\t\t\"ui-tooltip\": \"ui-corner-all ui-widget-shadow\"\n\t\t},\n\t\tcontent: function() {\n\n\t\t\t// support: IE<9, Opera in jQuery <1.7\n\t\t\t// .text() can't accept undefined, so coerce to a string\n\t\t\tvar title = $( this ).attr( \"title\" ) || \"\";\n\n\t\t\t// Escape title, since we're going from an attribute to raw HTML\n\t\t\treturn $( \"\" ).text( title ).html();\n\t\t},\n\t\thide: true,\n\n\t\t// Disabled elements have inconsistent behavior across browsers (#8661)\n\t\titems: \"[title]:not([disabled])\",\n\t\tposition: {\n\t\t\tmy: \"left top+15\",\n\t\t\tat: \"left bottom\",\n\t\t\tcollision: \"flipfit flip\"\n\t\t},\n\t\tshow: true,\n\t\ttrack: false,\n\n\t\t// Callbacks\n\t\tclose: null,\n\t\topen: null\n\t},\n\n\t_addDescribedBy: function( elem, id ) {\n\t\tvar describedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ );\n\t\tdescribedby.push( id );\n\t\telem\n\t\t\t.data( \"ui-tooltip-id\", id )\n\t\t\t.attr( \"aria-describedby\", $.trim( describedby.join( \" \" ) ) );\n\t},\n\n\t_removeDescribedBy: function( elem ) {\n\t\tvar id = elem.data( \"ui-tooltip-id\" ),\n\t\t\tdescribedby = ( elem.attr( \"aria-describedby\" ) || \"\" ).split( /\\s+/ ),\n\t\t\tindex = $.inArray( id, describedby );\n\n\t\tif ( index !== -1 ) {\n\t\t\tdescribedby.splice( index, 1 );\n\t\t}\n\n\t\telem.removeData( \"ui-tooltip-id\" );\n\t\tdescribedby = $.trim( describedby.join( \" \" ) );\n\t\tif ( describedby ) {\n\t\t\telem.attr( \"aria-describedby\", describedby );\n\t\t} else {\n\t\t\telem.removeAttr( \"aria-describedby\" );\n\t\t}\n\t},\n\n\t_create: function() {\n\t\tthis._on( {\n\t\t\tmouseover: \"open\",\n\t\t\tfocusin: \"open\"\n\t\t} );\n\n\t\t// IDs of generated tooltips, needed for destroy\n\t\tthis.tooltips = {};\n\n\t\t// IDs of parent tooltips where we removed the title attribute\n\t\tthis.parents = {};\n\n\t\t// Append the aria-live region so tooltips announce correctly\n\t\tthis.liveRegion = $( \"
\" )\n\t\t\t.attr( {\n\t\t\t\trole: \"log\",\n\t\t\t\t\"aria-live\": \"assertive\",\n\t\t\t\t\"aria-relevant\": \"additions\"\n\t\t\t} )\n\t\t\t.appendTo( this.document[ 0 ].body );\n\t\tthis._addClass( this.liveRegion, null, \"ui-helper-hidden-accessible\" );\n\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tvar that = this;\n\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"content\" ) {\n\t\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\t\tthat._updateContent( tooltipData.element );\n\t\t\t} );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis[ value ? \"_disable\" : \"_enable\" ]();\n\t},\n\n\t_disable: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\t\t\tvar event = $.Event( \"blur\" );\n\t\t\tevent.target = event.currentTarget = tooltipData.element[ 0 ];\n\t\t\tthat.close( event, true );\n\t\t} );\n\n\t\t// Remove title attributes to prevent native tooltips\n\t\tthis.disabledTitles = this.disabledTitles.add(\n\t\t\tthis.element.find( this.options.items ).addBack()\n\t\t\t\t.filter( function() {\n\t\t\t\t\tvar element = $( this );\n\t\t\t\t\tif ( element.is( \"[title]\" ) ) {\n\t\t\t\t\t\treturn element\n\t\t\t\t\t\t\t.data( \"ui-tooltip-title\", element.attr( \"title\" ) )\n\t\t\t\t\t\t\t.removeAttr( \"title\" );\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t);\n\t},\n\n\t_enable: function() {\n\n\t\t// restore title attributes\n\t\tthis.disabledTitles.each( function() {\n\t\t\tvar element = $( this );\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t}\n\t\t} );\n\t\tthis.disabledTitles = $( [] );\n\t},\n\n\topen: function( event ) {\n\t\tvar that = this,\n\t\t\ttarget = $( event ? event.target : this.element )\n\n\t\t\t\t// we need closest here due to mouseover bubbling,\n\t\t\t\t// but always pointing at the same event target\n\t\t\t\t.closest( this.options.items );\n\n\t\t// No element to show a tooltip for or the tooltip is already open\n\t\tif ( !target.length || target.data( \"ui-tooltip-id\" ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( target.attr( \"title\" ) ) {\n\t\t\ttarget.data( \"ui-tooltip-title\", target.attr( \"title\" ) );\n\t\t}\n\n\t\ttarget.data( \"ui-tooltip-open\", true );\n\n\t\t// Kill parent tooltips, custom or native, for hover\n\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\ttarget.parents().each( function() {\n\t\t\t\tvar parent = $( this ),\n\t\t\t\t\tblurEvent;\n\t\t\t\tif ( parent.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\tblurEvent = $.Event( \"blur\" );\n\t\t\t\t\tblurEvent.target = blurEvent.currentTarget = this;\n\t\t\t\t\tthat.close( blurEvent, true );\n\t\t\t\t}\n\t\t\t\tif ( parent.attr( \"title\" ) ) {\n\t\t\t\t\tparent.uniqueId();\n\t\t\t\t\tthat.parents[ this.id ] = {\n\t\t\t\t\t\telement: this,\n\t\t\t\t\t\ttitle: parent.attr( \"title\" )\n\t\t\t\t\t};\n\t\t\t\t\tparent.attr( \"title\", \"\" );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tthis._registerCloseHandlers( event, target );\n\t\tthis._updateContent( target, event );\n\t},\n\n\t_updateContent: function( target, event ) {\n\t\tvar content,\n\t\t\tcontentOption = this.options.content,\n\t\t\tthat = this,\n\t\t\teventType = event ? event.type : null;\n\n\t\tif ( typeof contentOption === \"string\" || contentOption.nodeType ||\n\t\t\t\tcontentOption.jquery ) {\n\t\t\treturn this._open( event, target, contentOption );\n\t\t}\n\n\t\tcontent = contentOption.call( target[ 0 ], function( response ) {\n\n\t\t\t// IE may instantly serve a cached response for ajax requests\n\t\t\t// delay this call to _open so the other call to _open runs first\n\t\t\tthat._delay( function() {\n\n\t\t\t\t// Ignore async response if tooltip was closed already\n\t\t\t\tif ( !target.data( \"ui-tooltip-open\" ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// JQuery creates a special event for focusin when it doesn't\n\t\t\t\t// exist natively. To improve performance, the native event\n\t\t\t\t// object is reused and the type is changed. Therefore, we can't\n\t\t\t\t// rely on the type being correct after the event finished\n\t\t\t\t// bubbling, so we set it back to the previous value. (#8740)\n\t\t\t\tif ( event ) {\n\t\t\t\t\tevent.type = eventType;\n\t\t\t\t}\n\t\t\t\tthis._open( event, target, response );\n\t\t\t} );\n\t\t} );\n\t\tif ( content ) {\n\t\t\tthis._open( event, target, content );\n\t\t}\n\t},\n\n\t_open: function( event, target, content ) {\n\t\tvar tooltipData, tooltip, delayedShow, a11yContent,\n\t\t\tpositionOption = $.extend( {}, this.options.position );\n\n\t\tif ( !content ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Content can be updated multiple times. If the tooltip already\n\t\t// exists, then just update the content and bail.\n\t\ttooltipData = this._find( target );\n\t\tif ( tooltipData ) {\n\t\t\ttooltipData.tooltip.find( \".ui-tooltip-content\" ).html( content );\n\t\t\treturn;\n\t\t}\n\n\t\t// If we have a title, clear it to prevent the native tooltip\n\t\t// we have to check first to avoid defining a title if none exists\n\t\t// (we don't want to cause an element to start matching [title])\n\t\t//\n\t\t// We use removeAttr only for key events, to allow IE to export the correct\n\t\t// accessible attributes. For mouse events, set to empty string to avoid\n\t\t// native tooltip showing up (happens only when removing inside mouseover).\n\t\tif ( target.is( \"[title]\" ) ) {\n\t\t\tif ( event && event.type === \"mouseover\" ) {\n\t\t\t\ttarget.attr( \"title\", \"\" );\n\t\t\t} else {\n\t\t\t\ttarget.removeAttr( \"title\" );\n\t\t\t}\n\t\t}\n\n\t\ttooltipData = this._tooltip( target );\n\t\ttooltip = tooltipData.tooltip;\n\t\tthis._addDescribedBy( target, tooltip.attr( \"id\" ) );\n\t\ttooltip.find( \".ui-tooltip-content\" ).html( content );\n\n\t\t// Support: Voiceover on OS X, JAWS on IE <= 9\n\t\t// JAWS announces deletions even when aria-relevant=\"additions\"\n\t\t// Voiceover will sometimes re-read the entire log region's contents from the beginning\n\t\tthis.liveRegion.children().hide();\n\t\ta11yContent = $( \"
\" ).html( tooltip.find( \".ui-tooltip-content\" ).html() );\n\t\ta11yContent.removeAttr( \"name\" ).find( \"[name]\" ).removeAttr( \"name\" );\n\t\ta11yContent.removeAttr( \"id\" ).find( \"[id]\" ).removeAttr( \"id\" );\n\t\ta11yContent.appendTo( this.liveRegion );\n\n\t\tfunction position( event ) {\n\t\t\tpositionOption.of = event;\n\t\t\tif ( tooltip.is( \":hidden\" ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttooltip.position( positionOption );\n\t\t}\n\t\tif ( this.options.track && event && /^mouse/.test( event.type ) ) {\n\t\t\tthis._on( this.document, {\n\t\t\t\tmousemove: position\n\t\t\t} );\n\n\t\t\t// trigger once to override element-relative positioning\n\t\t\tposition( event );\n\t\t} else {\n\t\t\ttooltip.position( $.extend( {\n\t\t\t\tof: target\n\t\t\t}, this.options.position ) );\n\t\t}\n\n\t\ttooltip.hide();\n\n\t\tthis._show( tooltip, this.options.show );\n\n\t\t// Handle tracking tooltips that are shown with a delay (#8644). As soon\n\t\t// as the tooltip is visible, position the tooltip using the most recent\n\t\t// event.\n\t\t// Adds the check to add the timers only when both delay and track options are set (#14682)\n\t\tif ( this.options.track && this.options.show && this.options.show.delay ) {\n\t\t\tdelayedShow = this.delayedShow = setInterval( function() {\n\t\t\t\tif ( tooltip.is( \":visible\" ) ) {\n\t\t\t\t\tposition( positionOption.of );\n\t\t\t\t\tclearInterval( delayedShow );\n\t\t\t\t}\n\t\t\t}, $.fx.interval );\n\t\t}\n\n\t\tthis._trigger( \"open\", event, { tooltip: tooltip } );\n\t},\n\n\t_registerCloseHandlers: function( event, target ) {\n\t\tvar events = {\n\t\t\tkeyup: function( event ) {\n\t\t\t\tif ( event.keyCode === $.ui.keyCode.ESCAPE ) {\n\t\t\t\t\tvar fakeEvent = $.Event( event );\n\t\t\t\t\tfakeEvent.currentTarget = target[ 0 ];\n\t\t\t\t\tthis.close( fakeEvent, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Only bind remove handler for delegated targets. Non-delegated\n\t\t// tooltips will handle this in destroy.\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tevents.remove = function() {\n\t\t\t\tthis._removeTooltip( this._find( target ).tooltip );\n\t\t\t};\n\t\t}\n\n\t\tif ( !event || event.type === \"mouseover\" ) {\n\t\t\tevents.mouseleave = \"close\";\n\t\t}\n\t\tif ( !event || event.type === \"focusin\" ) {\n\t\t\tevents.focusout = \"close\";\n\t\t}\n\t\tthis._on( true, target, events );\n\t},\n\n\tclose: function( event ) {\n\t\tvar tooltip,\n\t\t\tthat = this,\n\t\t\ttarget = $( event ? event.currentTarget : this.element ),\n\t\t\ttooltipData = this._find( target );\n\n\t\t// The tooltip may already be closed\n\t\tif ( !tooltipData ) {\n\n\t\t\t// We set ui-tooltip-open immediately upon open (in open()), but only set the\n\t\t\t// additional data once there's actually content to show (in _open()). So even if the\n\t\t\t// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in\n\t\t\t// the period between open() and _open().\n\t\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\t\treturn;\n\t\t}\n\n\t\ttooltip = tooltipData.tooltip;\n\n\t\t// Disabling closes the tooltip, so we need to track when we're closing\n\t\t// to avoid an infinite loop in case the tooltip becomes disabled on close\n\t\tif ( tooltipData.closing ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clear the interval for delayed tracking tooltips\n\t\tclearInterval( this.delayedShow );\n\n\t\t// Only set title if we had one before (see comment in _open())\n\t\t// If the title attribute has changed since open(), don't restore\n\t\tif ( target.data( \"ui-tooltip-title\" ) && !target.attr( \"title\" ) ) {\n\t\t\ttarget.attr( \"title\", target.data( \"ui-tooltip-title\" ) );\n\t\t}\n\n\t\tthis._removeDescribedBy( target );\n\n\t\ttooltipData.hiding = true;\n\t\ttooltip.stop( true );\n\t\tthis._hide( tooltip, this.options.hide, function() {\n\t\t\tthat._removeTooltip( $( this ) );\n\t\t} );\n\n\t\ttarget.removeData( \"ui-tooltip-open\" );\n\t\tthis._off( target, \"mouseleave focusout keyup\" );\n\n\t\t// Remove 'remove' binding only on delegated targets\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\n\t\t\tthis._off( target, \"remove\" );\n\t\t}\n\t\tthis._off( this.document, \"mousemove\" );\n\n\t\tif ( event && event.type === \"mouseleave\" ) {\n\t\t\t$.each( this.parents, function( id, parent ) {\n\t\t\t\t$( parent.element ).attr( \"title\", parent.title );\n\t\t\t\tdelete that.parents[ id ];\n\t\t\t} );\n\t\t}\n\n\t\ttooltipData.closing = true;\n\t\tthis._trigger( \"close\", event, { tooltip: tooltip } );\n\t\tif ( !tooltipData.hiding ) {\n\t\t\ttooltipData.closing = false;\n\t\t}\n\t},\n\n\t_tooltip: function( element ) {\n\t\tvar tooltip = $( \"
\" ).attr( \"role\", \"tooltip\" ),\n\t\t\tcontent = $( \"
\" ).appendTo( tooltip ),\n\t\t\tid = tooltip.uniqueId().attr( \"id\" );\n\n\t\tthis._addClass( content, \"ui-tooltip-content\" );\n\t\tthis._addClass( tooltip, \"ui-tooltip\", \"ui-widget ui-widget-content\" );\n\n\t\ttooltip.appendTo( this._appendTo( element ) );\n\n\t\treturn this.tooltips[ id ] = {\n\t\t\telement: element,\n\t\t\ttooltip: tooltip\n\t\t};\n\t},\n\n\t_find: function( target ) {\n\t\tvar id = target.data( \"ui-tooltip-id\" );\n\t\treturn id ? this.tooltips[ id ] : null;\n\t},\n\n\t_removeTooltip: function( tooltip ) {\n\t\ttooltip.remove();\n\t\tdelete this.tooltips[ tooltip.attr( \"id\" ) ];\n\t},\n\n\t_appendTo: function( target ) {\n\t\tvar element = target.closest( \".ui-front, dialog\" );\n\n\t\tif ( !element.length ) {\n\t\t\telement = this.document[ 0 ].body;\n\t\t}\n\n\t\treturn element;\n\t},\n\n\t_destroy: function() {\n\t\tvar that = this;\n\n\t\t// Close open tooltips\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\n\n\t\t\t// Delegate to close method to handle common cleanup\n\t\t\tvar event = $.Event( \"blur\" ),\n\t\t\t\telement = tooltipData.element;\n\t\t\tevent.target = event.currentTarget = element[ 0 ];\n\t\t\tthat.close( event, true );\n\n\t\t\t// Remove immediately; destroying an open tooltip doesn't use the\n\t\t\t// hide animation\n\t\t\t$( \"#\" + id ).remove();\n\n\t\t\t// Restore the title\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\n\n\t\t\t\t// If the title attribute has changed since open(), don't restore\n\t\t\t\tif ( !element.attr( \"title\" ) ) {\n\t\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\n\t\t\t\t}\n\t\t\t\telement.removeData( \"ui-tooltip-title\" );\n\t\t\t}\n\t\t} );\n\t\tthis.liveRegion.remove();\n\t}\n} );\n\n// DEPRECATED\n// TODO: Switch return back to widget declaration at top of file when this is removed\nif ( $.uiBackCompat !== false ) {\n\n\t// Backcompat for tooltipClass option\n\t$.widget( \"ui.tooltip\", $.ui.tooltip, {\n\t\toptions: {\n\t\t\ttooltipClass: null\n\t\t},\n\t\t_tooltip: function() {\n\t\t\tvar tooltipData = this._superApply( arguments );\n\t\t\tif ( this.options.tooltipClass ) {\n\t\t\t\ttooltipData.tooltip.addClass( this.options.tooltipClass );\n\t\t\t}\n\t\t\treturn tooltipData;\n\t\t}\n\t} );\n}\n\nvar widgetsTooltip = $.ui.tooltip;\n\n\n\n\n}));","/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)\n * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)\n * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.\n *\n * Version: 1.3.8\n *\n */\n(function($) {\n\n $.fn.extend({\n slimScroll: function(options) {\n\n var defaults = {\n\n // width in pixels of the visible scroll area\n width : 'auto',\n\n // height in pixels of the visible scroll area\n height : '250px',\n\n // width in pixels of the scrollbar and rail\n size : '7px',\n\n // scrollbar color, accepts any hex/color value\n color: '#000',\n\n // scrollbar position - left/right\n position : 'right',\n\n // distance in pixels between the side edge and the scrollbar\n distance : '1px',\n\n // default scroll position on load - top / bottom / $('selector')\n start : 'top',\n\n // sets scrollbar opacity\n opacity : .4,\n\n // enables always-on mode for the scrollbar\n alwaysVisible : false,\n\n // check if we should hide the scrollbar when user is hovering over\n disableFadeOut : false,\n\n // sets visibility of the rail\n railVisible : false,\n\n // sets rail color\n railColor : '#333',\n\n // sets rail opacity\n railOpacity : .2,\n\n // whether we should use jQuery UI Draggable to enable bar dragging\n railDraggable : true,\n\n // defautlt CSS class of the slimscroll rail\n railClass : 'slimScrollRail',\n\n // defautlt CSS class of the slimscroll bar\n barClass : 'slimScrollBar',\n\n // defautlt CSS class of the slimscroll wrapper\n wrapperClass : 'slimScrollDiv',\n\n // check if mousewheel should scroll the window if we reach top/bottom\n allowPageScroll : false,\n\n // scroll amount applied to each mouse wheel step\n wheelStep : 20,\n\n // scroll amount applied when user is using gestures\n touchScrollStep : 200,\n\n // sets border radius\n borderRadius: '7px',\n\n // sets border radius of the rail\n railBorderRadius : '7px'\n };\n\n var o = $.extend(defaults, options);\n\n // do it for every element that matches selector\n this.each(function(){\n\n var isOverPanel, isOverBar, isDragg, queueHide, touchDif,\n barHeight, percentScroll, lastScroll,\n divS = '
',\n minBarHeight = 30,\n releaseScroll = false;\n\n // used in event handlers and for better minification\n var me = $(this);\n\n // ensure we are not binding it again\n if (me.parent().hasClass(o.wrapperClass))\n {\n // start from last bar position\n var offset = me.scrollTop();\n\n // find bar and rail\n bar = me.siblings('.' + o.barClass);\n rail = me.siblings('.' + o.railClass);\n\n getBarHeight();\n\n // check if we should scroll existing instance\n if ($.isPlainObject(options))\n {\n // Pass height: auto to an existing slimscroll object to force a resize after contents have changed\n if ( 'height' in options && options.height == 'auto' ) {\n me.parent().css('height', 'auto');\n me.css('height', 'auto');\n var height = me.parent().parent().height();\n me.parent().css('height', height);\n me.css('height', height);\n } else if ('height' in options) {\n var h = options.height;\n me.parent().css('height', h);\n me.css('height', h);\n }\n\n if ('scrollTo' in options)\n {\n // jump to a static point\n offset = parseInt(o.scrollTo);\n }\n else if ('scrollBy' in options)\n {\n // jump by value pixels\n offset += parseInt(o.scrollBy);\n }\n else if ('destroy' in options)\n {\n // remove slimscroll elements\n bar.remove();\n rail.remove();\n me.unwrap();\n return;\n }\n\n // scroll content by the given offset\n scrollContent(offset, false, true);\n }\n\n return;\n }\n else if ($.isPlainObject(options))\n {\n if ('destroy' in options)\n {\n \treturn;\n }\n }\n\n // optionally set height to the parent's height\n o.height = (o.height == 'auto') ? me.parent().height() : o.height;\n\n // wrap content\n var wrapper = $(divS)\n .addClass(o.wrapperClass)\n .css({\n position: 'relative',\n overflow: 'hidden',\n width: o.width,\n height: o.height\n });\n\n // update style for the div\n me.css({\n overflow: 'hidden',\n width: o.width,\n height: o.height\n });\n\n // create scrollbar rail\n var rail = $(divS)\n .addClass(o.railClass)\n .css({\n width: o.size,\n height: '100%',\n position: 'absolute',\n top: 0,\n display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none',\n 'border-radius': o.railBorderRadius,\n background: o.railColor,\n opacity: o.railOpacity,\n zIndex: 90\n });\n\n // create scrollbar\n var bar = $(divS)\n .addClass(o.barClass)\n .css({\n background: o.color,\n width: o.size,\n position: 'absolute',\n top: 0,\n opacity: o.opacity,\n display: o.alwaysVisible ? 'block' : 'none',\n 'border-radius' : o.borderRadius,\n BorderRadius: o.borderRadius,\n MozBorderRadius: o.borderRadius,\n WebkitBorderRadius: o.borderRadius,\n zIndex: 99\n });\n\n // set position\n var posCss = (o.position == 'right') ? { right: o.distance } : { left: o.distance };\n rail.css(posCss);\n bar.css(posCss);\n\n // wrap it\n me.wrap(wrapper);\n\n // append to parent div\n me.parent().append(bar);\n me.parent().append(rail);\n\n // make it draggable and no longer dependent on the jqueryUI\n if (o.railDraggable){\n bar.bind(\"mousedown\", function(e) {\n var $doc = $(document);\n isDragg = true;\n t = parseFloat(bar.css('top'));\n pageY = e.pageY;\n\n $doc.bind(\"mousemove.slimscroll\", function(e){\n currTop = t + e.pageY - pageY;\n bar.css('top', currTop);\n scrollContent(0, bar.position().top, false);// scroll content\n });\n\n $doc.bind(\"mouseup.slimscroll\", function(e) {\n isDragg = false;hideBar();\n $doc.unbind('.slimscroll');\n });\n return false;\n }).bind(\"selectstart.slimscroll\", function(e){\n e.stopPropagation();\n e.preventDefault();\n return false;\n });\n }\n\n // on rail over\n rail.hover(function(){\n showBar();\n }, function(){\n hideBar();\n });\n\n // on bar over\n bar.hover(function(){\n isOverBar = true;\n }, function(){\n isOverBar = false;\n });\n\n // show on parent mouseover\n me.hover(function(){\n isOverPanel = true;\n showBar();\n hideBar();\n }, function(){\n isOverPanel = false;\n hideBar();\n });\n\n // support for mobile\n me.bind('touchstart', function(e,b){\n if (e.originalEvent.touches.length)\n {\n // record where touch started\n touchDif = e.originalEvent.touches[0].pageY;\n }\n });\n\n me.bind('touchmove', function(e){\n // prevent scrolling the page if necessary\n if(!releaseScroll)\n {\n \t\t e.originalEvent.preventDefault();\n\t\t }\n if (e.originalEvent.touches.length)\n {\n // see how far user swiped\n var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep;\n // scroll content\n scrollContent(diff, true);\n touchDif = e.originalEvent.touches[0].pageY;\n }\n });\n\n // set up initial height\n getBarHeight();\n\n // check start position\n if (o.start === 'bottom')\n {\n // scroll content to bottom\n bar.css({ top: me.outerHeight() - bar.outerHeight() });\n scrollContent(0, true);\n }\n else if (o.start !== 'top')\n {\n // assume jQuery selector\n scrollContent($(o.start).position().top, null, true);\n\n // make sure bar stays hidden\n if (!o.alwaysVisible) { bar.hide(); }\n }\n\n // attach scroll events\n attachWheel(this);\n\n function _onWheel(e)\n {\n // use mouse wheel only when mouse is over\n if (!isOverPanel) { return; }\n\n var e = e || window.event;\n\n var delta = 0;\n if (e.wheelDelta) { delta = -e.wheelDelta/120; }\n if (e.detail) { delta = e.detail / 3; }\n\n var target = e.target || e.srcTarget || e.srcElement;\n if ($(target).closest('.' + o.wrapperClass).is(me.parent())) {\n // scroll content\n scrollContent(delta, true);\n }\n\n // stop window scroll\n if (e.preventDefault && !releaseScroll) { e.preventDefault(); }\n if (!releaseScroll) { e.returnValue = false; }\n }\n\n function scrollContent(y, isWheel, isJump)\n {\n releaseScroll = false;\n var delta = y;\n var maxTop = me.outerHeight() - bar.outerHeight();\n\n if (isWheel)\n {\n // move bar with mouse wheel\n delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight();\n\n // move bar, make sure it doesn't go out\n delta = Math.min(Math.max(delta, 0), maxTop);\n\n // if scrolling down, make sure a fractional change to the\n // scroll position isn't rounded away when the scrollbar's CSS is set\n // this flooring of delta would happened automatically when\n // bar.css is set below, but we floor here for clarity\n delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta);\n\n // scroll the scrollbar\n bar.css({ top: delta + 'px' });\n }\n\n // calculate actual scroll amount\n percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight());\n delta = percentScroll * (me[0].scrollHeight - me.outerHeight());\n\n if (isJump)\n {\n delta = y;\n var offsetTop = delta / me[0].scrollHeight * me.outerHeight();\n offsetTop = Math.min(Math.max(offsetTop, 0), maxTop);\n bar.css({ top: offsetTop + 'px' });\n }\n\n // scroll content\n me.scrollTop(delta);\n\n // fire scrolling event\n me.trigger('slimscrolling', ~~delta);\n\n // ensure bar is visible\n showBar();\n\n // trigger hide when scroll is stopped\n hideBar();\n }\n\n function attachWheel(target)\n {\n if (window.addEventListener)\n {\n target.addEventListener('DOMMouseScroll', _onWheel, false );\n target.addEventListener('mousewheel', _onWheel, false );\n }\n else\n {\n document.attachEvent(\"onmousewheel\", _onWheel)\n }\n }\n\n function getBarHeight()\n {\n // calculate scrollbar height and make sure it is not too small\n barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight);\n bar.css({ height: barHeight + 'px' });\n\n // hide scrollbar if content is not long enough\n var display = barHeight == me.outerHeight() ? 'none' : 'block';\n bar.css({ display: display });\n }\n\n function showBar()\n {\n // recalculate bar height\n getBarHeight();\n clearTimeout(queueHide);\n\n // when bar reached top or bottom\n if (percentScroll == ~~percentScroll)\n {\n //release wheel\n releaseScroll = o.allowPageScroll;\n\n // publish approporiate event\n if (lastScroll != percentScroll)\n {\n var msg = (~~percentScroll == 0) ? 'top' : 'bottom';\n me.trigger('slimscroll', msg);\n }\n }\n else\n {\n releaseScroll = false;\n }\n lastScroll = percentScroll;\n\n // show only when required\n if(barHeight >= me.outerHeight()) {\n //allow window scroll\n releaseScroll = true;\n return;\n }\n bar.stop(true,true).fadeIn('fast');\n if (o.railVisible) { rail.stop(true,true).fadeIn('fast'); }\n }\n\n function hideBar()\n {\n // only hide when options allow it\n if (!o.alwaysVisible)\n {\n queueHide = setTimeout(function(){\n if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg)\n {\n bar.fadeOut('slow');\n rail.fadeOut('slow');\n }\n }, 1000);\n }\n }\n\n });\n\n // maintain chainability\n return this;\n }\n });\n\n $.fn.extend({\n slimscroll: $.fn.slimScroll\n });\n\n})(jQuery);\n","// This [jQuery](https://jquery.com/) plugin implements an `\");\n\n // The first load event gets fired after the iframe has been injected\n // into the DOM, and is used to prepare the actual submission.\n iframe.one(\"load\", function() {\n\n // The second load event gets fired when the response to the form\n // submission is received. The implementation detects whether the\n // actual payload is embedded in a `\\\";\\n\\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\\n} )();\\nvar documentElement = document.documentElement;\\n\\n\\n\\nvar\\n\\trkeyEvent = /^key/,\\n\\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\\n\\trtypenamespace = /^([^.]*)(?:\\\\.(.+)|)/;\\n\\nfunction returnTrue() {\\n\\treturn true;\\n}\\n\\nfunction returnFalse() {\\n\\treturn false;\\n}\\n\\n// Support: IE <=9 only\\n// See #13393 for more info\\nfunction safeActiveElement() {\\n\\ttry {\\n\\t\\treturn document.activeElement;\\n\\t} catch ( err ) { }\\n}\\n\\nfunction on( elem, types, selector, data, fn, one ) {\\n\\tvar origFn, type;\\n\\n\\t// Types can be a map of types/handlers\\n\\tif ( typeof types === \\\"object\\\" ) {\\n\\n\\t\\t// ( types-Object, selector, data )\\n\\t\\tif ( typeof selector !== \\\"string\\\" ) {\\n\\n\\t\\t\\t// ( types-Object, data )\\n\\t\\t\\tdata = data || selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t\\tfor ( type in types ) {\\n\\t\\t\\ton( elem, type, selector, data, types[ type ], one );\\n\\t\\t}\\n\\t\\treturn elem;\\n\\t}\\n\\n\\tif ( data == null && fn == null ) {\\n\\n\\t\\t// ( types, fn )\\n\\t\\tfn = selector;\\n\\t\\tdata = selector = undefined;\\n\\t} else if ( fn == null ) {\\n\\t\\tif ( typeof selector === \\\"string\\\" ) {\\n\\n\\t\\t\\t// ( types, selector, fn )\\n\\t\\t\\tfn = data;\\n\\t\\t\\tdata = undefined;\\n\\t\\t} else {\\n\\n\\t\\t\\t// ( types, data, fn )\\n\\t\\t\\tfn = data;\\n\\t\\t\\tdata = selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t}\\n\\tif ( fn === false ) {\\n\\t\\tfn = returnFalse;\\n\\t} else if ( !fn ) {\\n\\t\\treturn elem;\\n\\t}\\n\\n\\tif ( one === 1 ) {\\n\\t\\torigFn = fn;\\n\\t\\tfn = function( event ) {\\n\\n\\t\\t\\t// Can use an empty set, since event contains the info\\n\\t\\t\\tjQuery().off( event );\\n\\t\\t\\treturn origFn.apply( this, arguments );\\n\\t\\t};\\n\\n\\t\\t// Use same guid so caller can remove using origFn\\n\\t\\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\\n\\t}\\n\\treturn elem.each( function() {\\n\\t\\tjQuery.event.add( this, types, fn, data, selector );\\n\\t} );\\n}\\n\\n/*\\n * Helper functions for managing events -- not part of the public interface.\\n * Props to Dean Edwards' addEvent library for many of the ideas.\\n */\\njQuery.event = {\\n\\n\\tglobal: {},\\n\\n\\tadd: function( elem, types, handler, data, selector ) {\\n\\n\\t\\tvar handleObjIn, eventHandle, tmp,\\n\\t\\t\\tevents, t, handleObj,\\n\\t\\t\\tspecial, handlers, type, namespaces, origType,\\n\\t\\t\\telemData = dataPriv.get( elem );\\n\\n\\t\\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\\n\\t\\tif ( !elemData ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Caller can pass in an object of custom data in lieu of the handler\\n\\t\\tif ( handler.handler ) {\\n\\t\\t\\thandleObjIn = handler;\\n\\t\\t\\thandler = handleObjIn.handler;\\n\\t\\t\\tselector = handleObjIn.selector;\\n\\t\\t}\\n\\n\\t\\t// Ensure that invalid selectors throw exceptions at attach time\\n\\t\\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\\n\\t\\tif ( selector ) {\\n\\t\\t\\tjQuery.find.matchesSelector( documentElement, selector );\\n\\t\\t}\\n\\n\\t\\t// Make sure that the handler has a unique ID, used to find/remove it later\\n\\t\\tif ( !handler.guid ) {\\n\\t\\t\\thandler.guid = jQuery.guid++;\\n\\t\\t}\\n\\n\\t\\t// Init the element's event structure and main handler, if this is the first\\n\\t\\tif ( !( events = elemData.events ) ) {\\n\\t\\t\\tevents = elemData.events = {};\\n\\t\\t}\\n\\t\\tif ( !( eventHandle = elemData.handle ) ) {\\n\\t\\t\\teventHandle = elemData.handle = function( e ) {\\n\\n\\t\\t\\t\\t// Discard the second event of a jQuery.event.trigger() and\\n\\t\\t\\t\\t// when an event is called after a page has unloaded\\n\\t\\t\\t\\treturn typeof jQuery !== \\\"undefined\\\" && jQuery.event.triggered !== e.type ?\\n\\t\\t\\t\\t\\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\\n\\t\\t\\t};\\n\\t\\t}\\n\\n\\t\\t// Handle multiple events separated by a space\\n\\t\\ttypes = ( types || \\\"\\\" ).match( rnothtmlwhite ) || [ \\\"\\\" ];\\n\\t\\tt = types.length;\\n\\t\\twhile ( t-- ) {\\n\\t\\t\\ttmp = rtypenamespace.exec( types[ t ] ) || [];\\n\\t\\t\\ttype = origType = tmp[ 1 ];\\n\\t\\t\\tnamespaces = ( tmp[ 2 ] || \\\"\\\" ).split( \\\".\\\" ).sort();\\n\\n\\t\\t\\t// There *must* be a type, no attaching namespace-only handlers\\n\\t\\t\\tif ( !type ) {\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If event changes its type, use the special event handlers for the changed type\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\n\\t\\t\\t// If selector defined, determine special event api type, otherwise given type\\n\\t\\t\\ttype = ( selector ? special.delegateType : special.bindType ) || type;\\n\\n\\t\\t\\t// Update special based on newly reset type\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\n\\t\\t\\t// handleObj is passed to all event handlers\\n\\t\\t\\thandleObj = jQuery.extend( {\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\torigType: origType,\\n\\t\\t\\t\\tdata: data,\\n\\t\\t\\t\\thandler: handler,\\n\\t\\t\\t\\tguid: handler.guid,\\n\\t\\t\\t\\tselector: selector,\\n\\t\\t\\t\\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\\n\\t\\t\\t\\tnamespace: namespaces.join( \\\".\\\" )\\n\\t\\t\\t}, handleObjIn );\\n\\n\\t\\t\\t// Init the event handler queue if we're the first\\n\\t\\t\\tif ( !( handlers = events[ type ] ) ) {\\n\\t\\t\\t\\thandlers = events[ type ] = [];\\n\\t\\t\\t\\thandlers.delegateCount = 0;\\n\\n\\t\\t\\t\\t// Only use addEventListener if the special events handler returns false\\n\\t\\t\\t\\tif ( !special.setup ||\\n\\t\\t\\t\\t\\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\\n\\n\\t\\t\\t\\t\\tif ( elem.addEventListener ) {\\n\\t\\t\\t\\t\\t\\telem.addEventListener( type, eventHandle );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( special.add ) {\\n\\t\\t\\t\\tspecial.add.call( elem, handleObj );\\n\\n\\t\\t\\t\\tif ( !handleObj.handler.guid ) {\\n\\t\\t\\t\\t\\thandleObj.handler.guid = handler.guid;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add to the element's handler list, delegates in front\\n\\t\\t\\tif ( selector ) {\\n\\t\\t\\t\\thandlers.splice( handlers.delegateCount++, 0, handleObj );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\thandlers.push( handleObj );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Keep track of which events have ever been used, for event optimization\\n\\t\\t\\tjQuery.event.global[ type ] = true;\\n\\t\\t}\\n\\n\\t},\\n\\n\\t// Detach an event or set of events from an element\\n\\tremove: function( elem, types, handler, selector, mappedTypes ) {\\n\\n\\t\\tvar j, origCount, tmp,\\n\\t\\t\\tevents, t, handleObj,\\n\\t\\t\\tspecial, handlers, type, namespaces, origType,\\n\\t\\t\\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\\n\\n\\t\\tif ( !elemData || !( events = elemData.events ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Once for each type.namespace in types; type may be omitted\\n\\t\\ttypes = ( types || \\\"\\\" ).match( rnothtmlwhite ) || [ \\\"\\\" ];\\n\\t\\tt = types.length;\\n\\t\\twhile ( t-- ) {\\n\\t\\t\\ttmp = rtypenamespace.exec( types[ t ] ) || [];\\n\\t\\t\\ttype = origType = tmp[ 1 ];\\n\\t\\t\\tnamespaces = ( tmp[ 2 ] || \\\"\\\" ).split( \\\".\\\" ).sort();\\n\\n\\t\\t\\t// Unbind all events (on this namespace, if provided) for the element\\n\\t\\t\\tif ( !type ) {\\n\\t\\t\\t\\tfor ( type in events ) {\\n\\t\\t\\t\\t\\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\t\\t\\ttype = ( selector ? special.delegateType : special.bindType ) || type;\\n\\t\\t\\thandlers = events[ type ] || [];\\n\\t\\t\\ttmp = tmp[ 2 ] &&\\n\\t\\t\\t\\tnew RegExp( \\\"(^|\\\\\\\\.)\\\" + namespaces.join( \\\"\\\\\\\\.(?:.*\\\\\\\\.|)\\\" ) + \\\"(\\\\\\\\.|$)\\\" );\\n\\n\\t\\t\\t// Remove matching events\\n\\t\\t\\torigCount = j = handlers.length;\\n\\t\\t\\twhile ( j-- ) {\\n\\t\\t\\t\\thandleObj = handlers[ j ];\\n\\n\\t\\t\\t\\tif ( ( mappedTypes || origType === handleObj.origType ) &&\\n\\t\\t\\t\\t\\t( !handler || handler.guid === handleObj.guid ) &&\\n\\t\\t\\t\\t\\t( !tmp || tmp.test( handleObj.namespace ) ) &&\\n\\t\\t\\t\\t\\t( !selector || selector === handleObj.selector ||\\n\\t\\t\\t\\t\\t\\tselector === \\\"**\\\" && handleObj.selector ) ) {\\n\\t\\t\\t\\t\\thandlers.splice( j, 1 );\\n\\n\\t\\t\\t\\t\\tif ( handleObj.selector ) {\\n\\t\\t\\t\\t\\t\\thandlers.delegateCount--;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( special.remove ) {\\n\\t\\t\\t\\t\\t\\tspecial.remove.call( elem, handleObj );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Remove generic event handler if we removed something and no more handlers exist\\n\\t\\t\\t// (avoids potential for endless recursion during removal of special event handlers)\\n\\t\\t\\tif ( origCount && !handlers.length ) {\\n\\t\\t\\t\\tif ( !special.teardown ||\\n\\t\\t\\t\\t\\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\\n\\n\\t\\t\\t\\t\\tjQuery.removeEvent( elem, type, elemData.handle );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tdelete events[ type ];\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Remove data and the expando if it's no longer used\\n\\t\\tif ( jQuery.isEmptyObject( events ) ) {\\n\\t\\t\\tdataPriv.remove( elem, \\\"handle events\\\" );\\n\\t\\t}\\n\\t},\\n\\n\\tdispatch: function( nativeEvent ) {\\n\\n\\t\\t// Make a writable jQuery.Event from the native event object\\n\\t\\tvar event = jQuery.event.fix( nativeEvent );\\n\\n\\t\\tvar i, j, ret, matched, handleObj, handlerQueue,\\n\\t\\t\\targs = new Array( arguments.length ),\\n\\t\\t\\thandlers = ( dataPriv.get( this, \\\"events\\\" ) || {} )[ event.type ] || [],\\n\\t\\t\\tspecial = jQuery.event.special[ event.type ] || {};\\n\\n\\t\\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\\n\\t\\targs[ 0 ] = event;\\n\\n\\t\\tfor ( i = 1; i < arguments.length; i++ ) {\\n\\t\\t\\targs[ i ] = arguments[ i ];\\n\\t\\t}\\n\\n\\t\\tevent.delegateTarget = this;\\n\\n\\t\\t// Call the preDispatch hook for the mapped type, and let it bail if desired\\n\\t\\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Determine handlers\\n\\t\\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\\n\\n\\t\\t// Run delegates first; they may want to stop propagation beneath us\\n\\t\\ti = 0;\\n\\t\\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\\n\\t\\t\\tevent.currentTarget = matched.elem;\\n\\n\\t\\t\\tj = 0;\\n\\t\\t\\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\\n\\t\\t\\t\\t!event.isImmediatePropagationStopped() ) {\\n\\n\\t\\t\\t\\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\\n\\t\\t\\t\\t// a subset or equal to those in the bound event (both can have no namespace).\\n\\t\\t\\t\\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\\n\\n\\t\\t\\t\\t\\tevent.handleObj = handleObj;\\n\\t\\t\\t\\t\\tevent.data = handleObj.data;\\n\\n\\t\\t\\t\\t\\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\\n\\t\\t\\t\\t\\t\\thandleObj.handler ).apply( matched.elem, args );\\n\\n\\t\\t\\t\\t\\tif ( ret !== undefined ) {\\n\\t\\t\\t\\t\\t\\tif ( ( event.result = ret ) === false ) {\\n\\t\\t\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t\\t\\t\\tevent.stopPropagation();\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Call the postDispatch hook for the mapped type\\n\\t\\tif ( special.postDispatch ) {\\n\\t\\t\\tspecial.postDispatch.call( this, event );\\n\\t\\t}\\n\\n\\t\\treturn event.result;\\n\\t},\\n\\n\\thandlers: function( event, handlers ) {\\n\\t\\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\\n\\t\\t\\thandlerQueue = [],\\n\\t\\t\\tdelegateCount = handlers.delegateCount,\\n\\t\\t\\tcur = event.target;\\n\\n\\t\\t// Find delegate handlers\\n\\t\\tif ( delegateCount &&\\n\\n\\t\\t\\t// Support: IE <=9\\n\\t\\t\\t// Black-hole SVG instance trees (trac-13180)\\n\\t\\t\\tcur.nodeType &&\\n\\n\\t\\t\\t// Support: Firefox <=42\\n\\t\\t\\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\\n\\t\\t\\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\\n\\t\\t\\t// Support: IE 11 only\\n\\t\\t\\t// ...but not arrow key \\\"clicks\\\" of radio inputs, which can have `button` -1 (gh-2343)\\n\\t\\t\\t!( event.type === \\\"click\\\" && event.button >= 1 ) ) {\\n\\n\\t\\t\\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\\n\\n\\t\\t\\t\\t// Don't check non-elements (#13208)\\n\\t\\t\\t\\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\\n\\t\\t\\t\\tif ( cur.nodeType === 1 && !( event.type === \\\"click\\\" && cur.disabled === true ) ) {\\n\\t\\t\\t\\t\\tmatchedHandlers = [];\\n\\t\\t\\t\\t\\tmatchedSelectors = {};\\n\\t\\t\\t\\t\\tfor ( i = 0; i < delegateCount; i++ ) {\\n\\t\\t\\t\\t\\t\\thandleObj = handlers[ i ];\\n\\n\\t\\t\\t\\t\\t\\t// Don't conflict with Object.prototype properties (#13203)\\n\\t\\t\\t\\t\\t\\tsel = handleObj.selector + \\\" \\\";\\n\\n\\t\\t\\t\\t\\t\\tif ( matchedSelectors[ sel ] === undefined ) {\\n\\t\\t\\t\\t\\t\\t\\tmatchedSelectors[ sel ] = handleObj.needsContext ?\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery( sel, this ).index( cur ) > -1 :\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.find( sel, this, null, [ cur ] ).length;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif ( matchedSelectors[ sel ] ) {\\n\\t\\t\\t\\t\\t\\t\\tmatchedHandlers.push( handleObj );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif ( matchedHandlers.length ) {\\n\\t\\t\\t\\t\\t\\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Add the remaining (directly-bound) handlers\\n\\t\\tcur = this;\\n\\t\\tif ( delegateCount < handlers.length ) {\\n\\t\\t\\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\\n\\t\\t}\\n\\n\\t\\treturn handlerQueue;\\n\\t},\\n\\n\\taddProp: function( name, hook ) {\\n\\t\\tObject.defineProperty( jQuery.Event.prototype, name, {\\n\\t\\t\\tenumerable: true,\\n\\t\\t\\tconfigurable: true,\\n\\n\\t\\t\\tget: jQuery.isFunction( hook ) ?\\n\\t\\t\\t\\tfunction() {\\n\\t\\t\\t\\t\\tif ( this.originalEvent ) {\\n\\t\\t\\t\\t\\t\\t\\treturn hook( this.originalEvent );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} :\\n\\t\\t\\t\\tfunction() {\\n\\t\\t\\t\\t\\tif ( this.originalEvent ) {\\n\\t\\t\\t\\t\\t\\t\\treturn this.originalEvent[ name ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\tset: function( value ) {\\n\\t\\t\\t\\tObject.defineProperty( this, name, {\\n\\t\\t\\t\\t\\tenumerable: true,\\n\\t\\t\\t\\t\\tconfigurable: true,\\n\\t\\t\\t\\t\\twritable: true,\\n\\t\\t\\t\\t\\tvalue: value\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tfix: function( originalEvent ) {\\n\\t\\treturn originalEvent[ jQuery.expando ] ?\\n\\t\\t\\toriginalEvent :\\n\\t\\t\\tnew jQuery.Event( originalEvent );\\n\\t},\\n\\n\\tspecial: {\\n\\t\\tload: {\\n\\n\\t\\t\\t// Prevent triggered image.load events from bubbling to window.load\\n\\t\\t\\tnoBubble: true\\n\\t\\t},\\n\\t\\tfocus: {\\n\\n\\t\\t\\t// Fire native event if possible so blur/focus sequence is correct\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this !== safeActiveElement() && this.focus ) {\\n\\t\\t\\t\\t\\tthis.focus();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdelegateType: \\\"focusin\\\"\\n\\t\\t},\\n\\t\\tblur: {\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this === safeActiveElement() && this.blur ) {\\n\\t\\t\\t\\t\\tthis.blur();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\t\\t\\tdelegateType: \\\"focusout\\\"\\n\\t\\t},\\n\\t\\tclick: {\\n\\n\\t\\t\\t// For checkbox, fire native event so checked state will be right\\n\\t\\t\\ttrigger: function() {\\n\\t\\t\\t\\tif ( this.type === \\\"checkbox\\\" && this.click && jQuery.nodeName( this, \\\"input\\\" ) ) {\\n\\t\\t\\t\\t\\tthis.click();\\n\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\n\\t\\t\\t// For cross-browser consistency, don't fire native .click() on links\\n\\t\\t\\t_default: function( event ) {\\n\\t\\t\\t\\treturn jQuery.nodeName( event.target, \\\"a\\\" );\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tbeforeunload: {\\n\\t\\t\\tpostDispatch: function( event ) {\\n\\n\\t\\t\\t\\t// Support: Firefox 20+\\n\\t\\t\\t\\t// Firefox doesn't alert if the returnValue field is not set.\\n\\t\\t\\t\\tif ( event.result !== undefined && event.originalEvent ) {\\n\\t\\t\\t\\t\\tevent.originalEvent.returnValue = event.result;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.removeEvent = function( elem, type, handle ) {\\n\\n\\t// This \\\"if\\\" is needed for plain objects\\n\\tif ( elem.removeEventListener ) {\\n\\t\\telem.removeEventListener( type, handle );\\n\\t}\\n};\\n\\njQuery.Event = function( src, props ) {\\n\\n\\t// Allow instantiation without the 'new' keyword\\n\\tif ( !( this instanceof jQuery.Event ) ) {\\n\\t\\treturn new jQuery.Event( src, props );\\n\\t}\\n\\n\\t// Event object\\n\\tif ( src && src.type ) {\\n\\t\\tthis.originalEvent = src;\\n\\t\\tthis.type = src.type;\\n\\n\\t\\t// Events bubbling up the document may have been marked as prevented\\n\\t\\t// by a handler lower down the tree; reflect the correct value.\\n\\t\\tthis.isDefaultPrevented = src.defaultPrevented ||\\n\\t\\t\\t\\tsrc.defaultPrevented === undefined &&\\n\\n\\t\\t\\t\\t// Support: Android <=2.3 only\\n\\t\\t\\t\\tsrc.returnValue === false ?\\n\\t\\t\\treturnTrue :\\n\\t\\t\\treturnFalse;\\n\\n\\t\\t// Create target properties\\n\\t\\t// Support: Safari <=6 - 7 only\\n\\t\\t// Target should not be a text node (#504, #13143)\\n\\t\\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\\n\\t\\t\\tsrc.target.parentNode :\\n\\t\\t\\tsrc.target;\\n\\n\\t\\tthis.currentTarget = src.currentTarget;\\n\\t\\tthis.relatedTarget = src.relatedTarget;\\n\\n\\t// Event type\\n\\t} else {\\n\\t\\tthis.type = src;\\n\\t}\\n\\n\\t// Put explicitly provided properties onto the event object\\n\\tif ( props ) {\\n\\t\\tjQuery.extend( this, props );\\n\\t}\\n\\n\\t// Create a timestamp if incoming event doesn't have one\\n\\tthis.timeStamp = src && src.timeStamp || jQuery.now();\\n\\n\\t// Mark it as fixed\\n\\tthis[ jQuery.expando ] = true;\\n};\\n\\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\\njQuery.Event.prototype = {\\n\\tconstructor: jQuery.Event,\\n\\tisDefaultPrevented: returnFalse,\\n\\tisPropagationStopped: returnFalse,\\n\\tisImmediatePropagationStopped: returnFalse,\\n\\tisSimulated: false,\\n\\n\\tpreventDefault: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isDefaultPrevented = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.preventDefault();\\n\\t\\t}\\n\\t},\\n\\tstopPropagation: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isPropagationStopped = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.stopPropagation();\\n\\t\\t}\\n\\t},\\n\\tstopImmediatePropagation: function() {\\n\\t\\tvar e = this.originalEvent;\\n\\n\\t\\tthis.isImmediatePropagationStopped = returnTrue;\\n\\n\\t\\tif ( e && !this.isSimulated ) {\\n\\t\\t\\te.stopImmediatePropagation();\\n\\t\\t}\\n\\n\\t\\tthis.stopPropagation();\\n\\t}\\n};\\n\\n// Includes all common event props including KeyEvent and MouseEvent specific props\\njQuery.each( {\\n\\taltKey: true,\\n\\tbubbles: true,\\n\\tcancelable: true,\\n\\tchangedTouches: true,\\n\\tctrlKey: true,\\n\\tdetail: true,\\n\\teventPhase: true,\\n\\tmetaKey: true,\\n\\tpageX: true,\\n\\tpageY: true,\\n\\tshiftKey: true,\\n\\tview: true,\\n\\t\\\"char\\\": true,\\n\\tcharCode: true,\\n\\tkey: true,\\n\\tkeyCode: true,\\n\\tbutton: true,\\n\\tbuttons: true,\\n\\tclientX: true,\\n\\tclientY: true,\\n\\toffsetX: true,\\n\\toffsetY: true,\\n\\tpointerId: true,\\n\\tpointerType: true,\\n\\tscreenX: true,\\n\\tscreenY: true,\\n\\ttargetTouches: true,\\n\\ttoElement: true,\\n\\ttouches: true,\\n\\n\\twhich: function( event ) {\\n\\t\\tvar button = event.button;\\n\\n\\t\\t// Add which for key events\\n\\t\\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\\n\\t\\t\\treturn event.charCode != null ? event.charCode : event.keyCode;\\n\\t\\t}\\n\\n\\t\\t// Add which for click: 1 === left; 2 === middle; 3 === right\\n\\t\\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\\n\\t\\t\\tif ( button & 1 ) {\\n\\t\\t\\t\\treturn 1;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( button & 2 ) {\\n\\t\\t\\t\\treturn 3;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( button & 4 ) {\\n\\t\\t\\t\\treturn 2;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\n\\t\\treturn event.which;\\n\\t}\\n}, jQuery.event.addProp );\\n\\n// Create mouseenter/leave events using mouseover/out and event-time checks\\n// so that event delegation works in jQuery.\\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\\n//\\n// Support: Safari 7 only\\n// Safari sends mouseenter too often; see:\\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\\n// for the description of the bug (it existed in older Chrome versions as well).\\njQuery.each( {\\n\\tmouseenter: \\\"mouseover\\\",\\n\\tmouseleave: \\\"mouseout\\\",\\n\\tpointerenter: \\\"pointerover\\\",\\n\\tpointerleave: \\\"pointerout\\\"\\n}, function( orig, fix ) {\\n\\tjQuery.event.special[ orig ] = {\\n\\t\\tdelegateType: fix,\\n\\t\\tbindType: fix,\\n\\n\\t\\thandle: function( event ) {\\n\\t\\t\\tvar ret,\\n\\t\\t\\t\\ttarget = this,\\n\\t\\t\\t\\trelated = event.relatedTarget,\\n\\t\\t\\t\\thandleObj = event.handleObj;\\n\\n\\t\\t\\t// For mouseenter/leave call the handler if related is outside the target.\\n\\t\\t\\t// NB: No relatedTarget if the mouse left/entered the browser window\\n\\t\\t\\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\\n\\t\\t\\t\\tevent.type = handleObj.origType;\\n\\t\\t\\t\\tret = handleObj.handler.apply( this, arguments );\\n\\t\\t\\t\\tevent.type = fix;\\n\\t\\t\\t}\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\t};\\n} );\\n\\njQuery.fn.extend( {\\n\\n\\ton: function( types, selector, data, fn ) {\\n\\t\\treturn on( this, types, selector, data, fn );\\n\\t},\\n\\tone: function( types, selector, data, fn ) {\\n\\t\\treturn on( this, types, selector, data, fn, 1 );\\n\\t},\\n\\toff: function( types, selector, fn ) {\\n\\t\\tvar handleObj, type;\\n\\t\\tif ( types && types.preventDefault && types.handleObj ) {\\n\\n\\t\\t\\t// ( event ) dispatched jQuery.Event\\n\\t\\t\\thandleObj = types.handleObj;\\n\\t\\t\\tjQuery( types.delegateTarget ).off(\\n\\t\\t\\t\\thandleObj.namespace ?\\n\\t\\t\\t\\t\\thandleObj.origType + \\\".\\\" + handleObj.namespace :\\n\\t\\t\\t\\t\\thandleObj.origType,\\n\\t\\t\\t\\thandleObj.selector,\\n\\t\\t\\t\\thandleObj.handler\\n\\t\\t\\t);\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\t\\tif ( typeof types === \\\"object\\\" ) {\\n\\n\\t\\t\\t// ( types-object [, selector] )\\n\\t\\t\\tfor ( type in types ) {\\n\\t\\t\\t\\tthis.off( type, selector, types[ type ] );\\n\\t\\t\\t}\\n\\t\\t\\treturn this;\\n\\t\\t}\\n\\t\\tif ( selector === false || typeof selector === \\\"function\\\" ) {\\n\\n\\t\\t\\t// ( types [, fn] )\\n\\t\\t\\tfn = selector;\\n\\t\\t\\tselector = undefined;\\n\\t\\t}\\n\\t\\tif ( fn === false ) {\\n\\t\\t\\tfn = returnFalse;\\n\\t\\t}\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.event.remove( this, types, fn, selector );\\n\\t\\t} );\\n\\t}\\n} );\\n\\n\\nvar\\n\\n\\t/* eslint-disable max-len */\\n\\n\\t// See https://github.com/eslint/eslint/issues/3229\\n\\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\\\/\\\\0>\\\\x20\\\\t\\\\r\\\\n\\\\f]*)[^>]*)\\\\/>/gi,\\n\\n\\t/* eslint-enable */\\n\\n\\t// Support: IE <=10 - 11, Edge 12 - 13\\n\\t// In IE/Edge using regex groups here causes severe slowdowns.\\n\\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\\n\\trnoInnerhtml = /\\\\s*$/g;\\n\\nfunction manipulationTarget( elem, content ) {\\n\\tif ( jQuery.nodeName( elem, \\\"table\\\" ) &&\\n\\t\\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \\\"tr\\\" ) ) {\\n\\n\\t\\treturn elem.getElementsByTagName( \\\"tbody\\\" )[ 0 ] || elem;\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\n// Replace/restore the type attribute of script elements for safe DOM manipulation\\nfunction disableScript( elem ) {\\n\\telem.type = ( elem.getAttribute( \\\"type\\\" ) !== null ) + \\\"/\\\" + elem.type;\\n\\treturn elem;\\n}\\nfunction restoreScript( elem ) {\\n\\tvar match = rscriptTypeMasked.exec( elem.type );\\n\\n\\tif ( match ) {\\n\\t\\telem.type = match[ 1 ];\\n\\t} else {\\n\\t\\telem.removeAttribute( \\\"type\\\" );\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\nfunction cloneCopyEvent( src, dest ) {\\n\\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\\n\\n\\tif ( dest.nodeType !== 1 ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// 1. Copy private data: events, handlers, etc.\\n\\tif ( dataPriv.hasData( src ) ) {\\n\\t\\tpdataOld = dataPriv.access( src );\\n\\t\\tpdataCur = dataPriv.set( dest, pdataOld );\\n\\t\\tevents = pdataOld.events;\\n\\n\\t\\tif ( events ) {\\n\\t\\t\\tdelete pdataCur.handle;\\n\\t\\t\\tpdataCur.events = {};\\n\\n\\t\\t\\tfor ( type in events ) {\\n\\t\\t\\t\\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\\n\\t\\t\\t\\t\\tjQuery.event.add( dest, type, events[ type ][ i ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// 2. Copy user data\\n\\tif ( dataUser.hasData( src ) ) {\\n\\t\\tudataOld = dataUser.access( src );\\n\\t\\tudataCur = jQuery.extend( {}, udataOld );\\n\\n\\t\\tdataUser.set( dest, udataCur );\\n\\t}\\n}\\n\\n// Fix IE bugs, see support tests\\nfunction fixInput( src, dest ) {\\n\\tvar nodeName = dest.nodeName.toLowerCase();\\n\\n\\t// Fails to persist the checked state of a cloned checkbox or radio button.\\n\\tif ( nodeName === \\\"input\\\" && rcheckableType.test( src.type ) ) {\\n\\t\\tdest.checked = src.checked;\\n\\n\\t// Fails to return the selected option to the default selected state when cloning options\\n\\t} else if ( nodeName === \\\"input\\\" || nodeName === \\\"textarea\\\" ) {\\n\\t\\tdest.defaultValue = src.defaultValue;\\n\\t}\\n}\\n\\nfunction domManip( collection, args, callback, ignored ) {\\n\\n\\t// Flatten any nested arrays\\n\\targs = concat.apply( [], args );\\n\\n\\tvar fragment, first, scripts, hasScripts, node, doc,\\n\\t\\ti = 0,\\n\\t\\tl = collection.length,\\n\\t\\tiNoClone = l - 1,\\n\\t\\tvalue = args[ 0 ],\\n\\t\\tisFunction = jQuery.isFunction( value );\\n\\n\\t// We can't cloneNode fragments that contain checked, in WebKit\\n\\tif ( isFunction ||\\n\\t\\t\\t( l > 1 && typeof value === \\\"string\\\" &&\\n\\t\\t\\t\\t!support.checkClone && rchecked.test( value ) ) ) {\\n\\t\\treturn collection.each( function( index ) {\\n\\t\\t\\tvar self = collection.eq( index );\\n\\t\\t\\tif ( isFunction ) {\\n\\t\\t\\t\\targs[ 0 ] = value.call( this, index, self.html() );\\n\\t\\t\\t}\\n\\t\\t\\tdomManip( self, args, callback, ignored );\\n\\t\\t} );\\n\\t}\\n\\n\\tif ( l ) {\\n\\t\\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\\n\\t\\tfirst = fragment.firstChild;\\n\\n\\t\\tif ( fragment.childNodes.length === 1 ) {\\n\\t\\t\\tfragment = first;\\n\\t\\t}\\n\\n\\t\\t// Require either new content or an interest in ignored elements to invoke the callback\\n\\t\\tif ( first || ignored ) {\\n\\t\\t\\tscripts = jQuery.map( getAll( fragment, \\\"script\\\" ), disableScript );\\n\\t\\t\\thasScripts = scripts.length;\\n\\n\\t\\t\\t// Use the original fragment for the last item\\n\\t\\t\\t// instead of the first because it can end up\\n\\t\\t\\t// being emptied incorrectly in certain situations (#8070).\\n\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\tnode = fragment;\\n\\n\\t\\t\\t\\tif ( i !== iNoClone ) {\\n\\t\\t\\t\\t\\tnode = jQuery.clone( node, true, true );\\n\\n\\t\\t\\t\\t\\t// Keep references to cloned scripts for later restoration\\n\\t\\t\\t\\t\\tif ( hasScripts ) {\\n\\n\\t\\t\\t\\t\\t\\t// Support: Android <=4.0 only, PhantomJS 1 only\\n\\t\\t\\t\\t\\t\\t// push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\t\\t\\t\\tjQuery.merge( scripts, getAll( node, \\\"script\\\" ) );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tcallback.call( collection[ i ], node, i );\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( hasScripts ) {\\n\\t\\t\\t\\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\\n\\n\\t\\t\\t\\t// Reenable scripts\\n\\t\\t\\t\\tjQuery.map( scripts, restoreScript );\\n\\n\\t\\t\\t\\t// Evaluate executable scripts on first document insertion\\n\\t\\t\\t\\tfor ( i = 0; i < hasScripts; i++ ) {\\n\\t\\t\\t\\t\\tnode = scripts[ i ];\\n\\t\\t\\t\\t\\tif ( rscriptType.test( node.type || \\\"\\\" ) &&\\n\\t\\t\\t\\t\\t\\t!dataPriv.access( node, \\\"globalEval\\\" ) &&\\n\\t\\t\\t\\t\\t\\tjQuery.contains( doc, node ) ) {\\n\\n\\t\\t\\t\\t\\t\\tif ( node.src ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Optional AJAX dependency, but won't run scripts if not present\\n\\t\\t\\t\\t\\t\\t\\tif ( jQuery._evalUrl ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery._evalUrl( node.src );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tDOMEval( node.textContent.replace( rcleanScript, \\\"\\\" ), doc );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn collection;\\n}\\n\\nfunction remove( elem, selector, keepData ) {\\n\\tvar node,\\n\\t\\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\\n\\t\\ti = 0;\\n\\n\\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\\n\\t\\tif ( !keepData && node.nodeType === 1 ) {\\n\\t\\t\\tjQuery.cleanData( getAll( node ) );\\n\\t\\t}\\n\\n\\t\\tif ( node.parentNode ) {\\n\\t\\t\\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\\n\\t\\t\\t\\tsetGlobalEval( getAll( node, \\\"script\\\" ) );\\n\\t\\t\\t}\\n\\t\\t\\tnode.parentNode.removeChild( node );\\n\\t\\t}\\n\\t}\\n\\n\\treturn elem;\\n}\\n\\njQuery.extend( {\\n\\thtmlPrefilter: function( html ) {\\n\\t\\treturn html.replace( rxhtmlTag, \\\"<$1>\\\" );\\n\\t},\\n\\n\\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\\n\\t\\tvar i, l, srcElements, destElements,\\n\\t\\t\\tclone = elem.cloneNode( true ),\\n\\t\\t\\tinPage = jQuery.contains( elem.ownerDocument, elem );\\n\\n\\t\\t// Fix IE cloning issues\\n\\t\\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\\n\\t\\t\\t\\t!jQuery.isXMLDoc( elem ) ) {\\n\\n\\t\\t\\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\\n\\t\\t\\tdestElements = getAll( clone );\\n\\t\\t\\tsrcElements = getAll( elem );\\n\\n\\t\\t\\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\\n\\t\\t\\t\\tfixInput( srcElements[ i ], destElements[ i ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Copy the events from the original to the clone\\n\\t\\tif ( dataAndEvents ) {\\n\\t\\t\\tif ( deepDataAndEvents ) {\\n\\t\\t\\t\\tsrcElements = srcElements || getAll( elem );\\n\\t\\t\\t\\tdestElements = destElements || getAll( clone );\\n\\n\\t\\t\\t\\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\\n\\t\\t\\t\\t\\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tcloneCopyEvent( elem, clone );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Preserve script evaluation history\\n\\t\\tdestElements = getAll( clone, \\\"script\\\" );\\n\\t\\tif ( destElements.length > 0 ) {\\n\\t\\t\\tsetGlobalEval( destElements, !inPage && getAll( elem, \\\"script\\\" ) );\\n\\t\\t}\\n\\n\\t\\t// Return the cloned set\\n\\t\\treturn clone;\\n\\t},\\n\\n\\tcleanData: function( elems ) {\\n\\t\\tvar data, elem, type,\\n\\t\\t\\tspecial = jQuery.event.special,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\\n\\t\\t\\tif ( acceptData( elem ) ) {\\n\\t\\t\\t\\tif ( ( data = elem[ dataPriv.expando ] ) ) {\\n\\t\\t\\t\\t\\tif ( data.events ) {\\n\\t\\t\\t\\t\\t\\tfor ( type in data.events ) {\\n\\t\\t\\t\\t\\t\\t\\tif ( special[ type ] ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.event.remove( elem, type );\\n\\n\\t\\t\\t\\t\\t\\t\\t// This is a shortcut to avoid jQuery.event.remove's overhead\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tjQuery.removeEvent( elem, type, data.handle );\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Support: Chrome <=35 - 45+\\n\\t\\t\\t\\t\\t// Assign undefined instead of using delete, see Data#remove\\n\\t\\t\\t\\t\\telem[ dataPriv.expando ] = undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif ( elem[ dataUser.expando ] ) {\\n\\n\\t\\t\\t\\t\\t// Support: Chrome <=35 - 45+\\n\\t\\t\\t\\t\\t// Assign undefined instead of using delete, see Data#remove\\n\\t\\t\\t\\t\\telem[ dataUser.expando ] = undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tdetach: function( selector ) {\\n\\t\\treturn remove( this, selector, true );\\n\\t},\\n\\n\\tremove: function( selector ) {\\n\\t\\treturn remove( this, selector );\\n\\t},\\n\\n\\ttext: function( value ) {\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\treturn value === undefined ?\\n\\t\\t\\t\\tjQuery.text( this ) :\\n\\t\\t\\t\\tthis.empty().each( function() {\\n\\t\\t\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\t\\t\\tthis.textContent = value;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} );\\n\\t\\t}, null, value, arguments.length );\\n\\t},\\n\\n\\tappend: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\tvar target = manipulationTarget( this, elem );\\n\\t\\t\\t\\ttarget.appendChild( elem );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tprepend: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\\n\\t\\t\\t\\tvar target = manipulationTarget( this, elem );\\n\\t\\t\\t\\ttarget.insertBefore( elem, target.firstChild );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tbefore: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.parentNode ) {\\n\\t\\t\\t\\tthis.parentNode.insertBefore( elem, this );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tafter: function() {\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tif ( this.parentNode ) {\\n\\t\\t\\t\\tthis.parentNode.insertBefore( elem, this.nextSibling );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\tempty: function() {\\n\\t\\tvar elem,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\\n\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\n\\t\\t\\t\\t// Prevent memory leaks\\n\\t\\t\\t\\tjQuery.cleanData( getAll( elem, false ) );\\n\\n\\t\\t\\t\\t// Remove any remaining nodes\\n\\t\\t\\t\\telem.textContent = \\\"\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\tclone: function( dataAndEvents, deepDataAndEvents ) {\\n\\t\\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\\n\\t\\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\\n\\n\\t\\treturn this.map( function() {\\n\\t\\t\\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\\n\\t\\t} );\\n\\t},\\n\\n\\thtml: function( value ) {\\n\\t\\treturn access( this, function( value ) {\\n\\t\\t\\tvar elem = this[ 0 ] || {},\\n\\t\\t\\t\\ti = 0,\\n\\t\\t\\t\\tl = this.length;\\n\\n\\t\\t\\tif ( value === undefined && elem.nodeType === 1 ) {\\n\\t\\t\\t\\treturn elem.innerHTML;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// See if we can take a shortcut and just use innerHTML\\n\\t\\t\\tif ( typeof value === \\\"string\\\" && !rnoInnerhtml.test( value ) &&\\n\\t\\t\\t\\t!wrapMap[ ( rtagName.exec( value ) || [ \\\"\\\", \\\"\\\" ] )[ 1 ].toLowerCase() ] ) {\\n\\n\\t\\t\\t\\tvalue = jQuery.htmlPrefilter( value );\\n\\n\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\tfor ( ; i < l; i++ ) {\\n\\t\\t\\t\\t\\t\\telem = this[ i ] || {};\\n\\n\\t\\t\\t\\t\\t\\t// Remove element nodes and prevent memory leaks\\n\\t\\t\\t\\t\\t\\tif ( elem.nodeType === 1 ) {\\n\\t\\t\\t\\t\\t\\t\\tjQuery.cleanData( getAll( elem, false ) );\\n\\t\\t\\t\\t\\t\\t\\telem.innerHTML = value;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\telem = 0;\\n\\n\\t\\t\\t\\t// If using innerHTML throws an exception, use the fallback method\\n\\t\\t\\t\\t} catch ( e ) {}\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( elem ) {\\n\\t\\t\\t\\tthis.empty().append( value );\\n\\t\\t\\t}\\n\\t\\t}, null, value, arguments.length );\\n\\t},\\n\\n\\treplaceWith: function() {\\n\\t\\tvar ignored = [];\\n\\n\\t\\t// Make the changes, replacing each non-ignored context element with the new content\\n\\t\\treturn domManip( this, arguments, function( elem ) {\\n\\t\\t\\tvar parent = this.parentNode;\\n\\n\\t\\t\\tif ( jQuery.inArray( this, ignored ) < 0 ) {\\n\\t\\t\\t\\tjQuery.cleanData( getAll( this ) );\\n\\t\\t\\t\\tif ( parent ) {\\n\\t\\t\\t\\t\\tparent.replaceChild( elem, this );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t// Force callback invocation\\n\\t\\t}, ignored );\\n\\t}\\n} );\\n\\njQuery.each( {\\n\\tappendTo: \\\"append\\\",\\n\\tprependTo: \\\"prepend\\\",\\n\\tinsertBefore: \\\"before\\\",\\n\\tinsertAfter: \\\"after\\\",\\n\\treplaceAll: \\\"replaceWith\\\"\\n}, function( name, original ) {\\n\\tjQuery.fn[ name ] = function( selector ) {\\n\\t\\tvar elems,\\n\\t\\t\\tret = [],\\n\\t\\t\\tinsert = jQuery( selector ),\\n\\t\\t\\tlast = insert.length - 1,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tfor ( ; i <= last; i++ ) {\\n\\t\\t\\telems = i === last ? this : this.clone( true );\\n\\t\\t\\tjQuery( insert[ i ] )[ original ]( elems );\\n\\n\\t\\t\\t// Support: Android <=4.0 only, PhantomJS 1 only\\n\\t\\t\\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\\n\\t\\t\\tpush.apply( ret, elems.get() );\\n\\t\\t}\\n\\n\\t\\treturn this.pushStack( ret );\\n\\t};\\n} );\\nvar rmargin = ( /^margin/ );\\n\\nvar rnumnonpx = new RegExp( \\\"^(\\\" + pnum + \\\")(?!px)[a-z%]+$\\\", \\\"i\\\" );\\n\\nvar getStyles = function( elem ) {\\n\\n\\t\\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\\n\\t\\t// IE throws on elements created in popups\\n\\t\\t// FF meanwhile throws on frame elements through \\\"defaultView.getComputedStyle\\\"\\n\\t\\tvar view = elem.ownerDocument.defaultView;\\n\\n\\t\\tif ( !view || !view.opener ) {\\n\\t\\t\\tview = window;\\n\\t\\t}\\n\\n\\t\\treturn view.getComputedStyle( elem );\\n\\t};\\n\\n\\n\\n( function() {\\n\\n\\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\\n\\t// so they're executed at the same time to save the second computation.\\n\\tfunction computeStyleTests() {\\n\\n\\t\\t// This is a singleton, we need to execute it only once\\n\\t\\tif ( !div ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tdiv.style.cssText =\\n\\t\\t\\t\\\"box-sizing:border-box;\\\" +\\n\\t\\t\\t\\\"position:relative;display:block;\\\" +\\n\\t\\t\\t\\\"margin:auto;border:1px;padding:1px;\\\" +\\n\\t\\t\\t\\\"top:1%;width:50%\\\";\\n\\t\\tdiv.innerHTML = \\\"\\\";\\n\\t\\tdocumentElement.appendChild( container );\\n\\n\\t\\tvar divStyle = window.getComputedStyle( div );\\n\\t\\tpixelPositionVal = divStyle.top !== \\\"1%\\\";\\n\\n\\t\\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\\n\\t\\treliableMarginLeftVal = divStyle.marginLeft === \\\"2px\\\";\\n\\t\\tboxSizingReliableVal = divStyle.width === \\\"4px\\\";\\n\\n\\t\\t// Support: Android 4.0 - 4.3 only\\n\\t\\t// Some styles come back with percentage values, even though they shouldn't\\n\\t\\tdiv.style.marginRight = \\\"50%\\\";\\n\\t\\tpixelMarginRightVal = divStyle.marginRight === \\\"4px\\\";\\n\\n\\t\\tdocumentElement.removeChild( container );\\n\\n\\t\\t// Nullify the div so it wouldn't be stored in the memory and\\n\\t\\t// it will also be a sign that checks already performed\\n\\t\\tdiv = null;\\n\\t}\\n\\n\\tvar pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,\\n\\t\\tcontainer = document.createElement( \\\"div\\\" ),\\n\\t\\tdiv = document.createElement( \\\"div\\\" );\\n\\n\\t// Finish early in limited (non-browser) environments\\n\\tif ( !div.style ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// Support: IE <=9 - 11 only\\n\\t// Style of cloned element affects source element cloned (#8908)\\n\\tdiv.style.backgroundClip = \\\"content-box\\\";\\n\\tdiv.cloneNode( true ).style.backgroundClip = \\\"\\\";\\n\\tsupport.clearCloneStyle = div.style.backgroundClip === \\\"content-box\\\";\\n\\n\\tcontainer.style.cssText = \\\"border:0;width:8px;height:0;top:0;left:-9999px;\\\" +\\n\\t\\t\\\"padding:0;margin-top:1px;position:absolute\\\";\\n\\tcontainer.appendChild( div );\\n\\n\\tjQuery.extend( support, {\\n\\t\\tpixelPosition: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn pixelPositionVal;\\n\\t\\t},\\n\\t\\tboxSizingReliable: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn boxSizingReliableVal;\\n\\t\\t},\\n\\t\\tpixelMarginRight: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn pixelMarginRightVal;\\n\\t\\t},\\n\\t\\treliableMarginLeft: function() {\\n\\t\\t\\tcomputeStyleTests();\\n\\t\\t\\treturn reliableMarginLeftVal;\\n\\t\\t}\\n\\t} );\\n} )();\\n\\n\\nfunction curCSS( elem, name, computed ) {\\n\\tvar width, minWidth, maxWidth, ret,\\n\\t\\tstyle = elem.style;\\n\\n\\tcomputed = computed || getStyles( elem );\\n\\n\\t// Support: IE <=9 only\\n\\t// getPropertyValue is only needed for .css('filter') (#12537)\\n\\tif ( computed ) {\\n\\t\\tret = computed.getPropertyValue( name ) || computed[ name ];\\n\\n\\t\\tif ( ret === \\\"\\\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\\n\\t\\t\\tret = jQuery.style( elem, name );\\n\\t\\t}\\n\\n\\t\\t// A tribute to the \\\"awesome hack by Dean Edwards\\\"\\n\\t\\t// Android Browser returns percentage for some values,\\n\\t\\t// but width seems to be reliably pixels.\\n\\t\\t// This is against the CSSOM draft spec:\\n\\t\\t// https://drafts.csswg.org/cssom/#resolved-values\\n\\t\\tif ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {\\n\\n\\t\\t\\t// Remember the original values\\n\\t\\t\\twidth = style.width;\\n\\t\\t\\tminWidth = style.minWidth;\\n\\t\\t\\tmaxWidth = style.maxWidth;\\n\\n\\t\\t\\t// Put in the new values to get a computed value out\\n\\t\\t\\tstyle.minWidth = style.maxWidth = style.width = ret;\\n\\t\\t\\tret = computed.width;\\n\\n\\t\\t\\t// Revert the changed values\\n\\t\\t\\tstyle.width = width;\\n\\t\\t\\tstyle.minWidth = minWidth;\\n\\t\\t\\tstyle.maxWidth = maxWidth;\\n\\t\\t}\\n\\t}\\n\\n\\treturn ret !== undefined ?\\n\\n\\t\\t// Support: IE <=9 - 11 only\\n\\t\\t// IE returns zIndex value as an integer.\\n\\t\\tret + \\\"\\\" :\\n\\t\\tret;\\n}\\n\\n\\nfunction addGetHookIf( conditionFn, hookFn ) {\\n\\n\\t// Define the hook, we'll check on the first run if it's really needed.\\n\\treturn {\\n\\t\\tget: function() {\\n\\t\\t\\tif ( conditionFn() ) {\\n\\n\\t\\t\\t\\t// Hook not needed (or it's not possible to use it due\\n\\t\\t\\t\\t// to missing dependency), remove it.\\n\\t\\t\\t\\tdelete this.get;\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Hook needed; redefine it so that the support test is not executed again.\\n\\t\\t\\treturn ( this.get = hookFn ).apply( this, arguments );\\n\\t\\t}\\n\\t};\\n}\\n\\n\\nvar\\n\\n\\t// Swappable if display is none or starts with table\\n\\t// except \\\"table\\\", \\\"table-cell\\\", or \\\"table-caption\\\"\\n\\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\\n\\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\\n\\tcssShow = { position: \\\"absolute\\\", visibility: \\\"hidden\\\", display: \\\"block\\\" },\\n\\tcssNormalTransform = {\\n\\t\\tletterSpacing: \\\"0\\\",\\n\\t\\tfontWeight: \\\"400\\\"\\n\\t},\\n\\n\\tcssPrefixes = [ \\\"Webkit\\\", \\\"Moz\\\", \\\"ms\\\" ],\\n\\temptyStyle = document.createElement( \\\"div\\\" ).style;\\n\\n// Return a css property mapped to a potentially vendor prefixed property\\nfunction vendorPropName( name ) {\\n\\n\\t// Shortcut for names that are not vendor prefixed\\n\\tif ( name in emptyStyle ) {\\n\\t\\treturn name;\\n\\t}\\n\\n\\t// Check for vendor prefixed names\\n\\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\\n\\t\\ti = cssPrefixes.length;\\n\\n\\twhile ( i-- ) {\\n\\t\\tname = cssPrefixes[ i ] + capName;\\n\\t\\tif ( name in emptyStyle ) {\\n\\t\\t\\treturn name;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction setPositiveNumber( elem, value, subtract ) {\\n\\n\\t// Any relative (+/-) values have already been\\n\\t// normalized at this point\\n\\tvar matches = rcssNum.exec( value );\\n\\treturn matches ?\\n\\n\\t\\t// Guard against undefined \\\"subtract\\\", e.g., when used as in cssHooks\\n\\t\\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \\\"px\\\" ) :\\n\\t\\tvalue;\\n}\\n\\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\\n\\tvar i,\\n\\t\\tval = 0;\\n\\n\\t// If we already have the right measurement, avoid augmentation\\n\\tif ( extra === ( isBorderBox ? \\\"border\\\" : \\\"content\\\" ) ) {\\n\\t\\ti = 4;\\n\\n\\t// Otherwise initialize for horizontal or vertical properties\\n\\t} else {\\n\\t\\ti = name === \\\"width\\\" ? 1 : 0;\\n\\t}\\n\\n\\tfor ( ; i < 4; i += 2 ) {\\n\\n\\t\\t// Both box models exclude margin, so add it if we want it\\n\\t\\tif ( extra === \\\"margin\\\" ) {\\n\\t\\t\\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\\n\\t\\t}\\n\\n\\t\\tif ( isBorderBox ) {\\n\\n\\t\\t\\t// border-box includes padding, so remove it if we want content\\n\\t\\t\\tif ( extra === \\\"content\\\" ) {\\n\\t\\t\\t\\tval -= jQuery.css( elem, \\\"padding\\\" + cssExpand[ i ], true, styles );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// At this point, extra isn't border nor margin, so remove border\\n\\t\\t\\tif ( extra !== \\\"margin\\\" ) {\\n\\t\\t\\t\\tval -= jQuery.css( elem, \\\"border\\\" + cssExpand[ i ] + \\\"Width\\\", true, styles );\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\n\\t\\t\\t// At this point, extra isn't content, so add padding\\n\\t\\t\\tval += jQuery.css( elem, \\\"padding\\\" + cssExpand[ i ], true, styles );\\n\\n\\t\\t\\t// At this point, extra isn't content nor padding, so add border\\n\\t\\t\\tif ( extra !== \\\"padding\\\" ) {\\n\\t\\t\\t\\tval += jQuery.css( elem, \\\"border\\\" + cssExpand[ i ] + \\\"Width\\\", true, styles );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn val;\\n}\\n\\nfunction getWidthOrHeight( elem, name, extra ) {\\n\\n\\t// Start with offset property, which is equivalent to the border-box value\\n\\tvar val,\\n\\t\\tvalueIsBorderBox = true,\\n\\t\\tstyles = getStyles( elem ),\\n\\t\\tisBorderBox = jQuery.css( elem, \\\"boxSizing\\\", false, styles ) === \\\"border-box\\\";\\n\\n\\t// Support: IE <=11 only\\n\\t// Running getBoundingClientRect on a disconnected node\\n\\t// in IE throws an error.\\n\\tif ( elem.getClientRects().length ) {\\n\\t\\tval = elem.getBoundingClientRect()[ name ];\\n\\t}\\n\\n\\t// Some non-html elements return undefined for offsetWidth, so check for null/undefined\\n\\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\\n\\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\\n\\tif ( val <= 0 || val == null ) {\\n\\n\\t\\t// Fall back to computed then uncomputed css if necessary\\n\\t\\tval = curCSS( elem, name, styles );\\n\\t\\tif ( val < 0 || val == null ) {\\n\\t\\t\\tval = elem.style[ name ];\\n\\t\\t}\\n\\n\\t\\t// Computed unit is not pixels. Stop here and return.\\n\\t\\tif ( rnumnonpx.test( val ) ) {\\n\\t\\t\\treturn val;\\n\\t\\t}\\n\\n\\t\\t// Check for style in case a browser which returns unreliable values\\n\\t\\t// for getComputedStyle silently falls back to the reliable elem.style\\n\\t\\tvalueIsBorderBox = isBorderBox &&\\n\\t\\t\\t( support.boxSizingReliable() || val === elem.style[ name ] );\\n\\n\\t\\t// Normalize \\\"\\\", auto, and prepare for extra\\n\\t\\tval = parseFloat( val ) || 0;\\n\\t}\\n\\n\\t// Use the active box-sizing model to add/subtract irrelevant styles\\n\\treturn ( val +\\n\\t\\taugmentWidthOrHeight(\\n\\t\\t\\telem,\\n\\t\\t\\tname,\\n\\t\\t\\textra || ( isBorderBox ? \\\"border\\\" : \\\"content\\\" ),\\n\\t\\t\\tvalueIsBorderBox,\\n\\t\\t\\tstyles\\n\\t\\t)\\n\\t) + \\\"px\\\";\\n}\\n\\njQuery.extend( {\\n\\n\\t// Add in style property hooks for overriding the default\\n\\t// behavior of getting and setting a style property\\n\\tcssHooks: {\\n\\t\\topacity: {\\n\\t\\t\\tget: function( elem, computed ) {\\n\\t\\t\\t\\tif ( computed ) {\\n\\n\\t\\t\\t\\t\\t// We should always get a number back from opacity\\n\\t\\t\\t\\t\\tvar ret = curCSS( elem, \\\"opacity\\\" );\\n\\t\\t\\t\\t\\treturn ret === \\\"\\\" ? \\\"1\\\" : ret;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\t// Don't automatically add \\\"px\\\" to these possibly-unitless properties\\n\\tcssNumber: {\\n\\t\\t\\\"animationIterationCount\\\": true,\\n\\t\\t\\\"columnCount\\\": true,\\n\\t\\t\\\"fillOpacity\\\": true,\\n\\t\\t\\\"flexGrow\\\": true,\\n\\t\\t\\\"flexShrink\\\": true,\\n\\t\\t\\\"fontWeight\\\": true,\\n\\t\\t\\\"lineHeight\\\": true,\\n\\t\\t\\\"opacity\\\": true,\\n\\t\\t\\\"order\\\": true,\\n\\t\\t\\\"orphans\\\": true,\\n\\t\\t\\\"widows\\\": true,\\n\\t\\t\\\"zIndex\\\": true,\\n\\t\\t\\\"zoom\\\": true\\n\\t},\\n\\n\\t// Add in properties whose names you wish to fix before\\n\\t// setting or getting the value\\n\\tcssProps: {\\n\\t\\t\\\"float\\\": \\\"cssFloat\\\"\\n\\t},\\n\\n\\t// Get and set the style property on a DOM Node\\n\\tstyle: function( elem, name, value, extra ) {\\n\\n\\t\\t// Don't set styles on text and comment nodes\\n\\t\\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Make sure that we're working with the right name\\n\\t\\tvar ret, type, hooks,\\n\\t\\t\\torigName = jQuery.camelCase( name ),\\n\\t\\t\\tstyle = elem.style;\\n\\n\\t\\tname = jQuery.cssProps[ origName ] ||\\n\\t\\t\\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\\n\\n\\t\\t// Gets hook for the prefixed version, then unprefixed version\\n\\t\\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\\n\\n\\t\\t// Check if we're setting a value\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\ttype = typeof value;\\n\\n\\t\\t\\t// Convert \\\"+=\\\" or \\\"-=\\\" to relative numbers (#7345)\\n\\t\\t\\tif ( type === \\\"string\\\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\\n\\t\\t\\t\\tvalue = adjustCSS( elem, name, ret );\\n\\n\\t\\t\\t\\t// Fixes bug #9237\\n\\t\\t\\t\\ttype = \\\"number\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Make sure that null and NaN values aren't set (#7116)\\n\\t\\t\\tif ( value == null || value !== value ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If a number was passed in, add the unit (except for certain CSS properties)\\n\\t\\t\\tif ( type === \\\"number\\\" ) {\\n\\t\\t\\t\\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \\\"\\\" : \\\"px\\\" );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// background-* props affect original clone's values\\n\\t\\t\\tif ( !support.clearCloneStyle && value === \\\"\\\" && name.indexOf( \\\"background\\\" ) === 0 ) {\\n\\t\\t\\t\\tstyle[ name ] = \\\"inherit\\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If a hook was provided, use that value, otherwise just set the specified value\\n\\t\\t\\tif ( !hooks || !( \\\"set\\\" in hooks ) ||\\n\\t\\t\\t\\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\\n\\n\\t\\t\\t\\tstyle[ name ] = value;\\n\\t\\t\\t}\\n\\n\\t\\t} else {\\n\\n\\t\\t\\t// If a hook was provided get the non-computed value from there\\n\\t\\t\\tif ( hooks && \\\"get\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\\n\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Otherwise just get the value from the style object\\n\\t\\t\\treturn style[ name ];\\n\\t\\t}\\n\\t},\\n\\n\\tcss: function( elem, name, extra, styles ) {\\n\\t\\tvar val, num, hooks,\\n\\t\\t\\torigName = jQuery.camelCase( name );\\n\\n\\t\\t// Make sure that we're working with the right name\\n\\t\\tname = jQuery.cssProps[ origName ] ||\\n\\t\\t\\t( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );\\n\\n\\t\\t// Try prefixed name followed by the unprefixed name\\n\\t\\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\\n\\n\\t\\t// If a hook was provided get the computed value from there\\n\\t\\tif ( hooks && \\\"get\\\" in hooks ) {\\n\\t\\t\\tval = hooks.get( elem, true, extra );\\n\\t\\t}\\n\\n\\t\\t// Otherwise, if a way to get the computed value exists, use that\\n\\t\\tif ( val === undefined ) {\\n\\t\\t\\tval = curCSS( elem, name, styles );\\n\\t\\t}\\n\\n\\t\\t// Convert \\\"normal\\\" to computed value\\n\\t\\tif ( val === \\\"normal\\\" && name in cssNormalTransform ) {\\n\\t\\t\\tval = cssNormalTransform[ name ];\\n\\t\\t}\\n\\n\\t\\t// Make numeric if forced or a qualifier was provided and val looks numeric\\n\\t\\tif ( extra === \\\"\\\" || extra ) {\\n\\t\\t\\tnum = parseFloat( val );\\n\\t\\t\\treturn extra === true || isFinite( num ) ? num || 0 : val;\\n\\t\\t}\\n\\t\\treturn val;\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"height\\\", \\\"width\\\" ], function( i, name ) {\\n\\tjQuery.cssHooks[ name ] = {\\n\\t\\tget: function( elem, computed, extra ) {\\n\\t\\t\\tif ( computed ) {\\n\\n\\t\\t\\t\\t// Certain elements can have dimension info if we invisibly show them\\n\\t\\t\\t\\t// but it must have a current display style that would benefit\\n\\t\\t\\t\\treturn rdisplayswap.test( jQuery.css( elem, \\\"display\\\" ) ) &&\\n\\n\\t\\t\\t\\t\\t// Support: Safari 8+\\n\\t\\t\\t\\t\\t// Table columns in Safari have non-zero offsetWidth & zero\\n\\t\\t\\t\\t\\t// getBoundingClientRect().width unless display is changed.\\n\\t\\t\\t\\t\\t// Support: IE <=11 only\\n\\t\\t\\t\\t\\t// Running getBoundingClientRect on a disconnected node\\n\\t\\t\\t\\t\\t// in IE throws an error.\\n\\t\\t\\t\\t\\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\\n\\t\\t\\t\\t\\t\\tswap( elem, cssShow, function() {\\n\\t\\t\\t\\t\\t\\t\\treturn getWidthOrHeight( elem, name, extra );\\n\\t\\t\\t\\t\\t\\t} ) :\\n\\t\\t\\t\\t\\t\\tgetWidthOrHeight( elem, name, extra );\\n\\t\\t\\t}\\n\\t\\t},\\n\\n\\t\\tset: function( elem, value, extra ) {\\n\\t\\t\\tvar matches,\\n\\t\\t\\t\\tstyles = extra && getStyles( elem ),\\n\\t\\t\\t\\tsubtract = extra && augmentWidthOrHeight(\\n\\t\\t\\t\\t\\telem,\\n\\t\\t\\t\\t\\tname,\\n\\t\\t\\t\\t\\textra,\\n\\t\\t\\t\\t\\tjQuery.css( elem, \\\"boxSizing\\\", false, styles ) === \\\"border-box\\\",\\n\\t\\t\\t\\t\\tstyles\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t// Convert to pixels if value adjustment is needed\\n\\t\\t\\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\\n\\t\\t\\t\\t( matches[ 3 ] || \\\"px\\\" ) !== \\\"px\\\" ) {\\n\\n\\t\\t\\t\\telem.style[ name ] = value;\\n\\t\\t\\t\\tvalue = jQuery.css( elem, name );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn setPositiveNumber( elem, value, subtract );\\n\\t\\t}\\n\\t};\\n} );\\n\\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\\n\\tfunction( elem, computed ) {\\n\\t\\tif ( computed ) {\\n\\t\\t\\treturn ( parseFloat( curCSS( elem, \\\"marginLeft\\\" ) ) ||\\n\\t\\t\\t\\telem.getBoundingClientRect().left -\\n\\t\\t\\t\\t\\tswap( elem, { marginLeft: 0 }, function() {\\n\\t\\t\\t\\t\\t\\treturn elem.getBoundingClientRect().left;\\n\\t\\t\\t\\t\\t} )\\n\\t\\t\\t\\t) + \\\"px\\\";\\n\\t\\t}\\n\\t}\\n);\\n\\n// These hooks are used by animate to expand properties\\njQuery.each( {\\n\\tmargin: \\\"\\\",\\n\\tpadding: \\\"\\\",\\n\\tborder: \\\"Width\\\"\\n}, function( prefix, suffix ) {\\n\\tjQuery.cssHooks[ prefix + suffix ] = {\\n\\t\\texpand: function( value ) {\\n\\t\\t\\tvar i = 0,\\n\\t\\t\\t\\texpanded = {},\\n\\n\\t\\t\\t\\t// Assumes a single number if not a string\\n\\t\\t\\t\\tparts = typeof value === \\\"string\\\" ? value.split( \\\" \\\" ) : [ value ];\\n\\n\\t\\t\\tfor ( ; i < 4; i++ ) {\\n\\t\\t\\t\\texpanded[ prefix + cssExpand[ i ] + suffix ] =\\n\\t\\t\\t\\t\\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn expanded;\\n\\t\\t}\\n\\t};\\n\\n\\tif ( !rmargin.test( prefix ) ) {\\n\\t\\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\\n\\t}\\n} );\\n\\njQuery.fn.extend( {\\n\\tcss: function( name, value ) {\\n\\t\\treturn access( this, function( elem, name, value ) {\\n\\t\\t\\tvar styles, len,\\n\\t\\t\\t\\tmap = {},\\n\\t\\t\\t\\ti = 0;\\n\\n\\t\\t\\tif ( jQuery.isArray( name ) ) {\\n\\t\\t\\t\\tstyles = getStyles( elem );\\n\\t\\t\\t\\tlen = name.length;\\n\\n\\t\\t\\t\\tfor ( ; i < len; i++ ) {\\n\\t\\t\\t\\t\\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn map;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn value !== undefined ?\\n\\t\\t\\t\\tjQuery.style( elem, name, value ) :\\n\\t\\t\\t\\tjQuery.css( elem, name );\\n\\t\\t}, name, value, arguments.length > 1 );\\n\\t}\\n} );\\n\\n\\nfunction Tween( elem, options, prop, end, easing ) {\\n\\treturn new Tween.prototype.init( elem, options, prop, end, easing );\\n}\\njQuery.Tween = Tween;\\n\\nTween.prototype = {\\n\\tconstructor: Tween,\\n\\tinit: function( elem, options, prop, end, easing, unit ) {\\n\\t\\tthis.elem = elem;\\n\\t\\tthis.prop = prop;\\n\\t\\tthis.easing = easing || jQuery.easing._default;\\n\\t\\tthis.options = options;\\n\\t\\tthis.start = this.now = this.cur();\\n\\t\\tthis.end = end;\\n\\t\\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \\\"\\\" : \\\"px\\\" );\\n\\t},\\n\\tcur: function() {\\n\\t\\tvar hooks = Tween.propHooks[ this.prop ];\\n\\n\\t\\treturn hooks && hooks.get ?\\n\\t\\t\\thooks.get( this ) :\\n\\t\\t\\tTween.propHooks._default.get( this );\\n\\t},\\n\\trun: function( percent ) {\\n\\t\\tvar eased,\\n\\t\\t\\thooks = Tween.propHooks[ this.prop ];\\n\\n\\t\\tif ( this.options.duration ) {\\n\\t\\t\\tthis.pos = eased = jQuery.easing[ this.easing ](\\n\\t\\t\\t\\tpercent, this.options.duration * percent, 0, 1, this.options.duration\\n\\t\\t\\t);\\n\\t\\t} else {\\n\\t\\t\\tthis.pos = eased = percent;\\n\\t\\t}\\n\\t\\tthis.now = ( this.end - this.start ) * eased + this.start;\\n\\n\\t\\tif ( this.options.step ) {\\n\\t\\t\\tthis.options.step.call( this.elem, this.now, this );\\n\\t\\t}\\n\\n\\t\\tif ( hooks && hooks.set ) {\\n\\t\\t\\thooks.set( this );\\n\\t\\t} else {\\n\\t\\t\\tTween.propHooks._default.set( this );\\n\\t\\t}\\n\\t\\treturn this;\\n\\t}\\n};\\n\\nTween.prototype.init.prototype = Tween.prototype;\\n\\nTween.propHooks = {\\n\\t_default: {\\n\\t\\tget: function( tween ) {\\n\\t\\t\\tvar result;\\n\\n\\t\\t\\t// Use a property on the element directly when it is not a DOM element,\\n\\t\\t\\t// or when there is no matching style property that exists.\\n\\t\\t\\tif ( tween.elem.nodeType !== 1 ||\\n\\t\\t\\t\\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\\n\\t\\t\\t\\treturn tween.elem[ tween.prop ];\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Passing an empty string as a 3rd parameter to .css will automatically\\n\\t\\t\\t// attempt a parseFloat and fallback to a string if the parse fails.\\n\\t\\t\\t// Simple values such as \\\"10px\\\" are parsed to Float;\\n\\t\\t\\t// complex values such as \\\"rotate(1rad)\\\" are returned as-is.\\n\\t\\t\\tresult = jQuery.css( tween.elem, tween.prop, \\\"\\\" );\\n\\n\\t\\t\\t// Empty strings, null, undefined and \\\"auto\\\" are converted to 0.\\n\\t\\t\\treturn !result || result === \\\"auto\\\" ? 0 : result;\\n\\t\\t},\\n\\t\\tset: function( tween ) {\\n\\n\\t\\t\\t// Use step hook for back compat.\\n\\t\\t\\t// Use cssHook if its there.\\n\\t\\t\\t// Use .style if available and use plain properties where available.\\n\\t\\t\\tif ( jQuery.fx.step[ tween.prop ] ) {\\n\\t\\t\\t\\tjQuery.fx.step[ tween.prop ]( tween );\\n\\t\\t\\t} else if ( tween.elem.nodeType === 1 &&\\n\\t\\t\\t\\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\\n\\t\\t\\t\\t\\tjQuery.cssHooks[ tween.prop ] ) ) {\\n\\t\\t\\t\\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\ttween.elem[ tween.prop ] = tween.now;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\n// Support: IE <=9 only\\n// Panic based approach to setting things on disconnected nodes\\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\\n\\tset: function( tween ) {\\n\\t\\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\\n\\t\\t\\ttween.elem[ tween.prop ] = tween.now;\\n\\t\\t}\\n\\t}\\n};\\n\\njQuery.easing = {\\n\\tlinear: function( p ) {\\n\\t\\treturn p;\\n\\t},\\n\\tswing: function( p ) {\\n\\t\\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\\n\\t},\\n\\t_default: \\\"swing\\\"\\n};\\n\\njQuery.fx = Tween.prototype.init;\\n\\n// Back compat <1.8 extension point\\njQuery.fx.step = {};\\n\\n\\n\\n\\nvar\\n\\tfxNow, timerId,\\n\\trfxtypes = /^(?:toggle|show|hide)$/,\\n\\trrun = /queueHooks$/;\\n\\nfunction raf() {\\n\\tif ( timerId ) {\\n\\t\\twindow.requestAnimationFrame( raf );\\n\\t\\tjQuery.fx.tick();\\n\\t}\\n}\\n\\n// Animations created synchronously will run synchronously\\nfunction createFxNow() {\\n\\twindow.setTimeout( function() {\\n\\t\\tfxNow = undefined;\\n\\t} );\\n\\treturn ( fxNow = jQuery.now() );\\n}\\n\\n// Generate parameters to create a standard animation\\nfunction genFx( type, includeWidth ) {\\n\\tvar which,\\n\\t\\ti = 0,\\n\\t\\tattrs = { height: type };\\n\\n\\t// If we include width, step value is 1 to do all cssExpand values,\\n\\t// otherwise step value is 2 to skip over Left and Right\\n\\tincludeWidth = includeWidth ? 1 : 0;\\n\\tfor ( ; i < 4; i += 2 - includeWidth ) {\\n\\t\\twhich = cssExpand[ i ];\\n\\t\\tattrs[ \\\"margin\\\" + which ] = attrs[ \\\"padding\\\" + which ] = type;\\n\\t}\\n\\n\\tif ( includeWidth ) {\\n\\t\\tattrs.opacity = attrs.width = type;\\n\\t}\\n\\n\\treturn attrs;\\n}\\n\\nfunction createTween( value, prop, animation ) {\\n\\tvar tween,\\n\\t\\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \\\"*\\\" ] ),\\n\\t\\tindex = 0,\\n\\t\\tlength = collection.length;\\n\\tfor ( ; index < length; index++ ) {\\n\\t\\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\\n\\n\\t\\t\\t// We're done with this property\\n\\t\\t\\treturn tween;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction defaultPrefilter( elem, props, opts ) {\\n\\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\\n\\t\\tisBox = \\\"width\\\" in props || \\\"height\\\" in props,\\n\\t\\tanim = this,\\n\\t\\torig = {},\\n\\t\\tstyle = elem.style,\\n\\t\\thidden = elem.nodeType && isHiddenWithinTree( elem ),\\n\\t\\tdataShow = dataPriv.get( elem, \\\"fxshow\\\" );\\n\\n\\t// Queue-skipping animations hijack the fx hooks\\n\\tif ( !opts.queue ) {\\n\\t\\thooks = jQuery._queueHooks( elem, \\\"fx\\\" );\\n\\t\\tif ( hooks.unqueued == null ) {\\n\\t\\t\\thooks.unqueued = 0;\\n\\t\\t\\toldfire = hooks.empty.fire;\\n\\t\\t\\thooks.empty.fire = function() {\\n\\t\\t\\t\\tif ( !hooks.unqueued ) {\\n\\t\\t\\t\\t\\toldfire();\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\t\\t}\\n\\t\\thooks.unqueued++;\\n\\n\\t\\tanim.always( function() {\\n\\n\\t\\t\\t// Ensure the complete handler is called before this completes\\n\\t\\t\\tanim.always( function() {\\n\\t\\t\\t\\thooks.unqueued--;\\n\\t\\t\\t\\tif ( !jQuery.queue( elem, \\\"fx\\\" ).length ) {\\n\\t\\t\\t\\t\\thooks.empty.fire();\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t} );\\n\\t}\\n\\n\\t// Detect show/hide animations\\n\\tfor ( prop in props ) {\\n\\t\\tvalue = props[ prop ];\\n\\t\\tif ( rfxtypes.test( value ) ) {\\n\\t\\t\\tdelete props[ prop ];\\n\\t\\t\\ttoggle = toggle || value === \\\"toggle\\\";\\n\\t\\t\\tif ( value === ( hidden ? \\\"hide\\\" : \\\"show\\\" ) ) {\\n\\n\\t\\t\\t\\t// Pretend to be hidden if this is a \\\"show\\\" and\\n\\t\\t\\t\\t// there is still data from a stopped show/hide\\n\\t\\t\\t\\tif ( value === \\\"show\\\" && dataShow && dataShow[ prop ] !== undefined ) {\\n\\t\\t\\t\\t\\thidden = true;\\n\\n\\t\\t\\t\\t// Ignore all other no-op show/hide data\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\\n\\t\\t}\\n\\t}\\n\\n\\t// Bail out if this is a no-op like .hide().hide()\\n\\tpropTween = !jQuery.isEmptyObject( props );\\n\\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\\n\\t\\treturn;\\n\\t}\\n\\n\\t// Restrict \\\"overflow\\\" and \\\"display\\\" styles during box animations\\n\\tif ( isBox && elem.nodeType === 1 ) {\\n\\n\\t\\t// Support: IE <=9 - 11, Edge 12 - 13\\n\\t\\t// Record all 3 overflow attributes because IE does not infer the shorthand\\n\\t\\t// from identically-valued overflowX and overflowY\\n\\t\\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\\n\\n\\t\\t// Identify a display type, preferring old show/hide data over the CSS cascade\\n\\t\\trestoreDisplay = dataShow && dataShow.display;\\n\\t\\tif ( restoreDisplay == null ) {\\n\\t\\t\\trestoreDisplay = dataPriv.get( elem, \\\"display\\\" );\\n\\t\\t}\\n\\t\\tdisplay = jQuery.css( elem, \\\"display\\\" );\\n\\t\\tif ( display === \\\"none\\\" ) {\\n\\t\\t\\tif ( restoreDisplay ) {\\n\\t\\t\\t\\tdisplay = restoreDisplay;\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Get nonempty value(s) by temporarily forcing visibility\\n\\t\\t\\t\\tshowHide( [ elem ], true );\\n\\t\\t\\t\\trestoreDisplay = elem.style.display || restoreDisplay;\\n\\t\\t\\t\\tdisplay = jQuery.css( elem, \\\"display\\\" );\\n\\t\\t\\t\\tshowHide( [ elem ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Animate inline elements as inline-block\\n\\t\\tif ( display === \\\"inline\\\" || display === \\\"inline-block\\\" && restoreDisplay != null ) {\\n\\t\\t\\tif ( jQuery.css( elem, \\\"float\\\" ) === \\\"none\\\" ) {\\n\\n\\t\\t\\t\\t// Restore the original display value at the end of pure show/hide animations\\n\\t\\t\\t\\tif ( !propTween ) {\\n\\t\\t\\t\\t\\tanim.done( function() {\\n\\t\\t\\t\\t\\t\\tstyle.display = restoreDisplay;\\n\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\tif ( restoreDisplay == null ) {\\n\\t\\t\\t\\t\\t\\tdisplay = style.display;\\n\\t\\t\\t\\t\\t\\trestoreDisplay = display === \\\"none\\\" ? \\\"\\\" : display;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tstyle.display = \\\"inline-block\\\";\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\tif ( opts.overflow ) {\\n\\t\\tstyle.overflow = \\\"hidden\\\";\\n\\t\\tanim.always( function() {\\n\\t\\t\\tstyle.overflow = opts.overflow[ 0 ];\\n\\t\\t\\tstyle.overflowX = opts.overflow[ 1 ];\\n\\t\\t\\tstyle.overflowY = opts.overflow[ 2 ];\\n\\t\\t} );\\n\\t}\\n\\n\\t// Implement show/hide animations\\n\\tpropTween = false;\\n\\tfor ( prop in orig ) {\\n\\n\\t\\t// General show/hide setup for this element animation\\n\\t\\tif ( !propTween ) {\\n\\t\\t\\tif ( dataShow ) {\\n\\t\\t\\t\\tif ( \\\"hidden\\\" in dataShow ) {\\n\\t\\t\\t\\t\\thidden = dataShow.hidden;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdataShow = dataPriv.access( elem, \\\"fxshow\\\", { display: restoreDisplay } );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Store hidden/visible for toggle so `.stop().toggle()` \\\"reverses\\\"\\n\\t\\t\\tif ( toggle ) {\\n\\t\\t\\t\\tdataShow.hidden = !hidden;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Show elements before animating them\\n\\t\\t\\tif ( hidden ) {\\n\\t\\t\\t\\tshowHide( [ elem ], true );\\n\\t\\t\\t}\\n\\n\\t\\t\\t/* eslint-disable no-loop-func */\\n\\n\\t\\t\\tanim.done( function() {\\n\\n\\t\\t\\t/* eslint-enable no-loop-func */\\n\\n\\t\\t\\t\\t// The final step of a \\\"hide\\\" animation is actually hiding the element\\n\\t\\t\\t\\tif ( !hidden ) {\\n\\t\\t\\t\\t\\tshowHide( [ elem ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdataPriv.remove( elem, \\\"fxshow\\\" );\\n\\t\\t\\t\\tfor ( prop in orig ) {\\n\\t\\t\\t\\t\\tjQuery.style( elem, prop, orig[ prop ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\t// Per-property setup\\n\\t\\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\\n\\t\\tif ( !( prop in dataShow ) ) {\\n\\t\\t\\tdataShow[ prop ] = propTween.start;\\n\\t\\t\\tif ( hidden ) {\\n\\t\\t\\t\\tpropTween.end = propTween.start;\\n\\t\\t\\t\\tpropTween.start = 0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction propFilter( props, specialEasing ) {\\n\\tvar index, name, easing, value, hooks;\\n\\n\\t// camelCase, specialEasing and expand cssHook pass\\n\\tfor ( index in props ) {\\n\\t\\tname = jQuery.camelCase( index );\\n\\t\\teasing = specialEasing[ name ];\\n\\t\\tvalue = props[ index ];\\n\\t\\tif ( jQuery.isArray( value ) ) {\\n\\t\\t\\teasing = value[ 1 ];\\n\\t\\t\\tvalue = props[ index ] = value[ 0 ];\\n\\t\\t}\\n\\n\\t\\tif ( index !== name ) {\\n\\t\\t\\tprops[ name ] = value;\\n\\t\\t\\tdelete props[ index ];\\n\\t\\t}\\n\\n\\t\\thooks = jQuery.cssHooks[ name ];\\n\\t\\tif ( hooks && \\\"expand\\\" in hooks ) {\\n\\t\\t\\tvalue = hooks.expand( value );\\n\\t\\t\\tdelete props[ name ];\\n\\n\\t\\t\\t// Not quite $.extend, this won't overwrite existing keys.\\n\\t\\t\\t// Reusing 'index' because we have the correct \\\"name\\\"\\n\\t\\t\\tfor ( index in value ) {\\n\\t\\t\\t\\tif ( !( index in props ) ) {\\n\\t\\t\\t\\t\\tprops[ index ] = value[ index ];\\n\\t\\t\\t\\t\\tspecialEasing[ index ] = easing;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tspecialEasing[ name ] = easing;\\n\\t\\t}\\n\\t}\\n}\\n\\nfunction Animation( elem, properties, options ) {\\n\\tvar result,\\n\\t\\tstopped,\\n\\t\\tindex = 0,\\n\\t\\tlength = Animation.prefilters.length,\\n\\t\\tdeferred = jQuery.Deferred().always( function() {\\n\\n\\t\\t\\t// Don't match elem in the :animated selector\\n\\t\\t\\tdelete tick.elem;\\n\\t\\t} ),\\n\\t\\ttick = function() {\\n\\t\\t\\tif ( stopped ) {\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t\\tvar currentTime = fxNow || createFxNow(),\\n\\t\\t\\t\\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\\n\\n\\t\\t\\t\\t// Support: Android 2.3 only\\n\\t\\t\\t\\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\\n\\t\\t\\t\\ttemp = remaining / animation.duration || 0,\\n\\t\\t\\t\\tpercent = 1 - temp,\\n\\t\\t\\t\\tindex = 0,\\n\\t\\t\\t\\tlength = animation.tweens.length;\\n\\n\\t\\t\\tfor ( ; index < length; index++ ) {\\n\\t\\t\\t\\tanimation.tweens[ index ].run( percent );\\n\\t\\t\\t}\\n\\n\\t\\t\\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\\n\\n\\t\\t\\tif ( percent < 1 && length ) {\\n\\t\\t\\t\\treturn remaining;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdeferred.resolveWith( elem, [ animation ] );\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tanimation = deferred.promise( {\\n\\t\\t\\telem: elem,\\n\\t\\t\\tprops: jQuery.extend( {}, properties ),\\n\\t\\t\\topts: jQuery.extend( true, {\\n\\t\\t\\t\\tspecialEasing: {},\\n\\t\\t\\t\\teasing: jQuery.easing._default\\n\\t\\t\\t}, options ),\\n\\t\\t\\toriginalProperties: properties,\\n\\t\\t\\toriginalOptions: options,\\n\\t\\t\\tstartTime: fxNow || createFxNow(),\\n\\t\\t\\tduration: options.duration,\\n\\t\\t\\ttweens: [],\\n\\t\\t\\tcreateTween: function( prop, end ) {\\n\\t\\t\\t\\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\\n\\t\\t\\t\\t\\t\\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\\n\\t\\t\\t\\tanimation.tweens.push( tween );\\n\\t\\t\\t\\treturn tween;\\n\\t\\t\\t},\\n\\t\\t\\tstop: function( gotoEnd ) {\\n\\t\\t\\t\\tvar index = 0,\\n\\n\\t\\t\\t\\t\\t// If we are going to the end, we want to run all the tweens\\n\\t\\t\\t\\t\\t// otherwise we skip this part\\n\\t\\t\\t\\t\\tlength = gotoEnd ? animation.tweens.length : 0;\\n\\t\\t\\t\\tif ( stopped ) {\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tstopped = true;\\n\\t\\t\\t\\tfor ( ; index < length; index++ ) {\\n\\t\\t\\t\\t\\tanimation.tweens[ index ].run( 1 );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Resolve when we played the last frame; otherwise, reject\\n\\t\\t\\t\\tif ( gotoEnd ) {\\n\\t\\t\\t\\t\\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\\n\\t\\t\\t\\t\\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn this;\\n\\t\\t\\t}\\n\\t\\t} ),\\n\\t\\tprops = animation.props;\\n\\n\\tpropFilter( props, animation.opts.specialEasing );\\n\\n\\tfor ( ; index < length; index++ ) {\\n\\t\\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\\n\\t\\tif ( result ) {\\n\\t\\t\\tif ( jQuery.isFunction( result.stop ) ) {\\n\\t\\t\\t\\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\\n\\t\\t\\t\\t\\tjQuery.proxy( result.stop, result );\\n\\t\\t\\t}\\n\\t\\t\\treturn result;\\n\\t\\t}\\n\\t}\\n\\n\\tjQuery.map( props, createTween, animation );\\n\\n\\tif ( jQuery.isFunction( animation.opts.start ) ) {\\n\\t\\tanimation.opts.start.call( elem, animation );\\n\\t}\\n\\n\\tjQuery.fx.timer(\\n\\t\\tjQuery.extend( tick, {\\n\\t\\t\\telem: elem,\\n\\t\\t\\tanim: animation,\\n\\t\\t\\tqueue: animation.opts.queue\\n\\t\\t} )\\n\\t);\\n\\n\\t// attach callbacks from options\\n\\treturn animation.progress( animation.opts.progress )\\n\\t\\t.done( animation.opts.done, animation.opts.complete )\\n\\t\\t.fail( animation.opts.fail )\\n\\t\\t.always( animation.opts.always );\\n}\\n\\njQuery.Animation = jQuery.extend( Animation, {\\n\\n\\ttweeners: {\\n\\t\\t\\\"*\\\": [ function( prop, value ) {\\n\\t\\t\\tvar tween = this.createTween( prop, value );\\n\\t\\t\\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\\n\\t\\t\\treturn tween;\\n\\t\\t} ]\\n\\t},\\n\\n\\ttweener: function( props, callback ) {\\n\\t\\tif ( jQuery.isFunction( props ) ) {\\n\\t\\t\\tcallback = props;\\n\\t\\t\\tprops = [ \\\"*\\\" ];\\n\\t\\t} else {\\n\\t\\t\\tprops = props.match( rnothtmlwhite );\\n\\t\\t}\\n\\n\\t\\tvar prop,\\n\\t\\t\\tindex = 0,\\n\\t\\t\\tlength = props.length;\\n\\n\\t\\tfor ( ; index < length; index++ ) {\\n\\t\\t\\tprop = props[ index ];\\n\\t\\t\\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\\n\\t\\t\\tAnimation.tweeners[ prop ].unshift( callback );\\n\\t\\t}\\n\\t},\\n\\n\\tprefilters: [ defaultPrefilter ],\\n\\n\\tprefilter: function( callback, prepend ) {\\n\\t\\tif ( prepend ) {\\n\\t\\t\\tAnimation.prefilters.unshift( callback );\\n\\t\\t} else {\\n\\t\\t\\tAnimation.prefilters.push( callback );\\n\\t\\t}\\n\\t}\\n} );\\n\\njQuery.speed = function( speed, easing, fn ) {\\n\\tvar opt = speed && typeof speed === \\\"object\\\" ? jQuery.extend( {}, speed ) : {\\n\\t\\tcomplete: fn || !fn && easing ||\\n\\t\\t\\tjQuery.isFunction( speed ) && speed,\\n\\t\\tduration: speed,\\n\\t\\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\\n\\t};\\n\\n\\t// Go to the end state if fx are off or if document is hidden\\n\\tif ( jQuery.fx.off || document.hidden ) {\\n\\t\\topt.duration = 0;\\n\\n\\t} else {\\n\\t\\tif ( typeof opt.duration !== \\\"number\\\" ) {\\n\\t\\t\\tif ( opt.duration in jQuery.fx.speeds ) {\\n\\t\\t\\t\\topt.duration = jQuery.fx.speeds[ opt.duration ];\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\topt.duration = jQuery.fx.speeds._default;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Normalize opt.queue - true/undefined/null -> \\\"fx\\\"\\n\\tif ( opt.queue == null || opt.queue === true ) {\\n\\t\\topt.queue = \\\"fx\\\";\\n\\t}\\n\\n\\t// Queueing\\n\\topt.old = opt.complete;\\n\\n\\topt.complete = function() {\\n\\t\\tif ( jQuery.isFunction( opt.old ) ) {\\n\\t\\t\\topt.old.call( this );\\n\\t\\t}\\n\\n\\t\\tif ( opt.queue ) {\\n\\t\\t\\tjQuery.dequeue( this, opt.queue );\\n\\t\\t}\\n\\t};\\n\\n\\treturn opt;\\n};\\n\\njQuery.fn.extend( {\\n\\tfadeTo: function( speed, to, easing, callback ) {\\n\\n\\t\\t// Show any hidden elements after setting opacity to 0\\n\\t\\treturn this.filter( isHiddenWithinTree ).css( \\\"opacity\\\", 0 ).show()\\n\\n\\t\\t\\t// Animate to the value specified\\n\\t\\t\\t.end().animate( { opacity: to }, speed, easing, callback );\\n\\t},\\n\\tanimate: function( prop, speed, easing, callback ) {\\n\\t\\tvar empty = jQuery.isEmptyObject( prop ),\\n\\t\\t\\toptall = jQuery.speed( speed, easing, callback ),\\n\\t\\t\\tdoAnimation = function() {\\n\\n\\t\\t\\t\\t// Operate on a copy of prop so per-property easing won't be lost\\n\\t\\t\\t\\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\\n\\n\\t\\t\\t\\t// Empty animations, or finishing resolves immediately\\n\\t\\t\\t\\tif ( empty || dataPriv.get( this, \\\"finish\\\" ) ) {\\n\\t\\t\\t\\t\\tanim.stop( true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\t\\t\\tdoAnimation.finish = doAnimation;\\n\\n\\t\\treturn empty || optall.queue === false ?\\n\\t\\t\\tthis.each( doAnimation ) :\\n\\t\\t\\tthis.queue( optall.queue, doAnimation );\\n\\t},\\n\\tstop: function( type, clearQueue, gotoEnd ) {\\n\\t\\tvar stopQueue = function( hooks ) {\\n\\t\\t\\tvar stop = hooks.stop;\\n\\t\\t\\tdelete hooks.stop;\\n\\t\\t\\tstop( gotoEnd );\\n\\t\\t};\\n\\n\\t\\tif ( typeof type !== \\\"string\\\" ) {\\n\\t\\t\\tgotoEnd = clearQueue;\\n\\t\\t\\tclearQueue = type;\\n\\t\\t\\ttype = undefined;\\n\\t\\t}\\n\\t\\tif ( clearQueue && type !== false ) {\\n\\t\\t\\tthis.queue( type || \\\"fx\\\", [] );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar dequeue = true,\\n\\t\\t\\t\\tindex = type != null && type + \\\"queueHooks\\\",\\n\\t\\t\\t\\ttimers = jQuery.timers,\\n\\t\\t\\t\\tdata = dataPriv.get( this );\\n\\n\\t\\t\\tif ( index ) {\\n\\t\\t\\t\\tif ( data[ index ] && data[ index ].stop ) {\\n\\t\\t\\t\\t\\tstopQueue( data[ index ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tfor ( index in data ) {\\n\\t\\t\\t\\t\\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\\n\\t\\t\\t\\t\\t\\tstopQueue( data[ index ] );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\tfor ( index = timers.length; index--; ) {\\n\\t\\t\\t\\tif ( timers[ index ].elem === this &&\\n\\t\\t\\t\\t\\t( type == null || timers[ index ].queue === type ) ) {\\n\\n\\t\\t\\t\\t\\ttimers[ index ].anim.stop( gotoEnd );\\n\\t\\t\\t\\t\\tdequeue = false;\\n\\t\\t\\t\\t\\ttimers.splice( index, 1 );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Start the next in the queue if the last step wasn't forced.\\n\\t\\t\\t// Timers currently will call their complete callbacks, which\\n\\t\\t\\t// will dequeue but only if they were gotoEnd.\\n\\t\\t\\tif ( dequeue || !gotoEnd ) {\\n\\t\\t\\t\\tjQuery.dequeue( this, type );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\tfinish: function( type ) {\\n\\t\\tif ( type !== false ) {\\n\\t\\t\\ttype = type || \\\"fx\\\";\\n\\t\\t}\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar index,\\n\\t\\t\\t\\tdata = dataPriv.get( this ),\\n\\t\\t\\t\\tqueue = data[ type + \\\"queue\\\" ],\\n\\t\\t\\t\\thooks = data[ type + \\\"queueHooks\\\" ],\\n\\t\\t\\t\\ttimers = jQuery.timers,\\n\\t\\t\\t\\tlength = queue ? queue.length : 0;\\n\\n\\t\\t\\t// Enable finishing flag on private data\\n\\t\\t\\tdata.finish = true;\\n\\n\\t\\t\\t// Empty the queue first\\n\\t\\t\\tjQuery.queue( this, type, [] );\\n\\n\\t\\t\\tif ( hooks && hooks.stop ) {\\n\\t\\t\\t\\thooks.stop.call( this, true );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Look for any active animations, and finish them\\n\\t\\t\\tfor ( index = timers.length; index--; ) {\\n\\t\\t\\t\\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\\n\\t\\t\\t\\t\\ttimers[ index ].anim.stop( true );\\n\\t\\t\\t\\t\\ttimers.splice( index, 1 );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Look for any animations in the old queue and finish them\\n\\t\\t\\tfor ( index = 0; index < length; index++ ) {\\n\\t\\t\\t\\tif ( queue[ index ] && queue[ index ].finish ) {\\n\\t\\t\\t\\t\\tqueue[ index ].finish.call( this );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Turn off finishing flag\\n\\t\\t\\tdelete data.finish;\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"toggle\\\", \\\"show\\\", \\\"hide\\\" ], function( i, name ) {\\n\\tvar cssFn = jQuery.fn[ name ];\\n\\tjQuery.fn[ name ] = function( speed, easing, callback ) {\\n\\t\\treturn speed == null || typeof speed === \\\"boolean\\\" ?\\n\\t\\t\\tcssFn.apply( this, arguments ) :\\n\\t\\t\\tthis.animate( genFx( name, true ), speed, easing, callback );\\n\\t};\\n} );\\n\\n// Generate shortcuts for custom animations\\njQuery.each( {\\n\\tslideDown: genFx( \\\"show\\\" ),\\n\\tslideUp: genFx( \\\"hide\\\" ),\\n\\tslideToggle: genFx( \\\"toggle\\\" ),\\n\\tfadeIn: { opacity: \\\"show\\\" },\\n\\tfadeOut: { opacity: \\\"hide\\\" },\\n\\tfadeToggle: { opacity: \\\"toggle\\\" }\\n}, function( name, props ) {\\n\\tjQuery.fn[ name ] = function( speed, easing, callback ) {\\n\\t\\treturn this.animate( props, speed, easing, callback );\\n\\t};\\n} );\\n\\njQuery.timers = [];\\njQuery.fx.tick = function() {\\n\\tvar timer,\\n\\t\\ti = 0,\\n\\t\\ttimers = jQuery.timers;\\n\\n\\tfxNow = jQuery.now();\\n\\n\\tfor ( ; i < timers.length; i++ ) {\\n\\t\\ttimer = timers[ i ];\\n\\n\\t\\t// Checks the timer has not already been removed\\n\\t\\tif ( !timer() && timers[ i ] === timer ) {\\n\\t\\t\\ttimers.splice( i--, 1 );\\n\\t\\t}\\n\\t}\\n\\n\\tif ( !timers.length ) {\\n\\t\\tjQuery.fx.stop();\\n\\t}\\n\\tfxNow = undefined;\\n};\\n\\njQuery.fx.timer = function( timer ) {\\n\\tjQuery.timers.push( timer );\\n\\tif ( timer() ) {\\n\\t\\tjQuery.fx.start();\\n\\t} else {\\n\\t\\tjQuery.timers.pop();\\n\\t}\\n};\\n\\njQuery.fx.interval = 13;\\njQuery.fx.start = function() {\\n\\tif ( !timerId ) {\\n\\t\\ttimerId = window.requestAnimationFrame ?\\n\\t\\t\\twindow.requestAnimationFrame( raf ) :\\n\\t\\t\\twindow.setInterval( jQuery.fx.tick, jQuery.fx.interval );\\n\\t}\\n};\\n\\njQuery.fx.stop = function() {\\n\\tif ( window.cancelAnimationFrame ) {\\n\\t\\twindow.cancelAnimationFrame( timerId );\\n\\t} else {\\n\\t\\twindow.clearInterval( timerId );\\n\\t}\\n\\n\\ttimerId = null;\\n};\\n\\njQuery.fx.speeds = {\\n\\tslow: 600,\\n\\tfast: 200,\\n\\n\\t// Default speed\\n\\t_default: 400\\n};\\n\\n\\n// Based off of the plugin by Clint Helfers, with permission.\\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\\njQuery.fn.delay = function( time, type ) {\\n\\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\\n\\ttype = type || \\\"fx\\\";\\n\\n\\treturn this.queue( type, function( next, hooks ) {\\n\\t\\tvar timeout = window.setTimeout( next, time );\\n\\t\\thooks.stop = function() {\\n\\t\\t\\twindow.clearTimeout( timeout );\\n\\t\\t};\\n\\t} );\\n};\\n\\n\\n( function() {\\n\\tvar input = document.createElement( \\\"input\\\" ),\\n\\t\\tselect = document.createElement( \\\"select\\\" ),\\n\\t\\topt = select.appendChild( document.createElement( \\\"option\\\" ) );\\n\\n\\tinput.type = \\\"checkbox\\\";\\n\\n\\t// Support: Android <=4.3 only\\n\\t// Default value for a checkbox should be \\\"on\\\"\\n\\tsupport.checkOn = input.value !== \\\"\\\";\\n\\n\\t// Support: IE <=11 only\\n\\t// Must access selectedIndex to make default options select\\n\\tsupport.optSelected = opt.selected;\\n\\n\\t// Support: IE <=11 only\\n\\t// An input loses its value after becoming a radio\\n\\tinput = document.createElement( \\\"input\\\" );\\n\\tinput.value = \\\"t\\\";\\n\\tinput.type = \\\"radio\\\";\\n\\tsupport.radioValue = input.value === \\\"t\\\";\\n} )();\\n\\n\\nvar boolHook,\\n\\tattrHandle = jQuery.expr.attrHandle;\\n\\njQuery.fn.extend( {\\n\\tattr: function( name, value ) {\\n\\t\\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\\n\\t},\\n\\n\\tremoveAttr: function( name ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.removeAttr( this, name );\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tattr: function( elem, name, value ) {\\n\\t\\tvar ret, hooks,\\n\\t\\t\\tnType = elem.nodeType;\\n\\n\\t\\t// Don't get/set attributes on text, comment and attribute nodes\\n\\t\\tif ( nType === 3 || nType === 8 || nType === 2 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Fallback to prop when attributes are not supported\\n\\t\\tif ( typeof elem.getAttribute === \\\"undefined\\\" ) {\\n\\t\\t\\treturn jQuery.prop( elem, name, value );\\n\\t\\t}\\n\\n\\t\\t// Attribute hooks are determined by the lowercase version\\n\\t\\t// Grab necessary hook if one is defined\\n\\t\\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\\n\\t\\t\\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\\n\\t\\t\\t\\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\\n\\t\\t}\\n\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\tif ( value === null ) {\\n\\t\\t\\t\\tjQuery.removeAttr( elem, name );\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( hooks && \\\"set\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\telem.setAttribute( name, value + \\\"\\\" );\\n\\t\\t\\treturn value;\\n\\t\\t}\\n\\n\\t\\tif ( hooks && \\\"get\\\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\n\\t\\tret = jQuery.find.attr( elem, name );\\n\\n\\t\\t// Non-existent attributes return null, we normalize to undefined\\n\\t\\treturn ret == null ? undefined : ret;\\n\\t},\\n\\n\\tattrHooks: {\\n\\t\\ttype: {\\n\\t\\t\\tset: function( elem, value ) {\\n\\t\\t\\t\\tif ( !support.radioValue && value === \\\"radio\\\" &&\\n\\t\\t\\t\\t\\tjQuery.nodeName( elem, \\\"input\\\" ) ) {\\n\\t\\t\\t\\t\\tvar val = elem.value;\\n\\t\\t\\t\\t\\telem.setAttribute( \\\"type\\\", value );\\n\\t\\t\\t\\t\\tif ( val ) {\\n\\t\\t\\t\\t\\t\\telem.value = val;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\tremoveAttr: function( elem, value ) {\\n\\t\\tvar name,\\n\\t\\t\\ti = 0,\\n\\n\\t\\t\\t// Attribute names can contain non-HTML whitespace characters\\n\\t\\t\\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\\n\\t\\t\\tattrNames = value && value.match( rnothtmlwhite );\\n\\n\\t\\tif ( attrNames && elem.nodeType === 1 ) {\\n\\t\\t\\twhile ( ( name = attrNames[ i++ ] ) ) {\\n\\t\\t\\t\\telem.removeAttribute( name );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Hooks for boolean attributes\\nboolHook = {\\n\\tset: function( elem, value, name ) {\\n\\t\\tif ( value === false ) {\\n\\n\\t\\t\\t// Remove boolean attributes when set to false\\n\\t\\t\\tjQuery.removeAttr( elem, name );\\n\\t\\t} else {\\n\\t\\t\\telem.setAttribute( name, name );\\n\\t\\t}\\n\\t\\treturn name;\\n\\t}\\n};\\n\\njQuery.each( jQuery.expr.match.bool.source.match( /\\\\w+/g ), function( i, name ) {\\n\\tvar getter = attrHandle[ name ] || jQuery.find.attr;\\n\\n\\tattrHandle[ name ] = function( elem, name, isXML ) {\\n\\t\\tvar ret, handle,\\n\\t\\t\\tlowercaseName = name.toLowerCase();\\n\\n\\t\\tif ( !isXML ) {\\n\\n\\t\\t\\t// Avoid an infinite loop by temporarily removing this function from the getter\\n\\t\\t\\thandle = attrHandle[ lowercaseName ];\\n\\t\\t\\tattrHandle[ lowercaseName ] = ret;\\n\\t\\t\\tret = getter( elem, name, isXML ) != null ?\\n\\t\\t\\t\\tlowercaseName :\\n\\t\\t\\t\\tnull;\\n\\t\\t\\tattrHandle[ lowercaseName ] = handle;\\n\\t\\t}\\n\\t\\treturn ret;\\n\\t};\\n} );\\n\\n\\n\\n\\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\\n\\trclickable = /^(?:a|area)$/i;\\n\\njQuery.fn.extend( {\\n\\tprop: function( name, value ) {\\n\\t\\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\\n\\t},\\n\\n\\tremoveProp: function( name ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tdelete this[ jQuery.propFix[ name ] || name ];\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tprop: function( elem, name, value ) {\\n\\t\\tvar ret, hooks,\\n\\t\\t\\tnType = elem.nodeType;\\n\\n\\t\\t// Don't get/set properties on text, comment and attribute nodes\\n\\t\\tif ( nType === 3 || nType === 8 || nType === 2 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\\n\\n\\t\\t\\t// Fix name and attach hooks\\n\\t\\t\\tname = jQuery.propFix[ name ] || name;\\n\\t\\t\\thooks = jQuery.propHooks[ name ];\\n\\t\\t}\\n\\n\\t\\tif ( value !== undefined ) {\\n\\t\\t\\tif ( hooks && \\\"set\\\" in hooks &&\\n\\t\\t\\t\\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\\n\\t\\t\\t\\treturn ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn ( elem[ name ] = value );\\n\\t\\t}\\n\\n\\t\\tif ( hooks && \\\"get\\\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\\n\\t\\t\\treturn ret;\\n\\t\\t}\\n\\n\\t\\treturn elem[ name ];\\n\\t},\\n\\n\\tpropHooks: {\\n\\t\\ttabIndex: {\\n\\t\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t\\t// Support: IE <=9 - 11 only\\n\\t\\t\\t\\t// elem.tabIndex doesn't always return the\\n\\t\\t\\t\\t// correct value when it hasn't been explicitly set\\n\\t\\t\\t\\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\\n\\t\\t\\t\\t// Use proper attribute retrieval(#12072)\\n\\t\\t\\t\\tvar tabindex = jQuery.find.attr( elem, \\\"tabindex\\\" );\\n\\n\\t\\t\\t\\tif ( tabindex ) {\\n\\t\\t\\t\\t\\treturn parseInt( tabindex, 10 );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tif (\\n\\t\\t\\t\\t\\trfocusable.test( elem.nodeName ) ||\\n\\t\\t\\t\\t\\trclickable.test( elem.nodeName ) &&\\n\\t\\t\\t\\t\\telem.href\\n\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\treturn 0;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn -1;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t},\\n\\n\\tpropFix: {\\n\\t\\t\\\"for\\\": \\\"htmlFor\\\",\\n\\t\\t\\\"class\\\": \\\"className\\\"\\n\\t}\\n} );\\n\\n// Support: IE <=11 only\\n// Accessing the selectedIndex property\\n// forces the browser to respect setting selected\\n// on the option\\n// The getter ensures a default option is selected\\n// when in an optgroup\\n// eslint rule \\\"no-unused-expressions\\\" is disabled for this code\\n// since it considers such accessions noop\\nif ( !support.optSelected ) {\\n\\tjQuery.propHooks.selected = {\\n\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t/* eslint no-unused-expressions: \\\"off\\\" */\\n\\n\\t\\t\\tvar parent = elem.parentNode;\\n\\t\\t\\tif ( parent && parent.parentNode ) {\\n\\t\\t\\t\\tparent.parentNode.selectedIndex;\\n\\t\\t\\t}\\n\\t\\t\\treturn null;\\n\\t\\t},\\n\\t\\tset: function( elem ) {\\n\\n\\t\\t\\t/* eslint no-unused-expressions: \\\"off\\\" */\\n\\n\\t\\t\\tvar parent = elem.parentNode;\\n\\t\\t\\tif ( parent ) {\\n\\t\\t\\t\\tparent.selectedIndex;\\n\\n\\t\\t\\t\\tif ( parent.parentNode ) {\\n\\t\\t\\t\\t\\tparent.parentNode.selectedIndex;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n}\\n\\njQuery.each( [\\n\\t\\\"tabIndex\\\",\\n\\t\\\"readOnly\\\",\\n\\t\\\"maxLength\\\",\\n\\t\\\"cellSpacing\\\",\\n\\t\\\"cellPadding\\\",\\n\\t\\\"rowSpan\\\",\\n\\t\\\"colSpan\\\",\\n\\t\\\"useMap\\\",\\n\\t\\\"frameBorder\\\",\\n\\t\\\"contentEditable\\\"\\n], function() {\\n\\tjQuery.propFix[ this.toLowerCase() ] = this;\\n} );\\n\\n\\n\\n\\n\\t// Strip and collapse whitespace according to HTML spec\\n\\t// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace\\n\\tfunction stripAndCollapse( value ) {\\n\\t\\tvar tokens = value.match( rnothtmlwhite ) || [];\\n\\t\\treturn tokens.join( \\\" \\\" );\\n\\t}\\n\\n\\nfunction getClass( elem ) {\\n\\treturn elem.getAttribute && elem.getAttribute( \\\"class\\\" ) || \\\"\\\";\\n}\\n\\njQuery.fn.extend( {\\n\\taddClass: function( value ) {\\n\\t\\tvar classes, elem, cur, curValue, clazz, j, finalValue,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( j ) {\\n\\t\\t\\t\\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( typeof value === \\\"string\\\" && value ) {\\n\\t\\t\\tclasses = value.match( rnothtmlwhite ) || [];\\n\\n\\t\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\t\\tcurValue = getClass( elem );\\n\\t\\t\\t\\tcur = elem.nodeType === 1 && ( \\\" \\\" + stripAndCollapse( curValue ) + \\\" \\\" );\\n\\n\\t\\t\\t\\tif ( cur ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\twhile ( ( clazz = classes[ j++ ] ) ) {\\n\\t\\t\\t\\t\\t\\tif ( cur.indexOf( \\\" \\\" + clazz + \\\" \\\" ) < 0 ) {\\n\\t\\t\\t\\t\\t\\t\\tcur += clazz + \\\" \\\";\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Only assign if different to avoid unneeded rendering.\\n\\t\\t\\t\\t\\tfinalValue = stripAndCollapse( cur );\\n\\t\\t\\t\\t\\tif ( curValue !== finalValue ) {\\n\\t\\t\\t\\t\\t\\telem.setAttribute( \\\"class\\\", finalValue );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\tremoveClass: function( value ) {\\n\\t\\tvar classes, elem, cur, curValue, clazz, j, finalValue,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( j ) {\\n\\t\\t\\t\\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\tif ( !arguments.length ) {\\n\\t\\t\\treturn this.attr( \\\"class\\\", \\\"\\\" );\\n\\t\\t}\\n\\n\\t\\tif ( typeof value === \\\"string\\\" && value ) {\\n\\t\\t\\tclasses = value.match( rnothtmlwhite ) || [];\\n\\n\\t\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\t\\tcurValue = getClass( elem );\\n\\n\\t\\t\\t\\t// This expression is here for better compressibility (see addClass)\\n\\t\\t\\t\\tcur = elem.nodeType === 1 && ( \\\" \\\" + stripAndCollapse( curValue ) + \\\" \\\" );\\n\\n\\t\\t\\t\\tif ( cur ) {\\n\\t\\t\\t\\t\\tj = 0;\\n\\t\\t\\t\\t\\twhile ( ( clazz = classes[ j++ ] ) ) {\\n\\n\\t\\t\\t\\t\\t\\t// Remove *all* instances\\n\\t\\t\\t\\t\\t\\twhile ( cur.indexOf( \\\" \\\" + clazz + \\\" \\\" ) > -1 ) {\\n\\t\\t\\t\\t\\t\\t\\tcur = cur.replace( \\\" \\\" + clazz + \\\" \\\", \\\" \\\" );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Only assign if different to avoid unneeded rendering.\\n\\t\\t\\t\\t\\tfinalValue = stripAndCollapse( cur );\\n\\t\\t\\t\\t\\tif ( curValue !== finalValue ) {\\n\\t\\t\\t\\t\\t\\telem.setAttribute( \\\"class\\\", finalValue );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\ttoggleClass: function( value, stateVal ) {\\n\\t\\tvar type = typeof value;\\n\\n\\t\\tif ( typeof stateVal === \\\"boolean\\\" && type === \\\"string\\\" ) {\\n\\t\\t\\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\\n\\t\\t}\\n\\n\\t\\tif ( jQuery.isFunction( value ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).toggleClass(\\n\\t\\t\\t\\t\\tvalue.call( this, i, getClass( this ), stateVal ),\\n\\t\\t\\t\\t\\tstateVal\\n\\t\\t\\t\\t);\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar className, i, self, classNames;\\n\\n\\t\\t\\tif ( type === \\\"string\\\" ) {\\n\\n\\t\\t\\t\\t// Toggle individual class names\\n\\t\\t\\t\\ti = 0;\\n\\t\\t\\t\\tself = jQuery( this );\\n\\t\\t\\t\\tclassNames = value.match( rnothtmlwhite ) || [];\\n\\n\\t\\t\\t\\twhile ( ( className = classNames[ i++ ] ) ) {\\n\\n\\t\\t\\t\\t\\t// Check each className given, space separated list\\n\\t\\t\\t\\t\\tif ( self.hasClass( className ) ) {\\n\\t\\t\\t\\t\\t\\tself.removeClass( className );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tself.addClass( className );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t// Toggle whole class name\\n\\t\\t\\t} else if ( value === undefined || type === \\\"boolean\\\" ) {\\n\\t\\t\\t\\tclassName = getClass( this );\\n\\t\\t\\t\\tif ( className ) {\\n\\n\\t\\t\\t\\t\\t// Store className if set\\n\\t\\t\\t\\t\\tdataPriv.set( this, \\\"__className__\\\", className );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// If the element has a class name or if we're passed `false`,\\n\\t\\t\\t\\t// then remove the whole classname (if there was one, the above saved it).\\n\\t\\t\\t\\t// Otherwise bring back whatever was previously saved (if anything),\\n\\t\\t\\t\\t// falling back to the empty string if nothing was stored.\\n\\t\\t\\t\\tif ( this.setAttribute ) {\\n\\t\\t\\t\\t\\tthis.setAttribute( \\\"class\\\",\\n\\t\\t\\t\\t\\t\\tclassName || value === false ?\\n\\t\\t\\t\\t\\t\\t\\\"\\\" :\\n\\t\\t\\t\\t\\t\\tdataPriv.get( this, \\\"__className__\\\" ) || \\\"\\\"\\n\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\thasClass: function( selector ) {\\n\\t\\tvar className, elem,\\n\\t\\t\\ti = 0;\\n\\n\\t\\tclassName = \\\" \\\" + selector + \\\" \\\";\\n\\t\\twhile ( ( elem = this[ i++ ] ) ) {\\n\\t\\t\\tif ( elem.nodeType === 1 &&\\n\\t\\t\\t\\t( \\\" \\\" + stripAndCollapse( getClass( elem ) ) + \\\" \\\" ).indexOf( className ) > -1 ) {\\n\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn false;\\n\\t}\\n} );\\n\\n\\n\\n\\nvar rreturn = /\\\\r/g;\\n\\njQuery.fn.extend( {\\n\\tval: function( value ) {\\n\\t\\tvar hooks, ret, isFunction,\\n\\t\\t\\telem = this[ 0 ];\\n\\n\\t\\tif ( !arguments.length ) {\\n\\t\\t\\tif ( elem ) {\\n\\t\\t\\t\\thooks = jQuery.valHooks[ elem.type ] ||\\n\\t\\t\\t\\t\\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\\n\\n\\t\\t\\t\\tif ( hooks &&\\n\\t\\t\\t\\t\\t\\\"get\\\" in hooks &&\\n\\t\\t\\t\\t\\t( ret = hooks.get( elem, \\\"value\\\" ) ) !== undefined\\n\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\treturn ret;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tret = elem.value;\\n\\n\\t\\t\\t\\t// Handle most common string cases\\n\\t\\t\\t\\tif ( typeof ret === \\\"string\\\" ) {\\n\\t\\t\\t\\t\\treturn ret.replace( rreturn, \\\"\\\" );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Handle cases where value is null/undef or number\\n\\t\\t\\t\\treturn ret == null ? \\\"\\\" : ret;\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tisFunction = jQuery.isFunction( value );\\n\\n\\t\\treturn this.each( function( i ) {\\n\\t\\t\\tvar val;\\n\\n\\t\\t\\tif ( this.nodeType !== 1 ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( isFunction ) {\\n\\t\\t\\t\\tval = value.call( this, i, jQuery( this ).val() );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tval = value;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Treat null/undefined as \\\"\\\"; convert numbers to string\\n\\t\\t\\tif ( val == null ) {\\n\\t\\t\\t\\tval = \\\"\\\";\\n\\n\\t\\t\\t} else if ( typeof val === \\\"number\\\" ) {\\n\\t\\t\\t\\tval += \\\"\\\";\\n\\n\\t\\t\\t} else if ( jQuery.isArray( val ) ) {\\n\\t\\t\\t\\tval = jQuery.map( val, function( value ) {\\n\\t\\t\\t\\t\\treturn value == null ? \\\"\\\" : value + \\\"\\\";\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\n\\t\\t\\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\\n\\n\\t\\t\\t// If set returns undefined, fall back to normal setting\\n\\t\\t\\tif ( !hooks || !( \\\"set\\\" in hooks ) || hooks.set( this, val, \\\"value\\\" ) === undefined ) {\\n\\t\\t\\t\\tthis.value = val;\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t}\\n} );\\n\\njQuery.extend( {\\n\\tvalHooks: {\\n\\t\\toption: {\\n\\t\\t\\tget: function( elem ) {\\n\\n\\t\\t\\t\\tvar val = jQuery.find.attr( elem, \\\"value\\\" );\\n\\t\\t\\t\\treturn val != null ?\\n\\t\\t\\t\\t\\tval :\\n\\n\\t\\t\\t\\t\\t// Support: IE <=10 - 11 only\\n\\t\\t\\t\\t\\t// option.text throws exceptions (#14686, #14858)\\n\\t\\t\\t\\t\\t// Strip and collapse whitespace\\n\\t\\t\\t\\t\\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\\n\\t\\t\\t\\t\\tstripAndCollapse( jQuery.text( elem ) );\\n\\t\\t\\t}\\n\\t\\t},\\n\\t\\tselect: {\\n\\t\\t\\tget: function( elem ) {\\n\\t\\t\\t\\tvar value, option, i,\\n\\t\\t\\t\\t\\toptions = elem.options,\\n\\t\\t\\t\\t\\tindex = elem.selectedIndex,\\n\\t\\t\\t\\t\\tone = elem.type === \\\"select-one\\\",\\n\\t\\t\\t\\t\\tvalues = one ? null : [],\\n\\t\\t\\t\\t\\tmax = one ? index + 1 : options.length;\\n\\n\\t\\t\\t\\tif ( index < 0 ) {\\n\\t\\t\\t\\t\\ti = max;\\n\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ti = one ? index : 0;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Loop through all the selected options\\n\\t\\t\\t\\tfor ( ; i < max; i++ ) {\\n\\t\\t\\t\\t\\toption = options[ i ];\\n\\n\\t\\t\\t\\t\\t// Support: IE <=9 only\\n\\t\\t\\t\\t\\t// IE8-9 doesn't update selected after form reset (#2551)\\n\\t\\t\\t\\t\\tif ( ( option.selected || i === index ) &&\\n\\n\\t\\t\\t\\t\\t\\t\\t// Don't return options that are disabled or in a disabled optgroup\\n\\t\\t\\t\\t\\t\\t\\t!option.disabled &&\\n\\t\\t\\t\\t\\t\\t\\t( !option.parentNode.disabled ||\\n\\t\\t\\t\\t\\t\\t\\t\\t!jQuery.nodeName( option.parentNode, \\\"optgroup\\\" ) ) ) {\\n\\n\\t\\t\\t\\t\\t\\t// Get the specific value for the option\\n\\t\\t\\t\\t\\t\\tvalue = jQuery( option ).val();\\n\\n\\t\\t\\t\\t\\t\\t// We don't need an array for one selects\\n\\t\\t\\t\\t\\t\\tif ( one ) {\\n\\t\\t\\t\\t\\t\\t\\treturn value;\\n\\t\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t\\t// Multi-Selects return an array\\n\\t\\t\\t\\t\\t\\tvalues.push( value );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn values;\\n\\t\\t\\t},\\n\\n\\t\\t\\tset: function( elem, value ) {\\n\\t\\t\\t\\tvar optionSet, option,\\n\\t\\t\\t\\t\\toptions = elem.options,\\n\\t\\t\\t\\t\\tvalues = jQuery.makeArray( value ),\\n\\t\\t\\t\\t\\ti = options.length;\\n\\n\\t\\t\\t\\twhile ( i-- ) {\\n\\t\\t\\t\\t\\toption = options[ i ];\\n\\n\\t\\t\\t\\t\\t/* eslint-disable no-cond-assign */\\n\\n\\t\\t\\t\\t\\tif ( option.selected =\\n\\t\\t\\t\\t\\t\\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\\n\\t\\t\\t\\t\\t) {\\n\\t\\t\\t\\t\\t\\toptionSet = true;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t/* eslint-enable no-cond-assign */\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Force browsers to behave consistently when non-matching value is set\\n\\t\\t\\t\\tif ( !optionSet ) {\\n\\t\\t\\t\\t\\telem.selectedIndex = -1;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn values;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Radios and checkboxes getter/setter\\njQuery.each( [ \\\"radio\\\", \\\"checkbox\\\" ], function() {\\n\\tjQuery.valHooks[ this ] = {\\n\\t\\tset: function( elem, value ) {\\n\\t\\t\\tif ( jQuery.isArray( value ) ) {\\n\\t\\t\\t\\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\tif ( !support.checkOn ) {\\n\\t\\tjQuery.valHooks[ this ].get = function( elem ) {\\n\\t\\t\\treturn elem.getAttribute( \\\"value\\\" ) === null ? \\\"on\\\" : elem.value;\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\n// Return jQuery for attributes-only inclusion\\n\\n\\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;\\n\\njQuery.extend( jQuery.event, {\\n\\n\\ttrigger: function( event, data, elem, onlyHandlers ) {\\n\\n\\t\\tvar i, cur, tmp, bubbleType, ontype, handle, special,\\n\\t\\t\\teventPath = [ elem || document ],\\n\\t\\t\\ttype = hasOwn.call( event, \\\"type\\\" ) ? event.type : event,\\n\\t\\t\\tnamespaces = hasOwn.call( event, \\\"namespace\\\" ) ? event.namespace.split( \\\".\\\" ) : [];\\n\\n\\t\\tcur = tmp = elem = elem || document;\\n\\n\\t\\t// Don't do events on text and comment nodes\\n\\t\\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\\n\\t\\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\tif ( type.indexOf( \\\".\\\" ) > -1 ) {\\n\\n\\t\\t\\t// Namespaced trigger; create a regexp to match event type in handle()\\n\\t\\t\\tnamespaces = type.split( \\\".\\\" );\\n\\t\\t\\ttype = namespaces.shift();\\n\\t\\t\\tnamespaces.sort();\\n\\t\\t}\\n\\t\\tontype = type.indexOf( \\\":\\\" ) < 0 && \\\"on\\\" + type;\\n\\n\\t\\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\\n\\t\\tevent = event[ jQuery.expando ] ?\\n\\t\\t\\tevent :\\n\\t\\t\\tnew jQuery.Event( type, typeof event === \\\"object\\\" && event );\\n\\n\\t\\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\\n\\t\\tevent.isTrigger = onlyHandlers ? 2 : 3;\\n\\t\\tevent.namespace = namespaces.join( \\\".\\\" );\\n\\t\\tevent.rnamespace = event.namespace ?\\n\\t\\t\\tnew RegExp( \\\"(^|\\\\\\\\.)\\\" + namespaces.join( \\\"\\\\\\\\.(?:.*\\\\\\\\.|)\\\" ) + \\\"(\\\\\\\\.|$)\\\" ) :\\n\\t\\t\\tnull;\\n\\n\\t\\t// Clean up the event in case it is being reused\\n\\t\\tevent.result = undefined;\\n\\t\\tif ( !event.target ) {\\n\\t\\t\\tevent.target = elem;\\n\\t\\t}\\n\\n\\t\\t// Clone any incoming data and prepend the event, creating the handler arg list\\n\\t\\tdata = data == null ?\\n\\t\\t\\t[ event ] :\\n\\t\\t\\tjQuery.makeArray( data, [ event ] );\\n\\n\\t\\t// Allow special events to draw outside the lines\\n\\t\\tspecial = jQuery.event.special[ type ] || {};\\n\\t\\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\n\\t\\t// Determine event propagation path in advance, per W3C events spec (#9951)\\n\\t\\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\\n\\t\\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\tbubbleType = special.delegateType || type;\\n\\t\\t\\tif ( !rfocusMorph.test( bubbleType + type ) ) {\\n\\t\\t\\t\\tcur = cur.parentNode;\\n\\t\\t\\t}\\n\\t\\t\\tfor ( ; cur; cur = cur.parentNode ) {\\n\\t\\t\\t\\teventPath.push( cur );\\n\\t\\t\\t\\ttmp = cur;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\\n\\t\\t\\tif ( tmp === ( elem.ownerDocument || document ) ) {\\n\\t\\t\\t\\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Fire handlers on the event path\\n\\t\\ti = 0;\\n\\t\\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\\n\\n\\t\\t\\tevent.type = i > 1 ?\\n\\t\\t\\t\\tbubbleType :\\n\\t\\t\\t\\tspecial.bindType || type;\\n\\n\\t\\t\\t// jQuery handler\\n\\t\\t\\thandle = ( dataPriv.get( cur, \\\"events\\\" ) || {} )[ event.type ] &&\\n\\t\\t\\t\\tdataPriv.get( cur, \\\"handle\\\" );\\n\\t\\t\\tif ( handle ) {\\n\\t\\t\\t\\thandle.apply( cur, data );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Native handler\\n\\t\\t\\thandle = ontype && cur[ ontype ];\\n\\t\\t\\tif ( handle && handle.apply && acceptData( cur ) ) {\\n\\t\\t\\t\\tevent.result = handle.apply( cur, data );\\n\\t\\t\\t\\tif ( event.result === false ) {\\n\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tevent.type = type;\\n\\n\\t\\t// If nobody prevented the default action, do it now\\n\\t\\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\\n\\n\\t\\t\\tif ( ( !special._default ||\\n\\t\\t\\t\\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\\n\\t\\t\\t\\tacceptData( elem ) ) {\\n\\n\\t\\t\\t\\t// Call a native DOM method on the target with the same name as the event.\\n\\t\\t\\t\\t// Don't do default actions on window, that's where global variables be (#6170)\\n\\t\\t\\t\\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\\n\\n\\t\\t\\t\\t\\t// Don't re-trigger an onFOO event when we call its FOO() method\\n\\t\\t\\t\\t\\ttmp = elem[ ontype ];\\n\\n\\t\\t\\t\\t\\tif ( tmp ) {\\n\\t\\t\\t\\t\\t\\telem[ ontype ] = null;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\t// Prevent re-triggering of the same event, since we already bubbled it above\\n\\t\\t\\t\\t\\tjQuery.event.triggered = type;\\n\\t\\t\\t\\t\\telem[ type ]();\\n\\t\\t\\t\\t\\tjQuery.event.triggered = undefined;\\n\\n\\t\\t\\t\\t\\tif ( tmp ) {\\n\\t\\t\\t\\t\\t\\telem[ ontype ] = tmp;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn event.result;\\n\\t},\\n\\n\\t// Piggyback on a donor event to simulate a different one\\n\\t// Used only for `focus(in | out)` events\\n\\tsimulate: function( type, elem, event ) {\\n\\t\\tvar e = jQuery.extend(\\n\\t\\t\\tnew jQuery.Event(),\\n\\t\\t\\tevent,\\n\\t\\t\\t{\\n\\t\\t\\t\\ttype: type,\\n\\t\\t\\t\\tisSimulated: true\\n\\t\\t\\t}\\n\\t\\t);\\n\\n\\t\\tjQuery.event.trigger( e, null, elem );\\n\\t}\\n\\n} );\\n\\njQuery.fn.extend( {\\n\\n\\ttrigger: function( type, data ) {\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tjQuery.event.trigger( type, data, this );\\n\\t\\t} );\\n\\t},\\n\\ttriggerHandler: function( type, data ) {\\n\\t\\tvar elem = this[ 0 ];\\n\\t\\tif ( elem ) {\\n\\t\\t\\treturn jQuery.event.trigger( type, data, elem, true );\\n\\t\\t}\\n\\t}\\n} );\\n\\n\\njQuery.each( ( \\\"blur focus focusin focusout resize scroll click dblclick \\\" +\\n\\t\\\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \\\" +\\n\\t\\\"change select submit keydown keypress keyup contextmenu\\\" ).split( \\\" \\\" ),\\n\\tfunction( i, name ) {\\n\\n\\t// Handle event binding\\n\\tjQuery.fn[ name ] = function( data, fn ) {\\n\\t\\treturn arguments.length > 0 ?\\n\\t\\t\\tthis.on( name, null, data, fn ) :\\n\\t\\t\\tthis.trigger( name );\\n\\t};\\n} );\\n\\njQuery.fn.extend( {\\n\\thover: function( fnOver, fnOut ) {\\n\\t\\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\\n\\t}\\n} );\\n\\n\\n\\n\\nsupport.focusin = \\\"onfocusin\\\" in window;\\n\\n\\n// Support: Firefox <=44\\n// Firefox doesn't have focus(in | out) events\\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\\n//\\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\\n// focus(in | out) events fire after focus & blur events,\\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\\nif ( !support.focusin ) {\\n\\tjQuery.each( { focus: \\\"focusin\\\", blur: \\\"focusout\\\" }, function( orig, fix ) {\\n\\n\\t\\t// Attach a single capturing handler on the document while someone wants focusin/focusout\\n\\t\\tvar handler = function( event ) {\\n\\t\\t\\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\\n\\t\\t};\\n\\n\\t\\tjQuery.event.special[ fix ] = {\\n\\t\\t\\tsetup: function() {\\n\\t\\t\\t\\tvar doc = this.ownerDocument || this,\\n\\t\\t\\t\\t\\tattaches = dataPriv.access( doc, fix );\\n\\n\\t\\t\\t\\tif ( !attaches ) {\\n\\t\\t\\t\\t\\tdoc.addEventListener( orig, handler, true );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\\n\\t\\t\\t},\\n\\t\\t\\tteardown: function() {\\n\\t\\t\\t\\tvar doc = this.ownerDocument || this,\\n\\t\\t\\t\\t\\tattaches = dataPriv.access( doc, fix ) - 1;\\n\\n\\t\\t\\t\\tif ( !attaches ) {\\n\\t\\t\\t\\t\\tdoc.removeEventListener( orig, handler, true );\\n\\t\\t\\t\\t\\tdataPriv.remove( doc, fix );\\n\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tdataPriv.access( doc, fix, attaches );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t} );\\n}\\nvar location = window.location;\\n\\nvar nonce = jQuery.now();\\n\\nvar rquery = ( /\\\\?/ );\\n\\n\\n\\n// Cross-browser xml parsing\\njQuery.parseXML = function( data ) {\\n\\tvar xml;\\n\\tif ( !data || typeof data !== \\\"string\\\" ) {\\n\\t\\treturn null;\\n\\t}\\n\\n\\t// Support: IE 9 - 11 only\\n\\t// IE throws on parseFromString with invalid input.\\n\\ttry {\\n\\t\\txml = ( new window.DOMParser() ).parseFromString( data, \\\"text/xml\\\" );\\n\\t} catch ( e ) {\\n\\t\\txml = undefined;\\n\\t}\\n\\n\\tif ( !xml || xml.getElementsByTagName( \\\"parsererror\\\" ).length ) {\\n\\t\\tjQuery.error( \\\"Invalid XML: \\\" + data );\\n\\t}\\n\\treturn xml;\\n};\\n\\n\\nvar\\n\\trbracket = /\\\\[\\\\]$/,\\n\\trCRLF = /\\\\r?\\\\n/g,\\n\\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\\n\\trsubmittable = /^(?:input|select|textarea|keygen)/i;\\n\\nfunction buildParams( prefix, obj, traditional, add ) {\\n\\tvar name;\\n\\n\\tif ( jQuery.isArray( obj ) ) {\\n\\n\\t\\t// Serialize array item.\\n\\t\\tjQuery.each( obj, function( i, v ) {\\n\\t\\t\\tif ( traditional || rbracket.test( prefix ) ) {\\n\\n\\t\\t\\t\\t// Treat each array item as a scalar.\\n\\t\\t\\t\\tadd( prefix, v );\\n\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Item is non-scalar (array or object), encode its numeric index.\\n\\t\\t\\t\\tbuildParams(\\n\\t\\t\\t\\t\\tprefix + \\\"[\\\" + ( typeof v === \\\"object\\\" && v != null ? i : \\\"\\\" ) + \\\"]\\\",\\n\\t\\t\\t\\t\\tv,\\n\\t\\t\\t\\t\\ttraditional,\\n\\t\\t\\t\\t\\tadd\\n\\t\\t\\t\\t);\\n\\t\\t\\t}\\n\\t\\t} );\\n\\n\\t} else if ( !traditional && jQuery.type( obj ) === \\\"object\\\" ) {\\n\\n\\t\\t// Serialize object item.\\n\\t\\tfor ( name in obj ) {\\n\\t\\t\\tbuildParams( prefix + \\\"[\\\" + name + \\\"]\\\", obj[ name ], traditional, add );\\n\\t\\t}\\n\\n\\t} else {\\n\\n\\t\\t// Serialize scalar item.\\n\\t\\tadd( prefix, obj );\\n\\t}\\n}\\n\\n// Serialize an array of form elements or a set of\\n// key/values into a query string\\njQuery.param = function( a, traditional ) {\\n\\tvar prefix,\\n\\t\\ts = [],\\n\\t\\tadd = function( key, valueOrFunction ) {\\n\\n\\t\\t\\t// If value is a function, invoke it and use its return value\\n\\t\\t\\tvar value = jQuery.isFunction( valueOrFunction ) ?\\n\\t\\t\\t\\tvalueOrFunction() :\\n\\t\\t\\t\\tvalueOrFunction;\\n\\n\\t\\t\\ts[ s.length ] = encodeURIComponent( key ) + \\\"=\\\" +\\n\\t\\t\\t\\tencodeURIComponent( value == null ? \\\"\\\" : value );\\n\\t\\t};\\n\\n\\t// If an array was passed in, assume that it is an array of form elements.\\n\\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\\n\\n\\t\\t// Serialize the form elements\\n\\t\\tjQuery.each( a, function() {\\n\\t\\t\\tadd( this.name, this.value );\\n\\t\\t} );\\n\\n\\t} else {\\n\\n\\t\\t// If traditional, encode the \\\"old\\\" way (the way 1.3.2 or older\\n\\t\\t// did it), otherwise encode params recursively.\\n\\t\\tfor ( prefix in a ) {\\n\\t\\t\\tbuildParams( prefix, a[ prefix ], traditional, add );\\n\\t\\t}\\n\\t}\\n\\n\\t// Return the resulting serialization\\n\\treturn s.join( \\\"&\\\" );\\n};\\n\\njQuery.fn.extend( {\\n\\tserialize: function() {\\n\\t\\treturn jQuery.param( this.serializeArray() );\\n\\t},\\n\\tserializeArray: function() {\\n\\t\\treturn this.map( function() {\\n\\n\\t\\t\\t// Can add propHook for \\\"elements\\\" to filter or add form elements\\n\\t\\t\\tvar elements = jQuery.prop( this, \\\"elements\\\" );\\n\\t\\t\\treturn elements ? jQuery.makeArray( elements ) : this;\\n\\t\\t} )\\n\\t\\t.filter( function() {\\n\\t\\t\\tvar type = this.type;\\n\\n\\t\\t\\t// Use .is( \\\":disabled\\\" ) so that fieldset[disabled] works\\n\\t\\t\\treturn this.name && !jQuery( this ).is( \\\":disabled\\\" ) &&\\n\\t\\t\\t\\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\\n\\t\\t\\t\\t( this.checked || !rcheckableType.test( type ) );\\n\\t\\t} )\\n\\t\\t.map( function( i, elem ) {\\n\\t\\t\\tvar val = jQuery( this ).val();\\n\\n\\t\\t\\tif ( val == null ) {\\n\\t\\t\\t\\treturn null;\\n\\t\\t\\t}\\n\\n\\t\\t\\tif ( jQuery.isArray( val ) ) {\\n\\t\\t\\t\\treturn jQuery.map( val, function( val ) {\\n\\t\\t\\t\\t\\treturn { name: elem.name, value: val.replace( rCRLF, \\\"\\\\r\\\\n\\\" ) };\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn { name: elem.name, value: val.replace( rCRLF, \\\"\\\\r\\\\n\\\" ) };\\n\\t\\t} ).get();\\n\\t}\\n} );\\n\\n\\nvar\\n\\tr20 = /%20/g,\\n\\trhash = /#.*$/,\\n\\trantiCache = /([?&])_=[^&]*/,\\n\\trheaders = /^(.*?):[ \\\\t]*([^\\\\r\\\\n]*)$/mg,\\n\\n\\t// #7653, #8125, #8152: local protocol detection\\n\\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\\n\\trnoContent = /^(?:GET|HEAD)$/,\\n\\trprotocol = /^\\\\/\\\\//,\\n\\n\\t/* Prefilters\\n\\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\\n\\t * 2) These are called:\\n\\t * - BEFORE asking for a transport\\n\\t * - AFTER param serialization (s.data is a string if s.processData is true)\\n\\t * 3) key is the dataType\\n\\t * 4) the catchall symbol \\\"*\\\" can be used\\n\\t * 5) execution will start with transport dataType and THEN continue down to \\\"*\\\" if needed\\n\\t */\\n\\tprefilters = {},\\n\\n\\t/* Transports bindings\\n\\t * 1) key is the dataType\\n\\t * 2) the catchall symbol \\\"*\\\" can be used\\n\\t * 3) selection will start with transport dataType and THEN go to \\\"*\\\" if needed\\n\\t */\\n\\ttransports = {},\\n\\n\\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\\n\\tallTypes = \\\"*/\\\".concat( \\\"*\\\" ),\\n\\n\\t// Anchor tag for parsing the document origin\\n\\toriginAnchor = document.createElement( \\\"a\\\" );\\n\\toriginAnchor.href = location.href;\\n\\n// Base \\\"constructor\\\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\\nfunction addToPrefiltersOrTransports( structure ) {\\n\\n\\t// dataTypeExpression is optional and defaults to \\\"*\\\"\\n\\treturn function( dataTypeExpression, func ) {\\n\\n\\t\\tif ( typeof dataTypeExpression !== \\\"string\\\" ) {\\n\\t\\t\\tfunc = dataTypeExpression;\\n\\t\\t\\tdataTypeExpression = \\\"*\\\";\\n\\t\\t}\\n\\n\\t\\tvar dataType,\\n\\t\\t\\ti = 0,\\n\\t\\t\\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\\n\\n\\t\\tif ( jQuery.isFunction( func ) ) {\\n\\n\\t\\t\\t// For each dataType in the dataTypeExpression\\n\\t\\t\\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\\n\\n\\t\\t\\t\\t// Prepend if requested\\n\\t\\t\\t\\tif ( dataType[ 0 ] === \\\"+\\\" ) {\\n\\t\\t\\t\\t\\tdataType = dataType.slice( 1 ) || \\\"*\\\";\\n\\t\\t\\t\\t\\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\\n\\n\\t\\t\\t\\t// Otherwise append\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n}\\n\\n// Base inspection function for prefilters and transports\\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\\n\\n\\tvar inspected = {},\\n\\t\\tseekingTransport = ( structure === transports );\\n\\n\\tfunction inspect( dataType ) {\\n\\t\\tvar selected;\\n\\t\\tinspected[ dataType ] = true;\\n\\t\\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\\n\\t\\t\\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\\n\\t\\t\\tif ( typeof dataTypeOrTransport === \\\"string\\\" &&\\n\\t\\t\\t\\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\\n\\n\\t\\t\\t\\toptions.dataTypes.unshift( dataTypeOrTransport );\\n\\t\\t\\t\\tinspect( dataTypeOrTransport );\\n\\t\\t\\t\\treturn false;\\n\\t\\t\\t} else if ( seekingTransport ) {\\n\\t\\t\\t\\treturn !( selected = dataTypeOrTransport );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t\\treturn selected;\\n\\t}\\n\\n\\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \\\"*\\\" ] && inspect( \\\"*\\\" );\\n}\\n\\n// A special extend for ajax options\\n// that takes \\\"flat\\\" options (not to be deep extended)\\n// Fixes #9887\\nfunction ajaxExtend( target, src ) {\\n\\tvar key, deep,\\n\\t\\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\\n\\n\\tfor ( key in src ) {\\n\\t\\tif ( src[ key ] !== undefined ) {\\n\\t\\t\\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\\n\\t\\t}\\n\\t}\\n\\tif ( deep ) {\\n\\t\\tjQuery.extend( true, target, deep );\\n\\t}\\n\\n\\treturn target;\\n}\\n\\n/* Handles responses to an ajax request:\\n * - finds the right dataType (mediates between content-type and expected dataType)\\n * - returns the corresponding response\\n */\\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\\n\\n\\tvar ct, type, finalDataType, firstDataType,\\n\\t\\tcontents = s.contents,\\n\\t\\tdataTypes = s.dataTypes;\\n\\n\\t// Remove auto dataType and get content-type in the process\\n\\twhile ( dataTypes[ 0 ] === \\\"*\\\" ) {\\n\\t\\tdataTypes.shift();\\n\\t\\tif ( ct === undefined ) {\\n\\t\\t\\tct = s.mimeType || jqXHR.getResponseHeader( \\\"Content-Type\\\" );\\n\\t\\t}\\n\\t}\\n\\n\\t// Check if we're dealing with a known content-type\\n\\tif ( ct ) {\\n\\t\\tfor ( type in contents ) {\\n\\t\\t\\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\\n\\t\\t\\t\\tdataTypes.unshift( type );\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\t// Check to see if we have a response for the expected dataType\\n\\tif ( dataTypes[ 0 ] in responses ) {\\n\\t\\tfinalDataType = dataTypes[ 0 ];\\n\\t} else {\\n\\n\\t\\t// Try convertible dataTypes\\n\\t\\tfor ( type in responses ) {\\n\\t\\t\\tif ( !dataTypes[ 0 ] || s.converters[ type + \\\" \\\" + dataTypes[ 0 ] ] ) {\\n\\t\\t\\t\\tfinalDataType = type;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tif ( !firstDataType ) {\\n\\t\\t\\t\\tfirstDataType = type;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Or just use first one\\n\\t\\tfinalDataType = finalDataType || firstDataType;\\n\\t}\\n\\n\\t// If we found a dataType\\n\\t// We add the dataType to the list if needed\\n\\t// and return the corresponding response\\n\\tif ( finalDataType ) {\\n\\t\\tif ( finalDataType !== dataTypes[ 0 ] ) {\\n\\t\\t\\tdataTypes.unshift( finalDataType );\\n\\t\\t}\\n\\t\\treturn responses[ finalDataType ];\\n\\t}\\n}\\n\\n/* Chain conversions given the request and the original response\\n * Also sets the responseXXX fields on the jqXHR instance\\n */\\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\\n\\tvar conv2, current, conv, tmp, prev,\\n\\t\\tconverters = {},\\n\\n\\t\\t// Work with a copy of dataTypes in case we need to modify it for conversion\\n\\t\\tdataTypes = s.dataTypes.slice();\\n\\n\\t// Create converters map with lowercased keys\\n\\tif ( dataTypes[ 1 ] ) {\\n\\t\\tfor ( conv in s.converters ) {\\n\\t\\t\\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\\n\\t\\t}\\n\\t}\\n\\n\\tcurrent = dataTypes.shift();\\n\\n\\t// Convert to each sequential dataType\\n\\twhile ( current ) {\\n\\n\\t\\tif ( s.responseFields[ current ] ) {\\n\\t\\t\\tjqXHR[ s.responseFields[ current ] ] = response;\\n\\t\\t}\\n\\n\\t\\t// Apply the dataFilter if provided\\n\\t\\tif ( !prev && isSuccess && s.dataFilter ) {\\n\\t\\t\\tresponse = s.dataFilter( response, s.dataType );\\n\\t\\t}\\n\\n\\t\\tprev = current;\\n\\t\\tcurrent = dataTypes.shift();\\n\\n\\t\\tif ( current ) {\\n\\n\\t\\t\\t// There's only work to do if current dataType is non-auto\\n\\t\\t\\tif ( current === \\\"*\\\" ) {\\n\\n\\t\\t\\t\\tcurrent = prev;\\n\\n\\t\\t\\t// Convert response if prev dataType is non-auto and differs from current\\n\\t\\t\\t} else if ( prev !== \\\"*\\\" && prev !== current ) {\\n\\n\\t\\t\\t\\t// Seek a direct converter\\n\\t\\t\\t\\tconv = converters[ prev + \\\" \\\" + current ] || converters[ \\\"* \\\" + current ];\\n\\n\\t\\t\\t\\t// If none found, seek a pair\\n\\t\\t\\t\\tif ( !conv ) {\\n\\t\\t\\t\\t\\tfor ( conv2 in converters ) {\\n\\n\\t\\t\\t\\t\\t\\t// If conv2 outputs current\\n\\t\\t\\t\\t\\t\\ttmp = conv2.split( \\\" \\\" );\\n\\t\\t\\t\\t\\t\\tif ( tmp[ 1 ] === current ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// If prev can be converted to accepted input\\n\\t\\t\\t\\t\\t\\t\\tconv = converters[ prev + \\\" \\\" + tmp[ 0 ] ] ||\\n\\t\\t\\t\\t\\t\\t\\t\\tconverters[ \\\"* \\\" + tmp[ 0 ] ];\\n\\t\\t\\t\\t\\t\\t\\tif ( conv ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Condense equivalence converters\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( conv === true ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tconv = converters[ conv2 ];\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Otherwise, insert the intermediate dataType\\n\\t\\t\\t\\t\\t\\t\\t\\t} else if ( converters[ conv2 ] !== true ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcurrent = tmp[ 0 ];\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tdataTypes.unshift( tmp[ 1 ] );\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Apply converter (if not an equivalence)\\n\\t\\t\\t\\tif ( conv !== true ) {\\n\\n\\t\\t\\t\\t\\t// Unless errors are allowed to bubble, catch and return them\\n\\t\\t\\t\\t\\tif ( conv && s.throws ) {\\n\\t\\t\\t\\t\\t\\tresponse = conv( response );\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\t\\t\\tresponse = conv( response );\\n\\t\\t\\t\\t\\t\\t} catch ( e ) {\\n\\t\\t\\t\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\t\\t\\t\\tstate: \\\"parsererror\\\",\\n\\t\\t\\t\\t\\t\\t\\t\\terror: conv ? e : \\\"No conversion from \\\" + prev + \\\" to \\\" + current\\n\\t\\t\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\n\\treturn { state: \\\"success\\\", data: response };\\n}\\n\\njQuery.extend( {\\n\\n\\t// Counter for holding the number of active queries\\n\\tactive: 0,\\n\\n\\t// Last-Modified header cache for next request\\n\\tlastModified: {},\\n\\tetag: {},\\n\\n\\tajaxSettings: {\\n\\t\\turl: location.href,\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\tisLocal: rlocalProtocol.test( location.protocol ),\\n\\t\\tglobal: true,\\n\\t\\tprocessData: true,\\n\\t\\tasync: true,\\n\\t\\tcontentType: \\\"application/x-www-form-urlencoded; charset=UTF-8\\\",\\n\\n\\t\\t/*\\n\\t\\ttimeout: 0,\\n\\t\\tdata: null,\\n\\t\\tdataType: null,\\n\\t\\tusername: null,\\n\\t\\tpassword: null,\\n\\t\\tcache: null,\\n\\t\\tthrows: false,\\n\\t\\ttraditional: false,\\n\\t\\theaders: {},\\n\\t\\t*/\\n\\n\\t\\taccepts: {\\n\\t\\t\\t\\\"*\\\": allTypes,\\n\\t\\t\\ttext: \\\"text/plain\\\",\\n\\t\\t\\thtml: \\\"text/html\\\",\\n\\t\\t\\txml: \\\"application/xml, text/xml\\\",\\n\\t\\t\\tjson: \\\"application/json, text/javascript\\\"\\n\\t\\t},\\n\\n\\t\\tcontents: {\\n\\t\\t\\txml: /\\\\bxml\\\\b/,\\n\\t\\t\\thtml: /\\\\bhtml/,\\n\\t\\t\\tjson: /\\\\bjson\\\\b/\\n\\t\\t},\\n\\n\\t\\tresponseFields: {\\n\\t\\t\\txml: \\\"responseXML\\\",\\n\\t\\t\\ttext: \\\"responseText\\\",\\n\\t\\t\\tjson: \\\"responseJSON\\\"\\n\\t\\t},\\n\\n\\t\\t// Data converters\\n\\t\\t// Keys separate source (or catchall \\\"*\\\") and destination types with a single space\\n\\t\\tconverters: {\\n\\n\\t\\t\\t// Convert anything to text\\n\\t\\t\\t\\\"* text\\\": String,\\n\\n\\t\\t\\t// Text to html (true = no transformation)\\n\\t\\t\\t\\\"text html\\\": true,\\n\\n\\t\\t\\t// Evaluate text as a json expression\\n\\t\\t\\t\\\"text json\\\": JSON.parse,\\n\\n\\t\\t\\t// Parse text as xml\\n\\t\\t\\t\\\"text xml\\\": jQuery.parseXML\\n\\t\\t},\\n\\n\\t\\t// For options that shouldn't be deep extended:\\n\\t\\t// you can add your own custom options here if\\n\\t\\t// and when you create one that shouldn't be\\n\\t\\t// deep extended (see ajaxExtend)\\n\\t\\tflatOptions: {\\n\\t\\t\\turl: true,\\n\\t\\t\\tcontext: true\\n\\t\\t}\\n\\t},\\n\\n\\t// Creates a full fledged settings object into target\\n\\t// with both ajaxSettings and settings fields.\\n\\t// If target is omitted, writes into ajaxSettings.\\n\\tajaxSetup: function( target, settings ) {\\n\\t\\treturn settings ?\\n\\n\\t\\t\\t// Building a settings object\\n\\t\\t\\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\\n\\n\\t\\t\\t// Extending ajaxSettings\\n\\t\\t\\tajaxExtend( jQuery.ajaxSettings, target );\\n\\t},\\n\\n\\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\\n\\tajaxTransport: addToPrefiltersOrTransports( transports ),\\n\\n\\t// Main method\\n\\tajax: function( url, options ) {\\n\\n\\t\\t// If url is an object, simulate pre-1.5 signature\\n\\t\\tif ( typeof url === \\\"object\\\" ) {\\n\\t\\t\\toptions = url;\\n\\t\\t\\turl = undefined;\\n\\t\\t}\\n\\n\\t\\t// Force options to be an object\\n\\t\\toptions = options || {};\\n\\n\\t\\tvar transport,\\n\\n\\t\\t\\t// URL without anti-cache param\\n\\t\\t\\tcacheURL,\\n\\n\\t\\t\\t// Response headers\\n\\t\\t\\tresponseHeadersString,\\n\\t\\t\\tresponseHeaders,\\n\\n\\t\\t\\t// timeout handle\\n\\t\\t\\ttimeoutTimer,\\n\\n\\t\\t\\t// Url cleanup var\\n\\t\\t\\turlAnchor,\\n\\n\\t\\t\\t// Request state (becomes false upon send and true upon completion)\\n\\t\\t\\tcompleted,\\n\\n\\t\\t\\t// To know if global events are to be dispatched\\n\\t\\t\\tfireGlobals,\\n\\n\\t\\t\\t// Loop variable\\n\\t\\t\\ti,\\n\\n\\t\\t\\t// uncached part of the url\\n\\t\\t\\tuncached,\\n\\n\\t\\t\\t// Create the final options object\\n\\t\\t\\ts = jQuery.ajaxSetup( {}, options ),\\n\\n\\t\\t\\t// Callbacks context\\n\\t\\t\\tcallbackContext = s.context || s,\\n\\n\\t\\t\\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\\n\\t\\t\\tglobalEventContext = s.context &&\\n\\t\\t\\t\\t( callbackContext.nodeType || callbackContext.jquery ) ?\\n\\t\\t\\t\\t\\tjQuery( callbackContext ) :\\n\\t\\t\\t\\t\\tjQuery.event,\\n\\n\\t\\t\\t// Deferreds\\n\\t\\t\\tdeferred = jQuery.Deferred(),\\n\\t\\t\\tcompleteDeferred = jQuery.Callbacks( \\\"once memory\\\" ),\\n\\n\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\tstatusCode = s.statusCode || {},\\n\\n\\t\\t\\t// Headers (they are sent all at once)\\n\\t\\t\\trequestHeaders = {},\\n\\t\\t\\trequestHeadersNames = {},\\n\\n\\t\\t\\t// Default abort message\\n\\t\\t\\tstrAbort = \\\"canceled\\\",\\n\\n\\t\\t\\t// Fake xhr\\n\\t\\t\\tjqXHR = {\\n\\t\\t\\t\\treadyState: 0,\\n\\n\\t\\t\\t\\t// Builds headers hashtable if needed\\n\\t\\t\\t\\tgetResponseHeader: function( key ) {\\n\\t\\t\\t\\t\\tvar match;\\n\\t\\t\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\t\\t\\tif ( !responseHeaders ) {\\n\\t\\t\\t\\t\\t\\t\\tresponseHeaders = {};\\n\\t\\t\\t\\t\\t\\t\\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tmatch = responseHeaders[ key.toLowerCase() ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn match == null ? null : match;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Raw string\\n\\t\\t\\t\\tgetAllResponseHeaders: function() {\\n\\t\\t\\t\\t\\treturn completed ? responseHeadersString : null;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Caches the header\\n\\t\\t\\t\\tsetRequestHeader: function( name, value ) {\\n\\t\\t\\t\\t\\tif ( completed == null ) {\\n\\t\\t\\t\\t\\t\\tname = requestHeadersNames[ name.toLowerCase() ] =\\n\\t\\t\\t\\t\\t\\t\\trequestHeadersNames[ name.toLowerCase() ] || name;\\n\\t\\t\\t\\t\\t\\trequestHeaders[ name ] = value;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Overrides response content-type header\\n\\t\\t\\t\\toverrideMimeType: function( type ) {\\n\\t\\t\\t\\t\\tif ( completed == null ) {\\n\\t\\t\\t\\t\\t\\ts.mimeType = type;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\t\\tstatusCode: function( map ) {\\n\\t\\t\\t\\t\\tvar code;\\n\\t\\t\\t\\t\\tif ( map ) {\\n\\t\\t\\t\\t\\t\\tif ( completed ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Execute the appropriate callbacks\\n\\t\\t\\t\\t\\t\\t\\tjqXHR.always( map[ jqXHR.status ] );\\n\\t\\t\\t\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Lazy-add the new callbacks in a way that preserves old ones\\n\\t\\t\\t\\t\\t\\t\\tfor ( code in map ) {\\n\\t\\t\\t\\t\\t\\t\\t\\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t},\\n\\n\\t\\t\\t\\t// Cancel the request\\n\\t\\t\\t\\tabort: function( statusText ) {\\n\\t\\t\\t\\t\\tvar finalText = statusText || strAbort;\\n\\t\\t\\t\\t\\tif ( transport ) {\\n\\t\\t\\t\\t\\t\\ttransport.abort( finalText );\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tdone( 0, finalText );\\n\\t\\t\\t\\t\\treturn this;\\n\\t\\t\\t\\t}\\n\\t\\t\\t};\\n\\n\\t\\t// Attach deferreds\\n\\t\\tdeferred.promise( jqXHR );\\n\\n\\t\\t// Add protocol if not provided (prefilters might expect it)\\n\\t\\t// Handle falsy url in the settings object (#10093: consistency with old signature)\\n\\t\\t// We also use the url parameter if available\\n\\t\\ts.url = ( ( url || s.url || location.href ) + \\\"\\\" )\\n\\t\\t\\t.replace( rprotocol, location.protocol + \\\"//\\\" );\\n\\n\\t\\t// Alias method option to type as per ticket #12004\\n\\t\\ts.type = options.method || options.type || s.method || s.type;\\n\\n\\t\\t// Extract dataTypes list\\n\\t\\ts.dataTypes = ( s.dataType || \\\"*\\\" ).toLowerCase().match( rnothtmlwhite ) || [ \\\"\\\" ];\\n\\n\\t\\t// A cross-domain request is in order when the origin doesn't match the current origin.\\n\\t\\tif ( s.crossDomain == null ) {\\n\\t\\t\\turlAnchor = document.createElement( \\\"a\\\" );\\n\\n\\t\\t\\t// Support: IE <=8 - 11, Edge 12 - 13\\n\\t\\t\\t// IE throws exception on accessing the href property if url is malformed,\\n\\t\\t\\t// e.g. http://example.com:80x/\\n\\t\\t\\ttry {\\n\\t\\t\\t\\turlAnchor.href = s.url;\\n\\n\\t\\t\\t\\t// Support: IE <=8 - 11 only\\n\\t\\t\\t\\t// Anchor's host property isn't correctly set when s.url is relative\\n\\t\\t\\t\\turlAnchor.href = urlAnchor.href;\\n\\t\\t\\t\\ts.crossDomain = originAnchor.protocol + \\\"//\\\" + originAnchor.host !==\\n\\t\\t\\t\\t\\turlAnchor.protocol + \\\"//\\\" + urlAnchor.host;\\n\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t// If there is an error parsing the URL, assume it is crossDomain,\\n\\t\\t\\t\\t// it can be rejected by the transport if it is invalid\\n\\t\\t\\t\\ts.crossDomain = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Convert data if not already a string\\n\\t\\tif ( s.data && s.processData && typeof s.data !== \\\"string\\\" ) {\\n\\t\\t\\ts.data = jQuery.param( s.data, s.traditional );\\n\\t\\t}\\n\\n\\t\\t// Apply prefilters\\n\\t\\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\\n\\n\\t\\t// If request was aborted inside a prefilter, stop there\\n\\t\\tif ( completed ) {\\n\\t\\t\\treturn jqXHR;\\n\\t\\t}\\n\\n\\t\\t// We can fire global events as of now if asked to\\n\\t\\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\\n\\t\\tfireGlobals = jQuery.event && s.global;\\n\\n\\t\\t// Watch for a new set of requests\\n\\t\\tif ( fireGlobals && jQuery.active++ === 0 ) {\\n\\t\\t\\tjQuery.event.trigger( \\\"ajaxStart\\\" );\\n\\t\\t}\\n\\n\\t\\t// Uppercase the type\\n\\t\\ts.type = s.type.toUpperCase();\\n\\n\\t\\t// Determine if request has content\\n\\t\\ts.hasContent = !rnoContent.test( s.type );\\n\\n\\t\\t// Save the URL in case we're toying with the If-Modified-Since\\n\\t\\t// and/or If-None-Match header later on\\n\\t\\t// Remove hash to simplify url manipulation\\n\\t\\tcacheURL = s.url.replace( rhash, \\\"\\\" );\\n\\n\\t\\t// More options handling for requests with no content\\n\\t\\tif ( !s.hasContent ) {\\n\\n\\t\\t\\t// Remember the hash so we can put it back\\n\\t\\t\\tuncached = s.url.slice( cacheURL.length );\\n\\n\\t\\t\\t// If data is available, append data to url\\n\\t\\t\\tif ( s.data ) {\\n\\t\\t\\t\\tcacheURL += ( rquery.test( cacheURL ) ? \\\"&\\\" : \\\"?\\\" ) + s.data;\\n\\n\\t\\t\\t\\t// #9682: remove data so that it's not used in an eventual retry\\n\\t\\t\\t\\tdelete s.data;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Add or update anti-cache param if needed\\n\\t\\t\\tif ( s.cache === false ) {\\n\\t\\t\\t\\tcacheURL = cacheURL.replace( rantiCache, \\\"$1\\\" );\\n\\t\\t\\t\\tuncached = ( rquery.test( cacheURL ) ? \\\"&\\\" : \\\"?\\\" ) + \\\"_=\\\" + ( nonce++ ) + uncached;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\\n\\t\\t\\ts.url = cacheURL + uncached;\\n\\n\\t\\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\\n\\t\\t} else if ( s.data && s.processData &&\\n\\t\\t\\t( s.contentType || \\\"\\\" ).indexOf( \\\"application/x-www-form-urlencoded\\\" ) === 0 ) {\\n\\t\\t\\ts.data = s.data.replace( r20, \\\"+\\\" );\\n\\t\\t}\\n\\n\\t\\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\\n\\t\\tif ( s.ifModified ) {\\n\\t\\t\\tif ( jQuery.lastModified[ cacheURL ] ) {\\n\\t\\t\\t\\tjqXHR.setRequestHeader( \\\"If-Modified-Since\\\", jQuery.lastModified[ cacheURL ] );\\n\\t\\t\\t}\\n\\t\\t\\tif ( jQuery.etag[ cacheURL ] ) {\\n\\t\\t\\t\\tjqXHR.setRequestHeader( \\\"If-None-Match\\\", jQuery.etag[ cacheURL ] );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Set the correct header, if data is being sent\\n\\t\\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\\n\\t\\t\\tjqXHR.setRequestHeader( \\\"Content-Type\\\", s.contentType );\\n\\t\\t}\\n\\n\\t\\t// Set the Accepts header for the server, depending on the dataType\\n\\t\\tjqXHR.setRequestHeader(\\n\\t\\t\\t\\\"Accept\\\",\\n\\t\\t\\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\\n\\t\\t\\t\\ts.accepts[ s.dataTypes[ 0 ] ] +\\n\\t\\t\\t\\t\\t( s.dataTypes[ 0 ] !== \\\"*\\\" ? \\\", \\\" + allTypes + \\\"; q=0.01\\\" : \\\"\\\" ) :\\n\\t\\t\\t\\ts.accepts[ \\\"*\\\" ]\\n\\t\\t);\\n\\n\\t\\t// Check for headers option\\n\\t\\tfor ( i in s.headers ) {\\n\\t\\t\\tjqXHR.setRequestHeader( i, s.headers[ i ] );\\n\\t\\t}\\n\\n\\t\\t// Allow custom headers/mimetypes and early abort\\n\\t\\tif ( s.beforeSend &&\\n\\t\\t\\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\\n\\n\\t\\t\\t// Abort if not done already and return\\n\\t\\t\\treturn jqXHR.abort();\\n\\t\\t}\\n\\n\\t\\t// Aborting is no longer a cancellation\\n\\t\\tstrAbort = \\\"abort\\\";\\n\\n\\t\\t// Install callbacks on deferreds\\n\\t\\tcompleteDeferred.add( s.complete );\\n\\t\\tjqXHR.done( s.success );\\n\\t\\tjqXHR.fail( s.error );\\n\\n\\t\\t// Get transport\\n\\t\\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\\n\\n\\t\\t// If no transport, we auto-abort\\n\\t\\tif ( !transport ) {\\n\\t\\t\\tdone( -1, \\\"No Transport\\\" );\\n\\t\\t} else {\\n\\t\\t\\tjqXHR.readyState = 1;\\n\\n\\t\\t\\t// Send global event\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( \\\"ajaxSend\\\", [ jqXHR, s ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// If request was aborted inside ajaxSend, stop there\\n\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\treturn jqXHR;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Timeout\\n\\t\\t\\tif ( s.async && s.timeout > 0 ) {\\n\\t\\t\\t\\ttimeoutTimer = window.setTimeout( function() {\\n\\t\\t\\t\\t\\tjqXHR.abort( \\\"timeout\\\" );\\n\\t\\t\\t\\t}, s.timeout );\\n\\t\\t\\t}\\n\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tcompleted = false;\\n\\t\\t\\t\\ttransport.send( requestHeaders, done );\\n\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t// Rethrow post-completion exceptions\\n\\t\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\t\\tthrow e;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Propagate others as results\\n\\t\\t\\t\\tdone( -1, e );\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Callback for when everything is done\\n\\t\\tfunction done( status, nativeStatusText, responses, headers ) {\\n\\t\\t\\tvar isSuccess, success, error, response, modified,\\n\\t\\t\\t\\tstatusText = nativeStatusText;\\n\\n\\t\\t\\t// Ignore repeat invocations\\n\\t\\t\\tif ( completed ) {\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\n\\t\\t\\tcompleted = true;\\n\\n\\t\\t\\t// Clear timeout if it exists\\n\\t\\t\\tif ( timeoutTimer ) {\\n\\t\\t\\t\\twindow.clearTimeout( timeoutTimer );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Dereference transport for early garbage collection\\n\\t\\t\\t// (no matter how long the jqXHR object will be used)\\n\\t\\t\\ttransport = undefined;\\n\\n\\t\\t\\t// Cache response headers\\n\\t\\t\\tresponseHeadersString = headers || \\\"\\\";\\n\\n\\t\\t\\t// Set readyState\\n\\t\\t\\tjqXHR.readyState = status > 0 ? 4 : 0;\\n\\n\\t\\t\\t// Determine if successful\\n\\t\\t\\tisSuccess = status >= 200 && status < 300 || status === 304;\\n\\n\\t\\t\\t// Get response data\\n\\t\\t\\tif ( responses ) {\\n\\t\\t\\t\\tresponse = ajaxHandleResponses( s, jqXHR, responses );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Convert no matter what (that way responseXXX fields are always set)\\n\\t\\t\\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\\n\\n\\t\\t\\t// If successful, handle type chaining\\n\\t\\t\\tif ( isSuccess ) {\\n\\n\\t\\t\\t\\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\\n\\t\\t\\t\\tif ( s.ifModified ) {\\n\\t\\t\\t\\t\\tmodified = jqXHR.getResponseHeader( \\\"Last-Modified\\\" );\\n\\t\\t\\t\\t\\tif ( modified ) {\\n\\t\\t\\t\\t\\t\\tjQuery.lastModified[ cacheURL ] = modified;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tmodified = jqXHR.getResponseHeader( \\\"etag\\\" );\\n\\t\\t\\t\\t\\tif ( modified ) {\\n\\t\\t\\t\\t\\t\\tjQuery.etag[ cacheURL ] = modified;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// if no content\\n\\t\\t\\t\\tif ( status === 204 || s.type === \\\"HEAD\\\" ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"nocontent\\\";\\n\\n\\t\\t\\t\\t// if not modified\\n\\t\\t\\t\\t} else if ( status === 304 ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"notmodified\\\";\\n\\n\\t\\t\\t\\t// If we have data, let's convert it\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tstatusText = response.state;\\n\\t\\t\\t\\t\\tsuccess = response.data;\\n\\t\\t\\t\\t\\terror = response.error;\\n\\t\\t\\t\\t\\tisSuccess = !error;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\n\\t\\t\\t\\t// Extract error from statusText and normalize for non-aborts\\n\\t\\t\\t\\terror = statusText;\\n\\t\\t\\t\\tif ( status || !statusText ) {\\n\\t\\t\\t\\t\\tstatusText = \\\"error\\\";\\n\\t\\t\\t\\t\\tif ( status < 0 ) {\\n\\t\\t\\t\\t\\t\\tstatus = 0;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Set data for the fake xhr object\\n\\t\\t\\tjqXHR.status = status;\\n\\t\\t\\tjqXHR.statusText = ( nativeStatusText || statusText ) + \\\"\\\";\\n\\n\\t\\t\\t// Success/Error\\n\\t\\t\\tif ( isSuccess ) {\\n\\t\\t\\t\\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Status-dependent callbacks\\n\\t\\t\\tjqXHR.statusCode( statusCode );\\n\\t\\t\\tstatusCode = undefined;\\n\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( isSuccess ? \\\"ajaxSuccess\\\" : \\\"ajaxError\\\",\\n\\t\\t\\t\\t\\t[ jqXHR, s, isSuccess ? success : error ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Complete\\n\\t\\t\\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\\n\\n\\t\\t\\tif ( fireGlobals ) {\\n\\t\\t\\t\\tglobalEventContext.trigger( \\\"ajaxComplete\\\", [ jqXHR, s ] );\\n\\n\\t\\t\\t\\t// Handle the global AJAX counter\\n\\t\\t\\t\\tif ( !( --jQuery.active ) ) {\\n\\t\\t\\t\\t\\tjQuery.event.trigger( \\\"ajaxStop\\\" );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn jqXHR;\\n\\t},\\n\\n\\tgetJSON: function( url, data, callback ) {\\n\\t\\treturn jQuery.get( url, data, callback, \\\"json\\\" );\\n\\t},\\n\\n\\tgetScript: function( url, callback ) {\\n\\t\\treturn jQuery.get( url, undefined, callback, \\\"script\\\" );\\n\\t}\\n} );\\n\\njQuery.each( [ \\\"get\\\", \\\"post\\\" ], function( i, method ) {\\n\\tjQuery[ method ] = function( url, data, callback, type ) {\\n\\n\\t\\t// Shift arguments if data argument was omitted\\n\\t\\tif ( jQuery.isFunction( data ) ) {\\n\\t\\t\\ttype = type || callback;\\n\\t\\t\\tcallback = data;\\n\\t\\t\\tdata = undefined;\\n\\t\\t}\\n\\n\\t\\t// The url can be an options object (which then must have .url)\\n\\t\\treturn jQuery.ajax( jQuery.extend( {\\n\\t\\t\\turl: url,\\n\\t\\t\\ttype: method,\\n\\t\\t\\tdataType: type,\\n\\t\\t\\tdata: data,\\n\\t\\t\\tsuccess: callback\\n\\t\\t}, jQuery.isPlainObject( url ) && url ) );\\n\\t};\\n} );\\n\\n\\njQuery._evalUrl = function( url ) {\\n\\treturn jQuery.ajax( {\\n\\t\\turl: url,\\n\\n\\t\\t// Make this explicit, since user can override this through ajaxSetup (#11264)\\n\\t\\ttype: \\\"GET\\\",\\n\\t\\tdataType: \\\"script\\\",\\n\\t\\tcache: true,\\n\\t\\tasync: false,\\n\\t\\tglobal: false,\\n\\t\\t\\\"throws\\\": true\\n\\t} );\\n};\\n\\n\\njQuery.fn.extend( {\\n\\twrapAll: function( html ) {\\n\\t\\tvar wrap;\\n\\n\\t\\tif ( this[ 0 ] ) {\\n\\t\\t\\tif ( jQuery.isFunction( html ) ) {\\n\\t\\t\\t\\thtml = html.call( this[ 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// The elements to wrap the target around\\n\\t\\t\\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\\n\\n\\t\\t\\tif ( this[ 0 ].parentNode ) {\\n\\t\\t\\t\\twrap.insertBefore( this[ 0 ] );\\n\\t\\t\\t}\\n\\n\\t\\t\\twrap.map( function() {\\n\\t\\t\\t\\tvar elem = this;\\n\\n\\t\\t\\t\\twhile ( elem.firstElementChild ) {\\n\\t\\t\\t\\t\\telem = elem.firstElementChild;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\treturn elem;\\n\\t\\t\\t} ).append( this );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\twrapInner: function( html ) {\\n\\t\\tif ( jQuery.isFunction( html ) ) {\\n\\t\\t\\treturn this.each( function( i ) {\\n\\t\\t\\t\\tjQuery( this ).wrapInner( html.call( this, i ) );\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn this.each( function() {\\n\\t\\t\\tvar self = jQuery( this ),\\n\\t\\t\\t\\tcontents = self.contents();\\n\\n\\t\\t\\tif ( contents.length ) {\\n\\t\\t\\t\\tcontents.wrapAll( html );\\n\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tself.append( html );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\twrap: function( html ) {\\n\\t\\tvar isFunction = jQuery.isFunction( html );\\n\\n\\t\\treturn this.each( function( i ) {\\n\\t\\t\\tjQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );\\n\\t\\t} );\\n\\t},\\n\\n\\tunwrap: function( selector ) {\\n\\t\\tthis.parent( selector ).not( \\\"body\\\" ).each( function() {\\n\\t\\t\\tjQuery( this ).replaceWith( this.childNodes );\\n\\t\\t} );\\n\\t\\treturn this;\\n\\t}\\n} );\\n\\n\\njQuery.expr.pseudos.hidden = function( elem ) {\\n\\treturn !jQuery.expr.pseudos.visible( elem );\\n};\\njQuery.expr.pseudos.visible = function( elem ) {\\n\\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\\n};\\n\\n\\n\\n\\njQuery.ajaxSettings.xhr = function() {\\n\\ttry {\\n\\t\\treturn new window.XMLHttpRequest();\\n\\t} catch ( e ) {}\\n};\\n\\nvar xhrSuccessStatus = {\\n\\n\\t\\t// File protocol always yields status code 0, assume 200\\n\\t\\t0: 200,\\n\\n\\t\\t// Support: IE <=9 only\\n\\t\\t// #1450: sometimes IE returns 1223 when it should be 204\\n\\t\\t1223: 204\\n\\t},\\n\\txhrSupported = jQuery.ajaxSettings.xhr();\\n\\nsupport.cors = !!xhrSupported && ( \\\"withCredentials\\\" in xhrSupported );\\nsupport.ajax = xhrSupported = !!xhrSupported;\\n\\njQuery.ajaxTransport( function( options ) {\\n\\tvar callback, errorCallback;\\n\\n\\t// Cross domain only allowed if supported through XMLHttpRequest\\n\\tif ( support.cors || xhrSupported && !options.crossDomain ) {\\n\\t\\treturn {\\n\\t\\t\\tsend: function( headers, complete ) {\\n\\t\\t\\t\\tvar i,\\n\\t\\t\\t\\t\\txhr = options.xhr();\\n\\n\\t\\t\\t\\txhr.open(\\n\\t\\t\\t\\t\\toptions.type,\\n\\t\\t\\t\\t\\toptions.url,\\n\\t\\t\\t\\t\\toptions.async,\\n\\t\\t\\t\\t\\toptions.username,\\n\\t\\t\\t\\t\\toptions.password\\n\\t\\t\\t\\t);\\n\\n\\t\\t\\t\\t// Apply custom fields if provided\\n\\t\\t\\t\\tif ( options.xhrFields ) {\\n\\t\\t\\t\\t\\tfor ( i in options.xhrFields ) {\\n\\t\\t\\t\\t\\t\\txhr[ i ] = options.xhrFields[ i ];\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Override mime type if needed\\n\\t\\t\\t\\tif ( options.mimeType && xhr.overrideMimeType ) {\\n\\t\\t\\t\\t\\txhr.overrideMimeType( options.mimeType );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// X-Requested-With header\\n\\t\\t\\t\\t// For cross-domain requests, seeing as conditions for a preflight are\\n\\t\\t\\t\\t// akin to a jigsaw puzzle, we simply never set it to be sure.\\n\\t\\t\\t\\t// (it can always be set on a per-request basis or even using ajaxSetup)\\n\\t\\t\\t\\t// For same-domain requests, won't change header if already provided.\\n\\t\\t\\t\\tif ( !options.crossDomain && !headers[ \\\"X-Requested-With\\\" ] ) {\\n\\t\\t\\t\\t\\theaders[ \\\"X-Requested-With\\\" ] = \\\"XMLHttpRequest\\\";\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Set headers\\n\\t\\t\\t\\tfor ( i in headers ) {\\n\\t\\t\\t\\t\\txhr.setRequestHeader( i, headers[ i ] );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Callback\\n\\t\\t\\t\\tcallback = function( type ) {\\n\\t\\t\\t\\t\\treturn function() {\\n\\t\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\t\\tcallback = errorCallback = xhr.onload =\\n\\t\\t\\t\\t\\t\\t\\t\\txhr.onerror = xhr.onabort = xhr.onreadystatechange = null;\\n\\n\\t\\t\\t\\t\\t\\t\\tif ( type === \\\"abort\\\" ) {\\n\\t\\t\\t\\t\\t\\t\\t\\txhr.abort();\\n\\t\\t\\t\\t\\t\\t\\t} else if ( type === \\\"error\\\" ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE <=9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t// On a manual native abort, IE9 throws\\n\\t\\t\\t\\t\\t\\t\\t\\t// errors on any property access that is not readyState\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( typeof xhr.status !== \\\"number\\\" ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcomplete( 0, \\\"error\\\" );\\n\\t\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tcomplete(\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t// File: protocol always yields status 0; see #8605, #14207\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.status,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.statusText\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tcomplete(\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhrSuccessStatus[ xhr.status ] || xhr.status,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.statusText,\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// Support: IE <=9 only\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// IE9 has no XHR2 but throws on binary (trac-11426)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t// For XHR2 non-text, let the caller handle it (gh-2498)\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t( xhr.responseType || \\\"text\\\" ) !== \\\"text\\\" ||\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ttypeof xhr.responseText !== \\\"string\\\" ?\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{ binary: xhr.response } :\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t{ text: xhr.responseText },\\n\\t\\t\\t\\t\\t\\t\\t\\t\\txhr.getAllResponseHeaders()\\n\\t\\t\\t\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t};\\n\\n\\t\\t\\t\\t// Listen to events\\n\\t\\t\\t\\txhr.onload = callback();\\n\\t\\t\\t\\terrorCallback = xhr.onerror = callback( \\\"error\\\" );\\n\\n\\t\\t\\t\\t// Support: IE 9 only\\n\\t\\t\\t\\t// Use onreadystatechange to replace onabort\\n\\t\\t\\t\\t// to handle uncaught aborts\\n\\t\\t\\t\\tif ( xhr.onabort !== undefined ) {\\n\\t\\t\\t\\t\\txhr.onabort = errorCallback;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\txhr.onreadystatechange = function() {\\n\\n\\t\\t\\t\\t\\t\\t// Check readyState before timeout as it changes\\n\\t\\t\\t\\t\\t\\tif ( xhr.readyState === 4 ) {\\n\\n\\t\\t\\t\\t\\t\\t\\t// Allow onerror to be called first,\\n\\t\\t\\t\\t\\t\\t\\t// but that will not handle a native abort\\n\\t\\t\\t\\t\\t\\t\\t// Also, save errorCallback to a variable\\n\\t\\t\\t\\t\\t\\t\\t// as xhr.onerror cannot be accessed\\n\\t\\t\\t\\t\\t\\t\\twindow.setTimeout( function() {\\n\\t\\t\\t\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\t\\t\\t\\terrorCallback();\\n\\t\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t\\t} );\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t};\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t// Create the abort callback\\n\\t\\t\\t\\tcallback = callback( \\\"abort\\\" );\\n\\n\\t\\t\\t\\ttry {\\n\\n\\t\\t\\t\\t\\t// Do send the request (this may raise an exception)\\n\\t\\t\\t\\t\\txhr.send( options.hasContent && options.data || null );\\n\\t\\t\\t\\t} catch ( e ) {\\n\\n\\t\\t\\t\\t\\t// #14683: Only rethrow if this hasn't been notified as an error yet\\n\\t\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\t\\tthrow e;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t},\\n\\n\\t\\t\\tabort: function() {\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback();\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t};\\n\\t}\\n} );\\n\\n\\n\\n\\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\\njQuery.ajaxPrefilter( function( s ) {\\n\\tif ( s.crossDomain ) {\\n\\t\\ts.contents.script = false;\\n\\t}\\n} );\\n\\n// Install script dataType\\njQuery.ajaxSetup( {\\n\\taccepts: {\\n\\t\\tscript: \\\"text/javascript, application/javascript, \\\" +\\n\\t\\t\\t\\\"application/ecmascript, application/x-ecmascript\\\"\\n\\t},\\n\\tcontents: {\\n\\t\\tscript: /\\\\b(?:java|ecma)script\\\\b/\\n\\t},\\n\\tconverters: {\\n\\t\\t\\\"text script\\\": function( text ) {\\n\\t\\t\\tjQuery.globalEval( text );\\n\\t\\t\\treturn text;\\n\\t\\t}\\n\\t}\\n} );\\n\\n// Handle cache's special case and crossDomain\\njQuery.ajaxPrefilter( \\\"script\\\", function( s ) {\\n\\tif ( s.cache === undefined ) {\\n\\t\\ts.cache = false;\\n\\t}\\n\\tif ( s.crossDomain ) {\\n\\t\\ts.type = \\\"GET\\\";\\n\\t}\\n} );\\n\\n// Bind script tag hack transport\\njQuery.ajaxTransport( \\\"script\\\", function( s ) {\\n\\n\\t// This transport only deals with cross domain requests\\n\\tif ( s.crossDomain ) {\\n\\t\\tvar script, callback;\\n\\t\\treturn {\\n\\t\\t\\tsend: function( _, complete ) {\\n\\t\\t\\t\\tscript = jQuery( \\\"\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\n// exports\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQXV0aG9yaXplZENsaWVudHMudnVlP2ZhMzYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWN0aW9uLWxpbmtbZGF0YS12LTExNjA1ZTVjXSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLm0tYi1ub25lW2RhdGEtdi0xMTYwNWU1Y10ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL3Bhc3Nwb3J0L0F1dGhvcml6ZWRDbGllbnRzLnZ1ZT9hOTkwNzZjMFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJBdXRob3JpemVkQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWhlYWRpbmdcXFwiPkF1dGhvcml6ZWQgQXBwbGljYXRpb25zPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBdXRob3JpemVkIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+TmFtZTwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+U2NvcGVzPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcInRva2VuIGluIHRva2Vuc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENsaWVudCBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uY2xpZW50Lm5hbWUgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNjb3BlcyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHYtaWY9XFxcInRva2VuLnNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdG9rZW4uc2NvcGVzLmpvaW4oJywgJykgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZXZva2UgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXZva2VcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICB0b2tlbnM6IFtdXFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBwcmVwYXJlQ29tcG9uZW50KCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogR2V0IGFsbCBvZiB0aGUgYXV0aG9yaXplZCB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC90b2tlbnMnKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2tlbnMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUmV2b2tlIHRoZSBnaXZlbiB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICByZXZva2UodG9rZW4pIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5kZWxldGUoJy9vYXV0aC90b2tlbnMvJyArIHRva2VuLmlkKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUb2tlbnMoKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH1cXG48L3NjcmlwdD5cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTExNjA1ZTVjJnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL3Bhc3Nwb3J0L0F1dGhvcml6ZWRDbGllbnRzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\n// imports\\n\\n\\n// module\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"importer.vue\\\",\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\n// exports\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXIudnVlPzIzNzQiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwiZmlsZVwiOlwiaW1wb3J0ZXIudnVlXCIsXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTFmZjBlZDUzJnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2ltcG9ydGVyL2ltcG9ydGVyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\n// imports\\n\\n\\n// module\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"alert.vue\\\",\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\n// exports\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvYWxlcnQudnVlPzVlNzIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W10sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIlwiLFwiZmlsZVwiOlwiYWxlcnQudnVlXCIsXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cbi8vIGV4cG9ydHNcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jc3MtbG9hZGVyP3NvdXJjZU1hcCEuL34vdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTRlYWM1NjgwJnNjb3BlZD10cnVlIS4vfi92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL2FsZXJ0LnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\n// imports\\n\\n\\n// module\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"select2.vue\\\",\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\n// exports\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvc2VsZWN0Mi52dWU/MWUxNSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcblxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiXCIsXCJmaWxlXCI6XCJzZWxlY3QyLnZ1ZVwiLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXG4vLyBleHBvcnRzXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY3NzLWxvYWRlcj9zb3VyY2VNYXAhLi9+L3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi01MTU2MTNjYyZzY29wZWQ9dHJ1ZSEuL34vdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL3Jlc291cmNlcy9hc3NldHMvanMvY29tcG9uZW50cy9zZWxlY3QyLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\n// imports\\n\\n\\n// module\\nexports.push([module.i, \\\"\\\\n.action-link[data-v-6886005f] {\\\\n cursor: pointer;\\\\n}\\\\n.m-b-none[data-v-6886005f] {\\\\n margin-bottom: 0;\\\\n}\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[\\\"/./resources/assets/js/components/passport/PersonalAccessTokens.vue?5734f4e4\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\\\",\\\"file\\\":\\\"PersonalAccessTokens.vue\\\",\\\"sourcesContent\\\":[\\\"\\\\n\\\\n\\\\n\\\\n\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\n// exports\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvUGVyc29uYWxBY2Nlc3NUb2tlbnMudnVlP2Y0YTgiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvbGliL2Nzcy1iYXNlLmpzXCIpKCk7XG4vLyBpbXBvcnRzXG5cblxuLy8gbW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWN0aW9uLWxpbmtbZGF0YS12LTY4ODYwMDVmXSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLm0tYi1ub25lW2RhdGEtdi02ODg2MDA1Zl0ge1xcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xcbn1cXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vcmVzb3VyY2VzL2Fzc2V0cy9qcy9jb21wb25lbnRzL3Bhc3Nwb3J0L1BlcnNvbmFsQWNjZXNzVG9rZW5zLnZ1ZT81NzM0ZjRlNFwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBQ0E7SUFDQSxnQkFBQTtDQUNBO0FBRUE7SUFDQSxpQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJQZXJzb25hbEFjY2Vzc1Rva2Vucy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbCBwYW5lbC1kZWZhdWx0XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVxcXCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2Vuc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cXFwiYWN0aW9uLWxpbmtcXFwiIEBjbGljaz1cXFwic2hvd0NyZWF0ZVRva2VuRm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZSBOZXcgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInBhbmVsLWJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBUb2tlbnMgTm90aWNlIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XFxcIm0tYi1ub25lXFxcIiB2LWlmPVxcXCJ0b2tlbnMubGVuZ3RoID09PSAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBZb3UgaGF2ZSBub3QgY3JlYXRlZCBhbnkgcGVyc29uYWwgYWNjZXNzIHRva2Vucy5cXG4gICAgICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUGVyc29uYWwgQWNjZXNzIFRva2VucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cXFwidGFibGUgdGFibGUtYm9yZGVybGVzcyBtLWItbm9uZVxcXCIgdi1pZj1cXFwidG9rZW5zLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPk5hbWU8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB2LWZvcj1cXFwidG9rZW4gaW4gdG9rZW5zXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2xpZW50IE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0b2tlbi5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZWxldGUgQnV0dG9uIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcInJldm9rZSh0b2tlbilcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gTW9kYWwgLS0+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbCBmYWRlXFxcIiBpZD1cXFwibW9kYWwtY3JlYXRlLXRva2VuXFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgVG9rZW5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZm9ybS5lcnJvcnMubGVuZ3RoID4gMFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxzdHJvbmc+V2hvb3BzITwvc3Ryb25nPiBTb21ldGhpbmcgd2VudCB3cm9uZyE8L3A+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxicj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIHYtZm9yPVxcXCJlcnJvciBpbiBmb3JtLmVycm9yc1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXJyb3IgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDcmVhdGUgVG9rZW4gRm9ybSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBjbGFzcz1cXFwiZm9ybS1ob3Jpem9udGFsXFxcIiByb2xlPVxcXCJmb3JtXFxcIiBAc3VibWl0LnByZXZlbnQ9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+TmFtZTwvbGFiZWw+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjb2wtbWQtNlxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVxcXCJjcmVhdGUtdG9rZW4tbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwibmFtZVxcXCIgdi1tb2RlbD1cXFwiZm9ybS5uYW1lXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTY29wZXMgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiIHYtaWY9XFxcInNjb3Blcy5sZW5ndGggPiAwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTQgY29udHJvbC1sYWJlbFxcXCI+U2NvcGVzPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC02XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHYtZm9yPVxcXCJzY29wZSBpbiBzY29wZXNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjaGVja2JveFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2xpY2s9XFxcInRvZ2dsZVNjb3BlKHNjb3BlLmlkKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNoZWNrZWQ9XFxcInNjb3BlSXNBc3NpZ25lZChzY29wZS5pZClcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzY29wZS5pZCB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInN0b3JlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQWNjZXNzIFRva2VuIE1vZGFsIC0tPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwgZmFkZVxcXCIgaWQ9XFxcIm1vZGFsLWFjY2Vzcy10b2tlblxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc29uYWwgQWNjZXNzIFRva2VuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgeW91ciBuZXcgcGVyc29uYWwgYWNjZXNzIHRva2VuLiBUaGlzIGlzIHRoZSBvbmx5IHRpbWUgaXQgd2lsbCBiZSBzaG93biBzbyBkb24ndCBsb3NlIGl0IVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IG5vdyB1c2UgdGhpcyB0b2tlbiB0byBtYWtlIEFQSSByZXF1ZXN0cy5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZT57eyBhY2Nlc3NUb2tlbiB9fTwvY29kZT48L3ByZT5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNb2RhbCBBY3Rpb25zIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdFxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCI+Q2xvc2U8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3RlbXBsYXRlPlxcblxcbjxzY3JpcHQ+XFxuICAgIGV4cG9ydCBkZWZhdWx0IHtcXG4gICAgICAgIC8qXFxuICAgICAgICAgKiBUaGUgY29tcG9uZW50J3MgZGF0YS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgZGF0YSgpIHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogbnVsbCxcXG5cXG4gICAgICAgICAgICAgICAgdG9rZW5zOiBbXSxcXG4gICAgICAgICAgICAgICAgc2NvcGVzOiBbXSxcXG5cXG4gICAgICAgICAgICAgICAgZm9ybToge1xcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICBzY29wZXM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VG9rZW5zKCk7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2NvcGVzKCk7XFxuXFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5vbignc2hvd24uYnMubW9kYWwnLCAoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAkKCcjY3JlYXRlLXRva2VuLW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIHBlcnNvbmFsIGFjY2VzcyB0b2tlbnMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldFRva2VucygpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5nZXQoJy9vYXV0aC9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zJylcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9rZW5zID0gcmVzcG9uc2UuZGF0YTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIGF2YWlsYWJsZSBzY29wZXMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgZ2V0U2NvcGVzKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmdldCgnL29hdXRoL3Njb3BlcycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjb3BlcyA9IHJlc3BvbnNlLmRhdGE7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBTaG93IHRoZSBmb3JtIGZvciBjcmVhdGluZyBuZXcgdG9rZW5zLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dDcmVhdGVUb2tlbkZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtdG9rZW4nKS5tb2RhbCgnc2hvdycpO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogQ3JlYXRlIGEgbmV3IHBlcnNvbmFsIGFjY2VzcyB0b2tlbi5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBzdG9yZSgpIHtcXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IG51bGw7XFxuXFxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cC5wb3N0KCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2VucycsIHRoaXMuZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5uYW1lID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMgPSBbXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmVycm9ycyA9IFtdO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHJlc3BvbnNlLmRhdGEudG9rZW4pO1xcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBY2Nlc3NUb2tlbihyZXNwb25zZS5kYXRhLmFjY2Vzc1Rva2VuKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ29iamVjdCcpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBfLmZsYXR0ZW4oXy50b0FycmF5KHJlc3BvbnNlLmRhdGEpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kaXIodGhpcy5mb3JtKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5lcnJvcnMgPSBbJ1NvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluLiddO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAvKipcXG4gICAgICAgICAgICAgKiBUb2dnbGUgdGhlIGdpdmVuIHNjb3BlIGluIHRoZSBsaXN0IG9mIGFzc2lnbmVkIHNjb3Blcy5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB0b2dnbGVTY29wZShzY29wZSkge1xcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY29wZUlzQXNzaWduZWQoc2NvcGUpKSB7XFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uc2NvcGVzID0gXy5yZWplY3QodGhpcy5mb3JtLnNjb3BlcywgcyA9PiBzID09IHNjb3BlKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zY29wZXMucHVzaChzY29wZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gc2NvcGUgaGFzIGJlZW4gYXNzaWduZWQgdG8gdGhlIHRva2VuLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNjb3BlSXNBc3NpZ25lZChzY29wZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXy5pbmRleE9mKHRoaXMuZm9ybS5zY29wZXMsIHNjb3BlKSA+PSAwO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZ2l2ZW4gYWNjZXNzIHRva2VuIHRvIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHNob3dBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikge1xcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLXRva2VuJykubW9kYWwoJ2hpZGUnKTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtYWNjZXNzLXRva2VuJykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFJldm9rZSB0aGUgZ2l2ZW4gdG9rZW4uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcmV2b2tlKHRva2VuKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZGVsZXRlKCcvb2F1dGgvcGVyc29uYWwtYWNjZXNzLXRva2Vucy8nICsgdG9rZW4uaWQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRva2VucygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjg4NjAwNWYmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvUGVyc29uYWxBY2Nlc3NUb2tlbnMudnVlXG4vLyBtb2R1bGUgaWQgPSAyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\n// imports\\n\\n\\n// module\\nexports.push([module.i, \\\"\\\\n\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[],\\\"names\\\":[],\\\"mappings\\\":\\\"\\\",\\\"file\\\":\\\"importer-errors.vue\\\",\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\n// exports\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZT8zZjVlIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLy4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2xpYi9jc3MtYmFzZS5qc1wiKSgpO1xuLy8gaW1wb3J0c1xuXG5cbi8vIG1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJcIixcImZpbGVcIjpcImltcG9ydGVyLWVycm9ycy52dWVcIixcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtYTk3ZmE1NTYmc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvaW1wb3J0ZXIvaW1wb3J0ZXItZXJyb3JzLnZ1ZVxuLy8gbW9kdWxlIGlkID0gMjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\");\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"exports = module.exports = __webpack_require__(0)();\\n// imports\\n\\n\\n// module\\nexports.push([module.i, \\\"\\\\n.action-link[data-v-dc8f4892] {\\\\n cursor: pointer;\\\\n}\\\\n.m-b-none[data-v-dc8f4892] {\\\\n margin-bottom: 0;\\\\n}\\\\n\\\", \\\"\\\", {\\\"version\\\":3,\\\"sources\\\":[\\\"/./resources/assets/js/components/passport/Clients.vue?35867ce4\\\"],\\\"names\\\":[],\\\"mappings\\\":\\\";AACA;IACA,gBAAA;CACA;AAEA;IACA,iBAAA;CACA\\\",\\\"file\\\":\\\"Clients.vue\\\",\\\"sourcesContent\\\":[\\\"\\\\n\\\\n\\\\n\\\\n\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\n// exports\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWU/NDVmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9saWIvY3NzLWJhc2UuanNcIikoKTtcbi8vIGltcG9ydHNcblxuXG4vLyBtb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5hY3Rpb24tbGlua1tkYXRhLXYtZGM4ZjQ4OTJdIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbn1cXG4ubS1iLW5vbmVbZGF0YS12LWRjOGY0ODkyXSB7XFxuICAgIG1hcmdpbi1ib3R0b206IDA7XFxufVxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWU/MzU4NjdjZTRcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQUNBO0lBQ0EsZ0JBQUE7Q0FDQTtBQUVBO0lBQ0EsaUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2xpZW50cy52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHN0eWxlIHNjb3BlZD5cXG4gICAgLmFjdGlvbi1saW5rIHtcXG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgfVxcblxcbiAgICAubS1iLW5vbmUge1xcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcXG4gICAgfVxcbjwvc3R5bGU+XFxuXFxuPHRlbXBsYXRlPlxcbiAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwgcGFuZWwtZGVmYXVsdFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwicGFuZWwtaGVhZGluZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XFxcImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgT0F1dGggQ2xpZW50c1xcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcInNob3dDcmVhdGVDbGllbnRGb3JtXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgTmV3IENsaWVudFxcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBDdXJyZW50IENsaWVudHMgLS0+XFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVxcXCJtLWItbm9uZVxcXCIgdi1pZj1cXFwiY2xpZW50cy5sZW5ndGggPT09IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgWW91IGhhdmUgbm90IGNyZWF0ZWQgYW55IE9BdXRoIGNsaWVudHMuXFxuICAgICAgICAgICAgICAgIDwvcD5cXG5cXG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVxcXCJ0YWJsZSB0YWJsZS1ib3JkZXJsZXNzIG0tYi1ub25lXFxcIiB2LWlmPVxcXCJjbGllbnRzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkNsaWVudCBJRDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5OYW1lPC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlNlY3JldDwvdGg+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHIgdi1mb3I9XFxcImNsaWVudCBpbiBjbGllbnRzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJRCAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVxcXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjbGllbnQuaWQgfX1cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOYW1lIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNsaWVudC5uYW1lIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2VjcmV0IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XFxcInZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnt7IGNsaWVudC5zZWNyZXQgfX08L2NvZGU+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRWRpdCBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rXFxcIiBAY2xpY2s9XFxcImVkaXQoY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERlbGV0ZSBCdXR0b24gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cXFwidmVydGljYWwtYWxpZ246IG1pZGRsZTtcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XFxcImFjdGlvbi1saW5rIHRleHQtZGFuZ2VyXFxcIiBAY2xpY2s9XFxcImRlc3Ryb3koY2xpZW50KVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cXG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICAgICAgICAgIDwvdGFibGU+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1jcmVhdGUtY2xpZW50XFxcIiB0YWJpbmRleD1cXFwiLTFcXFwiIHJvbGU9XFxcImRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZGlhbG9nXFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtY29udGVudFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1oZWFkZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uIFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+JnRpbWVzOzwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgQ2xpZW50XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oND5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtYm9keVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGb3JtIEVycm9ycyAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhbGVydCBhbGVydC1kYW5nZXJcXFwiIHYtaWY9XFxcImNyZWF0ZUZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gY3JlYXRlRm9ybS5lcnJvcnNcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVycm9yIH19XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ3JlYXRlIENsaWVudCBGb3JtIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVxcXCJmb3JtLWhvcml6b250YWxcXFwiIHJvbGU9XFxcImZvcm1cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5hbWUgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5OYW1lPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XFxcImNyZWF0ZS1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJzdG9yZVxcXCIgdi1tb2RlbD1cXFwiY3JlYXRlRm9ybS5uYW1lXFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWV0aGluZyB5b3VyIHVzZXJzIHdpbGwgcmVjb2duaXplIGFuZCB0cnVzdC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVkaXJlY3QgVVJMIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cXFwiY29sLW1kLTMgY29udHJvbC1sYWJlbFxcXCI+UmVkaXJlY3QgVVJMPC9sYWJlbD5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNvbC1tZC03XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgbmFtZT1cXFwicmVkaXJlY3RcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBrZXl1cC5lbnRlcj1cXFwic3RvcmVcXFwiIHYtbW9kZWw9XFxcImNyZWF0ZUZvcm0ucmVkaXJlY3RcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91ciBhcHBsaWNhdGlvbidzIGF1dGhvcml6YXRpb24gY2FsbGJhY2sgVVJMLlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTW9kYWwgQWN0aW9ucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWZvb3RlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLWRlZmF1bHRcXFwiIGRhdGEtZGlzbWlzcz1cXFwibW9kYWxcXFwiPkNsb3NlPC9idXR0b24+XFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidG4gYnRuLXByaW1hcnlcXFwiIEBjbGljaz1cXFwic3RvcmVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPCEtLSBFZGl0IENsaWVudCBNb2RhbCAtLT5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsIGZhZGVcXFwiIGlkPVxcXCJtb2RhbC1lZGl0LWNsaWVudFxcXCIgdGFiaW5kZXg9XFxcIi0xXFxcIiByb2xlPVxcXCJkaWFsb2dcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWRpYWxvZ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvbiBcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgZGF0YS1kaXNtaXNzPVxcXCJtb2RhbFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPiZ0aW1lczs8L2J1dHRvbj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XFxcIm1vZGFsLXRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCBDbGllbnRcXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gRXJyb3JzIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFsZXJ0IGFsZXJ0LWRhbmdlclxcXCIgdi1pZj1cXFwiZWRpdEZvcm0uZXJyb3JzLmxlbmd0aCA+IDBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48c3Ryb25nPldob29wcyE8L3N0cm9uZz4gU29tZXRoaW5nIHdlbnQgd3JvbmchPC9wPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSB2LWZvcj1cXFwiZXJyb3IgaW4gZWRpdEZvcm0uZXJyb3JzXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBlcnJvciB9fVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVkaXQgQ2xpZW50IEZvcm0gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XFxcImZvcm0taG9yaXpvbnRhbFxcXCIgcm9sZT1cXFwiZm9ybVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTmFtZSAtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XFxcImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcXFwiPk5hbWU8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwiZWRpdC1jbGllbnQtbmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLm5hbWVcXFwiPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZXRoaW5nIHlvdXIgdXNlcnMgd2lsbCByZWNvZ25pemUgYW5kIHRydXN0LlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZWRpcmVjdCBVUkwgLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVxcXCJjb2wtbWQtMyBjb250cm9sLWxhYmVsXFxcIj5SZWRpcmVjdCBVUkw8L2xhYmVsPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY29sLW1kLTdcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBuYW1lPVxcXCJyZWRpcmVjdFxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ1cGRhdGVcXFwiIHYtbW9kZWw9XFxcImVkaXRGb3JtLnJlZGlyZWN0XFxcIj5cXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaGVscC1ibG9ja1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdXIgYXBwbGljYXRpb24ncyBhdXRob3JpemF0aW9uIGNhbGxiYWNrIFVSTC5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICAgICAgICAgICAgICA8IS0tIE1vZGFsIEFjdGlvbnMgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJtb2RhbC1mb290ZXJcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1kZWZhdWx0XFxcIiBkYXRhLWRpc21pc3M9XFxcIm1vZGFsXFxcIj5DbG9zZTwvYnV0dG9uPlxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcInVwZGF0ZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmUgQ2hhbmdlc1xcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvdGVtcGxhdGU+XFxuXFxuPHNjcmlwdD5cXG4gICAgZXhwb3J0IGRlZmF1bHQge1xcbiAgICAgICAgLypcXG4gICAgICAgICAqIFRoZSBjb21wb25lbnQncyBkYXRhLlxcbiAgICAgICAgICovXFxuICAgICAgICBkYXRhKCkge1xcbiAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgIGNsaWVudHM6IFtdLFxcblxcbiAgICAgICAgICAgICAgICBjcmVhdGVGb3JtOiB7XFxuICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycsXFxuICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDogJydcXG4gICAgICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICAgICAgZWRpdEZvcm06IHtcXG4gICAgICAgICAgICAgICAgICAgIGVycm9yczogW10sXFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyxcXG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OiAnJ1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICAvKipcXG4gICAgICAgICAqIFByZXBhcmUgdGhlIGNvbXBvbmVudCAoVnVlIDEueCkuXFxuICAgICAgICAgKi9cXG4gICAgICAgIHJlYWR5KCkge1xcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUNvbXBvbmVudCgpO1xcbiAgICAgICAgfSxcXG5cXG4gICAgICAgIC8qKlxcbiAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50IChWdWUgMi54KS5cXG4gICAgICAgICAqL1xcbiAgICAgICAgbW91bnRlZCgpIHtcXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVDb21wb25lbnQoKTtcXG4gICAgICAgIH0sXFxuXFxuICAgICAgICBtZXRob2RzOiB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUHJlcGFyZSB0aGUgY29tcG9uZW50LlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHByZXBhcmVDb21wb25lbnQoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcblxcbiAgICAgICAgICAgICAgICAkKCcjbW9kYWwtY3JlYXRlLWNsaWVudCcpLm9uKCdzaG93bi5icy5tb2RhbCcsICgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICQoJyNjcmVhdGUtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50Jykub24oJ3Nob3duLmJzLm1vZGFsJywgKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgJCgnI2VkaXQtY2xpZW50LW5hbWUnKS5mb2N1cygpO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEdldCBhbGwgb2YgdGhlIE9BdXRoIGNsaWVudHMgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIGdldENsaWVudHMoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMuJGh0dHAuZ2V0KCcvb2F1dGgvY2xpZW50cycpXFxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudHMgPSByZXNwb25zZS5kYXRhO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogU2hvdyB0aGUgZm9ybSBmb3IgY3JlYXRpbmcgbmV3IGNsaWVudHMuXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgc2hvd0NyZWF0ZUNsaWVudEZvcm0oKSB7XFxuICAgICAgICAgICAgICAgICQoJyNtb2RhbC1jcmVhdGUtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIENyZWF0ZSBhIG5ldyBPQXV0aCBjbGllbnQgZm9yIHRoZSB1c2VyLlxcbiAgICAgICAgICAgICAqL1xcbiAgICAgICAgICAgIHN0b3JlKCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLnBlcnNpc3RDbGllbnQoXFxuICAgICAgICAgICAgICAgICAgICAncG9zdCcsICcvb2F1dGgvY2xpZW50cycsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUZvcm0sICcjbW9kYWwtY3JlYXRlLWNsaWVudCdcXG4gICAgICAgICAgICAgICAgKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIEVkaXQgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBlZGl0KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLmlkID0gY2xpZW50LmlkO1xcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLm5hbWUgPSBjbGllbnQubmFtZTtcXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0Rm9ybS5yZWRpcmVjdCA9IGNsaWVudC5yZWRpcmVjdDtcXG5cXG4gICAgICAgICAgICAgICAgJCgnI21vZGFsLWVkaXQtY2xpZW50JykubW9kYWwoJ3Nob3cnKTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgY2xpZW50IGJlaW5nIGVkaXRlZC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICB1cGRhdGUoKSB7XFxuICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdENsaWVudChcXG4gICAgICAgICAgICAgICAgICAgICdwdXQnLCAnL29hdXRoL2NsaWVudHMvJyArIHRoaXMuZWRpdEZvcm0uaWQsXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRGb3JtLCAnI21vZGFsLWVkaXQtY2xpZW50J1xcbiAgICAgICAgICAgICAgICApO1xcbiAgICAgICAgICAgIH0sXFxuXFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICogUGVyc2lzdCB0aGUgY2xpZW50IHRvIHN0b3JhZ2UgdXNpbmcgdGhlIGdpdmVuIGZvcm0uXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgcGVyc2lzdENsaWVudChtZXRob2QsIHVyaSwgZm9ybSwgbW9kYWwpIHtcXG4gICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgdGhpcy4kaHR0cFttZXRob2RdKHVyaSwgZm9ybSlcXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsaWVudHMoKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLm5hbWUgPSAnJztcXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnJlZGlyZWN0ID0gJyc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5lcnJvcnMgPSBbXTtcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAkKG1vZGFsKS5tb2RhbCgnaGlkZScpO1xcbiAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaChyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5kYXRhID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmVycm9ycyA9IF8uZmxhdHRlbihfLnRvQXJyYXkocmVzcG9uc2UuZGF0YSkpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uZXJyb3JzID0gWydTb21ldGhpbmcgd2VudCB3cm9uZy4gUGxlYXNlIHRyeSBhZ2Fpbi4nXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIC8qKlxcbiAgICAgICAgICAgICAqIERlc3Ryb3kgdGhlIGdpdmVuIGNsaWVudC5cXG4gICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICBkZXN0cm95KGNsaWVudCkge1xcbiAgICAgICAgICAgICAgICB0aGlzLiRodHRwLmRlbGV0ZSgnL29hdXRoL2NsaWVudHMvJyArIGNsaWVudC5pZClcXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpZW50cygpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbjwvc2NyaXB0PlxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblxuLy8gZXhwb3J0c1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzcy1sb2FkZXI/c291cmNlTWFwIS4vfi92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtZGM4ZjQ4OTImc2NvcGVkPXRydWUhLi9+L3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9yZXNvdXJjZXMvYXNzZXRzL2pzL2NvbXBvbmVudHMvcGFzc3BvcnQvQ2xpZW50cy52dWVcbi8vIG1vZHVsZSBpZCA9IDI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;( function( factory ) {\\n\\tif ( true ) {\\n\\n\\t\\t// AMD. Register as an anonymous module.\\n\\t\\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(3) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\t} else {\\n\\n\\t\\t// Browser globals\\n\\t\\tfactory( jQuery );\\n\\t}\\n} ( function( $ ) {\\n\\n$.ui = $.ui || {};\\n\\nreturn $.ui.version = \\\"1.12.1\\\";\\n\\n} ) );\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2pxdWVyeS11aS91aS92ZXJzaW9uLmpzP2JkNDEiXSwic291cmNlc0NvbnRlbnQiOlsiKCBmdW5jdGlvbiggZmFjdG9yeSApIHtcblx0aWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblxuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoIFsgXCJqcXVlcnlcIiBdLCBmYWN0b3J5ICk7XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBCcm93c2VyIGdsb2JhbHNcblx0XHRmYWN0b3J5KCBqUXVlcnkgKTtcblx0fVxufSAoIGZ1bmN0aW9uKCAkICkge1xuXG4kLnVpID0gJC51aSB8fCB7fTtcblxucmV0dXJuICQudWkudmVyc2lvbiA9IFwiMS4xMi4xXCI7XG5cbn0gKSApO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2pxdWVyeS11aS91aS92ZXJzaW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\");\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\\n * jQuery UI Widget 1.12.1\\n * http://jqueryui.com\\n *\\n * Copyright jQuery Foundation and other contributors\\n * Released under the MIT license.\\n * http://jquery.org/license\\n */\\n\\n//>>label: Widget\\n//>>group: Core\\n//>>description: Provides a factory for creating stateful widgets with a common API.\\n//>>docs: http://api.jqueryui.com/jQuery.widget/\\n//>>demos: http://jqueryui.com/widget/\\n\\n( function( factory ) {\\n\\tif ( true ) {\\n\\n\\t\\t// AMD. Register as an anonymous module.\\n\\t\\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(3), __webpack_require__(26) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\\n\\t} else {\\n\\n\\t\\t// Browser globals\\n\\t\\tfactory( jQuery );\\n\\t}\\n}( function( $ ) {\\n\\nvar widgetUuid = 0;\\nvar widgetSlice = Array.prototype.slice;\\n\\n$.cleanData = ( function( orig ) {\\n\\treturn function( elems ) {\\n\\t\\tvar events, elem, i;\\n\\t\\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\\n\\t\\t\\ttry {\\n\\n\\t\\t\\t\\t// Only trigger remove when necessary to save time\\n\\t\\t\\t\\tevents = $._data( elem, \\\"events\\\" );\\n\\t\\t\\t\\tif ( events && events.remove ) {\\n\\t\\t\\t\\t\\t$( elem ).triggerHandler( \\\"remove\\\" );\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t// Http://bugs.jquery.com/ticket/8235\\n\\t\\t\\t} catch ( e ) {}\\n\\t\\t}\\n\\t\\torig( elems );\\n\\t};\\n} )( $.cleanData );\\n\\n$.widget = function( name, base, prototype ) {\\n\\tvar existingConstructor, constructor, basePrototype;\\n\\n\\t// ProxiedPrototype allows the provided prototype to remain unmodified\\n\\t// so that it can be used as a mixin for multiple widgets (#8876)\\n\\tvar proxiedPrototype = {};\\n\\n\\tvar namespace = name.split( \\\".\\\" )[ 0 ];\\n\\tname = name.split( \\\".\\\" )[ 1 ];\\n\\tvar fullName = namespace + \\\"-\\\" + name;\\n\\n\\tif ( !prototype ) {\\n\\t\\tprototype = base;\\n\\t\\tbase = $.Widget;\\n\\t}\\n\\n\\tif ( $.isArray( prototype ) ) {\\n\\t\\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\\n\\t}\\n\\n\\t// Create selector for plugin\\n\\t$.expr[ \\\":\\\" ][ fullName.toLowerCase() ] = function( elem ) {\\n\\t\\treturn !!$.data( elem, fullName );\\n\\t};\\n\\n\\t$[ namespace ] = $[ namespace ] || {};\\n\\texistingConstructor = $[ namespace ][ name ];\\n\\tconstructor = $[ namespace ][ name ] = function( options, element ) {\\n\\n\\t\\t// Allow instantiation without \\\"new\\\" keyword\\n\\t\\tif ( !this._createWidget ) {\\n\\t\\t\\treturn new constructor( options, element );\\n\\t\\t}\\n\\n\\t\\t// Allow instantiation without initializing for simple inheritance\\n\\t\\t// must use \\\"new\\\" keyword (the code above always passes args)\\n\\t\\tif ( arguments.length ) {\\n\\t\\t\\tthis._createWidget( options, element );\\n\\t\\t}\\n\\t};\\n\\n\\t// Extend with the existing constructor to carry over any static properties\\n\\t$.extend( constructor, existingConstructor, {\\n\\t\\tversion: prototype.version,\\n\\n\\t\\t// Copy the object used to create the prototype in case we need to\\n\\t\\t// redefine the widget later\\n\\t\\t_proto: $.extend( {}, prototype ),\\n\\n\\t\\t// Track widgets that inherit from this widget in case this widget is\\n\\t\\t// redefined after a widget inherits from it\\n\\t\\t_childConstructors: []\\n\\t} );\\n\\n\\tbasePrototype = new base();\\n\\n\\t// We need to make the options hash a property directly on the new instance\\n\\t// otherwise we'll modify the options hash on the prototype that we're\\n\\t// inheriting from\\n\\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\\n\\t$.each( prototype, function( prop, value ) {\\n\\t\\tif ( !$.isFunction( value ) ) {\\n\\t\\t\\tproxiedPrototype[ prop ] = value;\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\tproxiedPrototype[ prop ] = ( function() {\\n\\t\\t\\tfunction _super() {\\n\\t\\t\\t\\treturn base.prototype[ prop ].apply( this, arguments );\\n\\t\\t\\t}\\n\\n\\t\\t\\tfunction _superApply( args ) {\\n\\t\\t\\t\\treturn base.prototype[ prop ].apply( this, args );\\n\\t\\t\\t}\\n\\n\\t\\t\\treturn function() {\\n\\t\\t\\t\\tvar __super = this._super;\\n\\t\\t\\t\\tvar __superApply = this._superApply;\\n\\t\\t\\t\\tvar returnValue;\\n\\n\\t\\t\\t\\tthis._super = _super;\\n\\t\\t\\t\\tthis._superApply = _superApply;\\n\\n\\t\\t\\t\\treturnValue = value.apply( this, arguments );\\n\\n\\t\\t\\t\\tthis._super = __super;\\n\\t\\t\\t\\tthis._superApply = __superApply;\\n\\n\\t\\t\\t\\treturn returnValue;\\n\\t\\t\\t};\\n\\t\\t} )();\\n\\t} );\\n\\tconstructor.prototype = $.widget.extend( basePrototype, {\\n\\n\\t\\t// TODO: remove support for widgetEventPrefix\\n\\t\\t// always use the name + a colon as the prefix, e.g., draggable:start\\n\\t\\t// don't prefix for widgets that aren't DOM-based\\n\\t\\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\\n\\t}, proxiedPrototype, {\\n\\t\\tconstructor: constructor,\\n\\t\\tnamespace: namespace,\\n\\t\\twidgetName: name,\\n\\t\\twidgetFullName: fullName\\n\\t} );\\n\\n\\t// If this widget is being redefined then we need to find all widgets that\\n\\t// are inheriting from it and redefine all of them so that they inherit from\\n\\t// the new version of this widget. We're essentially trying to replace one\\n\\t// level in the prototype chain.\\n\\tif ( existingConstructor ) {\\n\\t\\t$.each( existingConstructor._childConstructors, function( i, child ) {\\n\\t\\t\\tvar childPrototype = child.prototype;\\n\\n\\t\\t\\t// Redefine the child widget using the same prototype that was\\n\\t\\t\\t// originally used, but inherit from the new version of the base\\n\\t\\t\\t$.widget( childPrototype.namespace + \\\".\\\" + childPrototype.widgetName, constructor,\\n\\t\\t\\t\\tchild._proto );\\n\\t\\t} );\\n\\n\\t\\t// Remove the list of existing child constructors from the old constructor\\n\\t\\t// so the old child constructors can be garbage collected\\n\\t\\tdelete existingConstructor._childConstructors;\\n\\t} else {\\n\\t\\tbase._childConstructors.push( constructor );\\n\\t}\\n\\n\\t$.widget.bridge( name, constructor );\\n\\n\\treturn constructor;\\n};\\n\\n$.widget.extend = function( target ) {\\n\\tvar input = widgetSlice.call( arguments, 1 );\\n\\tvar inputIndex = 0;\\n\\tvar inputLength = input.length;\\n\\tvar key;\\n\\tvar value;\\n\\n\\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\\n\\t\\tfor ( key in input[ inputIndex ] ) {\\n\\t\\t\\tvalue = input[ inputIndex ][ key ];\\n\\t\\t\\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\\n\\n\\t\\t\\t\\t// Clone objects\\n\\t\\t\\t\\tif ( $.isPlainObject( value ) ) {\\n\\t\\t\\t\\t\\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\\n\\t\\t\\t\\t\\t\\t$.widget.extend( {}, target[ key ], value ) :\\n\\n\\t\\t\\t\\t\\t\\t// Don't extend strings, arrays, etc. with objects\\n\\t\\t\\t\\t\\t\\t$.widget.extend( {}, value );\\n\\n\\t\\t\\t\\t// Copy everything else by reference\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\ttarget[ key ] = value;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn target;\\n};\\n\\n$.widget.bridge = function( name, object ) {\\n\\tvar fullName = object.prototype.widgetFullName || name;\\n\\t$.fn[ name ] = function( options ) {\\n\\t\\tvar isMethodCall = typeof options === \\\"string\\\";\\n\\t\\tvar args = widgetSlice.call( arguments, 1 );\\n\\t\\tvar returnValue = this;\\n\\n\\t\\tif ( isMethodCall ) {\\n\\n\\t\\t\\t// If this is an empty collection, we need to have the instance method\\n\\t\\t\\t// return undefined instead of the jQuery instance\\n\\t\\t\\tif ( !this.length && options === \\\"instance\\\" ) {\\n\\t\\t\\t\\treturnValue = undefined;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tthis.each( function() {\\n\\t\\t\\t\\t\\tvar methodValue;\\n\\t\\t\\t\\t\\tvar instance = $.data( this, fullName );\\n\\n\\t\\t\\t\\t\\tif ( options === \\\"instance\\\" ) {\\n\\t\\t\\t\\t\\t\\treturnValue = instance;\\n\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tif ( !instance ) {\\n\\t\\t\\t\\t\\t\\treturn $.error( \\\"cannot call methods on \\\" + name +\\n\\t\\t\\t\\t\\t\\t\\t\\\" prior to initialization; \\\" +\\n\\t\\t\\t\\t\\t\\t\\t\\\"attempted to call method '\\\" + options + \\\"'\\\" );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tif ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === \\\"_\\\" ) {\\n\\t\\t\\t\\t\\t\\treturn $.error( \\\"no such method '\\\" + options + \\\"' for \\\" + name +\\n\\t\\t\\t\\t\\t\\t\\t\\\" widget instance\\\" );\\n\\t\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\t\\tmethodValue = instance[ options ].apply( instance, args );\\n\\n\\t\\t\\t\\t\\tif ( methodValue !== instance && methodValue !== undefined ) {\\n\\t\\t\\t\\t\\t\\treturnValue = methodValue && methodValue.jquery ?\\n\\t\\t\\t\\t\\t\\t\\treturnValue.pushStack( methodValue.get() ) :\\n\\t\\t\\t\\t\\t\\t\\tmethodValue;\\n\\t\\t\\t\\t\\t\\treturn false;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} );\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\n\\t\\t\\t// Allow multiple hashes to be passed on init\\n\\t\\t\\tif ( args.length ) {\\n\\t\\t\\t\\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\\n\\t\\t\\t}\\n\\n\\t\\t\\tthis.each( function() {\\n\\t\\t\\t\\tvar instance = $.data( this, fullName );\\n\\t\\t\\t\\tif ( instance ) {\\n\\t\\t\\t\\t\\tinstance.option( options || {} );\\n\\t\\t\\t\\t\\tif ( instance._init ) {\\n\\t\\t\\t\\t\\t\\tinstance._init();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t$.data( this, fullName, new object( options, this ) );\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t}\\n\\n\\t\\treturn returnValue;\\n\\t};\\n};\\n\\n$.Widget = function( /* options, element */ ) {};\\n$.Widget._childConstructors = [];\\n\\n$.Widget.prototype = {\\n\\twidgetName: \\\"widget\\\",\\n\\twidgetEventPrefix: \\\"\\\",\\n\\tdefaultElement: \\\"
\\\",\\n\\n\\toptions: {\\n\\t\\tclasses: {},\\n\\t\\tdisabled: false,\\n\\n\\t\\t// Callbacks\\n\\t\\tcreate: null\\n\\t},\\n\\n\\t_createWidget: function( options, element ) {\\n\\t\\telement = $( element || this.defaultElement || this )[ 0 ];\\n\\t\\tthis.element = $( element );\\n\\t\\tthis.uuid = widgetUuid++;\\n\\t\\tthis.eventNamespace = \\\".\\\" + this.widgetName + this.uuid;\\n\\n\\t\\tthis.bindings = $();\\n\\t\\tthis.hoverable = $();\\n\\t\\tthis.focusable = $();\\n\\t\\tthis.classesElementLookup = {};\\n\\n\\t\\tif ( element !== this ) {\\n\\t\\t\\t$.data( element, this.widgetFullName, this );\\n\\t\\t\\tthis._on( true, this.element, {\\n\\t\\t\\t\\tremove: function( event ) {\\n\\t\\t\\t\\t\\tif ( event.target === element ) {\\n\\t\\t\\t\\t\\t\\tthis.destroy();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t} );\\n\\t\\t\\tthis.document = $( element.style ?\\n\\n\\t\\t\\t\\t// Element within the document\\n\\t\\t\\t\\telement.ownerDocument :\\n\\n\\t\\t\\t\\t// Element is window or document\\n\\t\\t\\t\\telement.document || element );\\n\\t\\t\\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\\n\\t\\t}\\n\\n\\t\\tthis.options = $.widget.extend( {},\\n\\t\\t\\tthis.options,\\n\\t\\t\\tthis._getCreateOptions(),\\n\\t\\t\\toptions );\\n\\n\\t\\tthis._create();\\n\\n\\t\\tif ( this.options.disabled ) {\\n\\t\\t\\tthis._setOptionDisabled( this.options.disabled );\\n\\t\\t}\\n\\n\\t\\tthis._trigger( \\\"create\\\", null, this._getCreateEventData() );\\n\\t\\tthis._init();\\n\\t},\\n\\n\\t_getCreateOptions: function() {\\n\\t\\treturn {};\\n\\t},\\n\\n\\t_getCreateEventData: $.noop,\\n\\n\\t_create: $.noop,\\n\\n\\t_init: $.noop,\\n\\n\\tdestroy: function() {\\n\\t\\tvar that = this;\\n\\n\\t\\tthis._destroy();\\n\\t\\t$.each( this.classesElementLookup, function( key, value ) {\\n\\t\\t\\tthat._removeClass( value, key );\\n\\t\\t} );\\n\\n\\t\\t// We can probably remove the unbind calls in 2.0\\n\\t\\t// all event bindings should go through this._on()\\n\\t\\tthis.element\\n\\t\\t\\t.off( this.eventNamespace )\\n\\t\\t\\t.removeData( this.widgetFullName );\\n\\t\\tthis.widget()\\n\\t\\t\\t.off( this.eventNamespace )\\n\\t\\t\\t.removeAttr( \\\"aria-disabled\\\" );\\n\\n\\t\\t// Clean up events and states\\n\\t\\tthis.bindings.off( this.eventNamespace );\\n\\t},\\n\\n\\t_destroy: $.noop,\\n\\n\\twidget: function() {\\n\\t\\treturn this.element;\\n\\t},\\n\\n\\toption: function( key, value ) {\\n\\t\\tvar options = key;\\n\\t\\tvar parts;\\n\\t\\tvar curOption;\\n\\t\\tvar i;\\n\\n\\t\\tif ( arguments.length === 0 ) {\\n\\n\\t\\t\\t// Don't return a reference to the internal hash\\n\\t\\t\\treturn $.widget.extend( {}, this.options );\\n\\t\\t}\\n\\n\\t\\tif ( typeof key === \\\"string\\\" ) {\\n\\n\\t\\t\\t// Handle nested keys, e.g., \\\"foo.bar\\\" => { foo: { bar: ___ } }\\n\\t\\t\\toptions = {};\\n\\t\\t\\tparts = key.split( \\\".\\\" );\\n\\t\\t\\tkey = parts.shift();\\n\\t\\t\\tif ( parts.length ) {\\n\\t\\t\\t\\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\\n\\t\\t\\t\\tfor ( i = 0; i < parts.length - 1; i++ ) {\\n\\t\\t\\t\\t\\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\\n\\t\\t\\t\\t\\tcurOption = curOption[ parts[ i ] ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tkey = parts.pop();\\n\\t\\t\\t\\tif ( arguments.length === 1 ) {\\n\\t\\t\\t\\t\\treturn curOption[ key ] === undefined ? null : curOption[ key ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcurOption[ key ] = value;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif ( arguments.length === 1 ) {\\n\\t\\t\\t\\t\\treturn this.options[ key ] === undefined ? null : this.options[ key ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\toptions[ key ] = value;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis._setOptions( options );\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOptions: function( options ) {\\n\\t\\tvar key;\\n\\n\\t\\tfor ( key in options ) {\\n\\t\\t\\tthis._setOption( key, options[ key ] );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOption: function( key, value ) {\\n\\t\\tif ( key === \\\"classes\\\" ) {\\n\\t\\t\\tthis._setOptionClasses( value );\\n\\t\\t}\\n\\n\\t\\tthis.options[ key ] = value;\\n\\n\\t\\tif ( key === \\\"disabled\\\" ) {\\n\\t\\t\\tthis._setOptionDisabled( value );\\n\\t\\t}\\n\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_setOptionClasses: function( value ) {\\n\\t\\tvar classKey, elements, currentElements;\\n\\n\\t\\tfor ( classKey in value ) {\\n\\t\\t\\tcurrentElements = this.classesElementLookup[ classKey ];\\n\\t\\t\\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\\n\\t\\t\\t\\t\\t!currentElements ||\\n\\t\\t\\t\\t\\t!currentElements.length ) {\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\n\\t\\t\\t// We are doing this to create a new jQuery object because the _removeClass() call\\n\\t\\t\\t// on the next line is going to destroy the reference to the current elements being\\n\\t\\t\\t// tracked. We need to save a copy of this collection so that we can add the new classes\\n\\t\\t\\t// below.\\n\\t\\t\\telements = $( currentElements.get() );\\n\\t\\t\\tthis._removeClass( currentElements, classKey );\\n\\n\\t\\t\\t// We don't use _addClass() here, because that uses this.options.classes\\n\\t\\t\\t// for generating the string of classes. We want to use the value passed in from\\n\\t\\t\\t// _setOption(), this is the new value of the classes option which was passed to\\n\\t\\t\\t// _setOption(). We pass this value directly to _classes().\\n\\t\\t\\telements.addClass( this._classes( {\\n\\t\\t\\t\\telement: elements,\\n\\t\\t\\t\\tkeys: classKey,\\n\\t\\t\\t\\tclasses: value,\\n\\t\\t\\t\\tadd: true\\n\\t\\t\\t} ) );\\n\\t\\t}\\n\\t},\\n\\n\\t_setOptionDisabled: function( value ) {\\n\\t\\tthis._toggleClass( this.widget(), this.widgetFullName + \\\"-disabled\\\", null, !!value );\\n\\n\\t\\t// If the widget is becoming disabled, then nothing is interactive\\n\\t\\tif ( value ) {\\n\\t\\t\\tthis._removeClass( this.hoverable, null, \\\"ui-state-hover\\\" );\\n\\t\\t\\tthis._removeClass( this.focusable, null, \\\"ui-state-focus\\\" );\\n\\t\\t}\\n\\t},\\n\\n\\tenable: function() {\\n\\t\\treturn this._setOptions( { disabled: false } );\\n\\t},\\n\\n\\tdisable: function() {\\n\\t\\treturn this._setOptions( { disabled: true } );\\n\\t},\\n\\n\\t_classes: function( options ) {\\n\\t\\tvar full = [];\\n\\t\\tvar that = this;\\n\\n\\t\\toptions = $.extend( {\\n\\t\\t\\telement: this.element,\\n\\t\\t\\tclasses: this.options.classes || {}\\n\\t\\t}, options );\\n\\n\\t\\tfunction processClassString( classes, checkOption ) {\\n\\t\\t\\tvar current, i;\\n\\t\\t\\tfor ( i = 0; i < classes.length; i++ ) {\\n\\t\\t\\t\\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\\n\\t\\t\\t\\tif ( options.add ) {\\n\\t\\t\\t\\t\\tcurrent = $( $.unique( current.get().concat( options.element.get() ) ) );\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcurrent = $( current.not( options.element ).get() );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tthat.classesElementLookup[ classes[ i ] ] = current;\\n\\t\\t\\t\\tfull.push( classes[ i ] );\\n\\t\\t\\t\\tif ( checkOption && options.classes[ classes[ i ] ] ) {\\n\\t\\t\\t\\t\\tfull.push( options.classes[ classes[ i ] ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis._on( options.element, {\\n\\t\\t\\t\\\"remove\\\": \\\"_untrackClassesElement\\\"\\n\\t\\t} );\\n\\n\\t\\tif ( options.keys ) {\\n\\t\\t\\tprocessClassString( options.keys.match( /\\\\S+/g ) || [], true );\\n\\t\\t}\\n\\t\\tif ( options.extra ) {\\n\\t\\t\\tprocessClassString( options.extra.match( /\\\\S+/g ) || [] );\\n\\t\\t}\\n\\n\\t\\treturn full.join( \\\" \\\" );\\n\\t},\\n\\n\\t_untrackClassesElement: function( event ) {\\n\\t\\tvar that = this;\\n\\t\\t$.each( that.classesElementLookup, function( key, value ) {\\n\\t\\t\\tif ( $.inArray( event.target, value ) !== -1 ) {\\n\\t\\t\\t\\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_removeClass: function( element, keys, extra ) {\\n\\t\\treturn this._toggleClass( element, keys, extra, false );\\n\\t},\\n\\n\\t_addClass: function( element, keys, extra ) {\\n\\t\\treturn this._toggleClass( element, keys, extra, true );\\n\\t},\\n\\n\\t_toggleClass: function( element, keys, extra, add ) {\\n\\t\\tadd = ( typeof add === \\\"boolean\\\" ) ? add : extra;\\n\\t\\tvar shift = ( typeof element === \\\"string\\\" || element === null ),\\n\\t\\t\\toptions = {\\n\\t\\t\\t\\textra: shift ? keys : extra,\\n\\t\\t\\t\\tkeys: shift ? element : keys,\\n\\t\\t\\t\\telement: shift ? this.element : element,\\n\\t\\t\\t\\tadd: add\\n\\t\\t\\t};\\n\\t\\toptions.element.toggleClass( this._classes( options ), add );\\n\\t\\treturn this;\\n\\t},\\n\\n\\t_on: function( suppressDisabledCheck, element, handlers ) {\\n\\t\\tvar delegateElement;\\n\\t\\tvar instance = this;\\n\\n\\t\\t// No suppressDisabledCheck flag, shuffle arguments\\n\\t\\tif ( typeof suppressDisabledCheck !== \\\"boolean\\\" ) {\\n\\t\\t\\thandlers = element;\\n\\t\\t\\telement = suppressDisabledCheck;\\n\\t\\t\\tsuppressDisabledCheck = false;\\n\\t\\t}\\n\\n\\t\\t// No element argument, shuffle and use this.element\\n\\t\\tif ( !handlers ) {\\n\\t\\t\\thandlers = element;\\n\\t\\t\\telement = this.element;\\n\\t\\t\\tdelegateElement = this.widget();\\n\\t\\t} else {\\n\\t\\t\\telement = delegateElement = $( element );\\n\\t\\t\\tthis.bindings = this.bindings.add( element );\\n\\t\\t}\\n\\n\\t\\t$.each( handlers, function( event, handler ) {\\n\\t\\t\\tfunction handlerProxy() {\\n\\n\\t\\t\\t\\t// Allow widgets to customize the disabled handling\\n\\t\\t\\t\\t// - disabled as an array instead of boolean\\n\\t\\t\\t\\t// - disabled class as method for disabling individual parts\\n\\t\\t\\t\\tif ( !suppressDisabledCheck &&\\n\\t\\t\\t\\t\\t\\t( instance.options.disabled === true ||\\n\\t\\t\\t\\t\\t\\t$( this ).hasClass( \\\"ui-state-disabled\\\" ) ) ) {\\n\\t\\t\\t\\t\\treturn;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn ( typeof handler === \\\"string\\\" ? instance[ handler ] : handler )\\n\\t\\t\\t\\t\\t.apply( instance, arguments );\\n\\t\\t\\t}\\n\\n\\t\\t\\t// Copy the guid so direct unbinding works\\n\\t\\t\\tif ( typeof handler !== \\\"string\\\" ) {\\n\\t\\t\\t\\thandlerProxy.guid = handler.guid =\\n\\t\\t\\t\\t\\thandler.guid || handlerProxy.guid || $.guid++;\\n\\t\\t\\t}\\n\\n\\t\\t\\tvar match = event.match( /^([\\\\w:-]*)\\\\s*(.*)$/ );\\n\\t\\t\\tvar eventName = match[ 1 ] + instance.eventNamespace;\\n\\t\\t\\tvar selector = match[ 2 ];\\n\\n\\t\\t\\tif ( selector ) {\\n\\t\\t\\t\\tdelegateElement.on( eventName, selector, handlerProxy );\\n\\t\\t\\t} else {\\n\\t\\t\\t\\telement.on( eventName, handlerProxy );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_off: function( element, eventName ) {\\n\\t\\teventName = ( eventName || \\\"\\\" ).split( \\\" \\\" ).join( this.eventNamespace + \\\" \\\" ) +\\n\\t\\t\\tthis.eventNamespace;\\n\\t\\telement.off( eventName ).off( eventName );\\n\\n\\t\\t// Clear the stack to avoid memory leaks (#10056)\\n\\t\\tthis.bindings = $( this.bindings.not( element ).get() );\\n\\t\\tthis.focusable = $( this.focusable.not( element ).get() );\\n\\t\\tthis.hoverable = $( this.hoverable.not( element ).get() );\\n\\t},\\n\\n\\t_delay: function( handler, delay ) {\\n\\t\\tfunction handlerProxy() {\\n\\t\\t\\treturn ( typeof handler === \\\"string\\\" ? instance[ handler ] : handler )\\n\\t\\t\\t\\t.apply( instance, arguments );\\n\\t\\t}\\n\\t\\tvar instance = this;\\n\\t\\treturn setTimeout( handlerProxy, delay || 0 );\\n\\t},\\n\\n\\t_hoverable: function( element ) {\\n\\t\\tthis.hoverable = this.hoverable.add( element );\\n\\t\\tthis._on( element, {\\n\\t\\t\\tmouseenter: function( event ) {\\n\\t\\t\\t\\tthis._addClass( $( event.currentTarget ), null, \\\"ui-state-hover\\\" );\\n\\t\\t\\t},\\n\\t\\t\\tmouseleave: function( event ) {\\n\\t\\t\\t\\tthis._removeClass( $( event.currentTarget ), null, \\\"ui-state-hover\\\" );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_focusable: function( element ) {\\n\\t\\tthis.focusable = this.focusable.add( element );\\n\\t\\tthis._on( element, {\\n\\t\\t\\tfocusin: function( event ) {\\n\\t\\t\\t\\tthis._addClass( $( event.currentTarget ), null, \\\"ui-state-focus\\\" );\\n\\t\\t\\t},\\n\\t\\t\\tfocusout: function( event ) {\\n\\t\\t\\t\\tthis._removeClass( $( event.currentTarget ), null, \\\"ui-state-focus\\\" );\\n\\t\\t\\t}\\n\\t\\t} );\\n\\t},\\n\\n\\t_trigger: function( type, event, data ) {\\n\\t\\tvar prop, orig;\\n\\t\\tvar callback = this.options[ type ];\\n\\n\\t\\tdata = data || {};\\n\\t\\tevent = $.Event( event );\\n\\t\\tevent.type = ( type === this.widgetEventPrefix ?\\n\\t\\t\\ttype :\\n\\t\\t\\tthis.widgetEventPrefix + type ).toLowerCase();\\n\\n\\t\\t// The original event may come from any element\\n\\t\\t// so we need to reset the target on the new event\\n\\t\\tevent.target = this.element[ 0 ];\\n\\n\\t\\t// Copy original event properties over to the new event\\n\\t\\torig = event.originalEvent;\\n\\t\\tif ( orig ) {\\n\\t\\t\\tfor ( prop in orig ) {\\n\\t\\t\\t\\tif ( !( prop in event ) ) {\\n\\t\\t\\t\\t\\tevent[ prop ] = orig[ prop ];\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tthis.element.trigger( event, data );\\n\\t\\treturn !( $.isFunction( callback ) &&\\n\\t\\t\\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\\n\\t\\t\\tevent.isDefaultPrevented() );\\n\\t}\\n};\\n\\n$.each( { show: \\\"fadeIn\\\", hide: \\\"fadeOut\\\" }, function( method, defaultEffect ) {\\n\\t$.Widget.prototype[ \\\"_\\\" + method ] = function( element, options, callback ) {\\n\\t\\tif ( typeof options === \\\"string\\\" ) {\\n\\t\\t\\toptions = { effect: options };\\n\\t\\t}\\n\\n\\t\\tvar hasOptions;\\n\\t\\tvar effectName = !options ?\\n\\t\\t\\tmethod :\\n\\t\\t\\toptions === true || typeof options === \\\"number\\\" ?\\n\\t\\t\\t\\tdefaultEffect :\\n\\t\\t\\t\\toptions.effect || defaultEffect;\\n\\n\\t\\toptions = options || {};\\n\\t\\tif ( typeof options === \\\"number\\\" ) {\\n\\t\\t\\toptions = { duration: options };\\n\\t\\t}\\n\\n\\t\\thasOptions = !$.isEmptyObject( options );\\n\\t\\toptions.complete = callback;\\n\\n\\t\\tif ( options.delay ) {\\n\\t\\t\\telement.delay( options.delay );\\n\\t\\t}\\n\\n\\t\\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\\n\\t\\t\\telement[ method ]( options );\\n\\t\\t} else if ( effectName !== method && element[ effectName ] ) {\\n\\t\\t\\telement[ effectName ]( options.duration, options.easing, callback );\\n\\t\\t} else {\\n\\t\\t\\telement.queue( function( next ) {\\n\\t\\t\\t\\t$( this )[ method ]();\\n\\t\\t\\t\\tif ( callback ) {\\n\\t\\t\\t\\t\\tcallback.call( element[ 0 ] );\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tnext();\\n\\t\\t\\t} );\\n\\t\\t}\\n\\t};\\n} );\\n\\nreturn $.widget;\\n\\n} ) );\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2pxdWVyeS11aS91aS93aWRnZXQuanM/NDliZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMi4xXG4gKiBodHRwOi8vanF1ZXJ5dWkuY29tXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqL1xuXG4vLz4+bGFiZWw6IFdpZGdldFxuLy8+Pmdyb3VwOiBDb3JlXG4vLz4+ZGVzY3JpcHRpb246IFByb3ZpZGVzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgc3RhdGVmdWwgd2lkZ2V0cyB3aXRoIGEgY29tbW9uIEFQSS5cbi8vPj5kb2NzOiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9qUXVlcnkud2lkZ2V0L1xuLy8+PmRlbW9zOiBodHRwOi8vanF1ZXJ5dWkuY29tL3dpZGdldC9cblxuKCBmdW5jdGlvbiggZmFjdG9yeSApIHtcblx0aWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblxuXHRcdC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoIFsgXCJqcXVlcnlcIiwgXCIuL3ZlcnNpb25cIiBdLCBmYWN0b3J5ICk7XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBCcm93c2VyIGdsb2JhbHNcblx0XHRmYWN0b3J5KCBqUXVlcnkgKTtcblx0fVxufSggZnVuY3Rpb24oICQgKSB7XG5cbnZhciB3aWRnZXRVdWlkID0gMDtcbnZhciB3aWRnZXRTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuJC5jbGVhbkRhdGEgPSAoIGZ1bmN0aW9uKCBvcmlnICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBldmVudHMsIGVsZW0sIGk7XG5cdFx0Zm9yICggaSA9IDA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdC8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lXG5cdFx0XHRcdGV2ZW50cyA9ICQuX2RhdGEoIGVsZW0sIFwiZXZlbnRzXCIgKTtcblx0XHRcdFx0aWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHtcblx0XHRcdFx0XHQkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoIFwicmVtb3ZlXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIdHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0fVxuXHRcdG9yaWcoIGVsZW1zICk7XG5cdH07XG59ICkoICQuY2xlYW5EYXRhICk7XG5cbiQud2lkZ2V0ID0gZnVuY3Rpb24oIG5hbWUsIGJhc2UsIHByb3RvdHlwZSApIHtcblx0dmFyIGV4aXN0aW5nQ29uc3RydWN0b3IsIGNvbnN0cnVjdG9yLCBiYXNlUHJvdG90eXBlO1xuXG5cdC8vIFByb3hpZWRQcm90b3R5cGUgYWxsb3dzIHRoZSBwcm92aWRlZCBwcm90b3R5cGUgdG8gcmVtYWluIHVubW9kaWZpZWRcblx0Ly8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3Nilcblx0dmFyIHByb3hpZWRQcm90b3R5cGUgPSB7fTtcblxuXHR2YXIgbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggXCIuXCIgKVsgMCBdO1xuXHRuYW1lID0gbmFtZS5zcGxpdCggXCIuXCIgKVsgMSBdO1xuXHR2YXIgZnVsbE5hbWUgPSBuYW1lc3BhY2UgKyBcIi1cIiArIG5hbWU7XG5cblx0aWYgKCAhcHJvdG90eXBlICkge1xuXHRcdHByb3RvdHlwZSA9IGJhc2U7XG5cdFx0YmFzZSA9ICQuV2lkZ2V0O1xuXHR9XG5cblx0aWYgKCAkLmlzQXJyYXkoIHByb3RvdHlwZSApICkge1xuXHRcdHByb3RvdHlwZSA9ICQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIHt9IF0uY29uY2F0KCBwcm90b3R5cGUgKSApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW5cblx0JC5leHByWyBcIjpcIiBdWyBmdWxsTmFtZS50b0xvd2VyQ2FzZSgpIF0gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gISEkLmRhdGEoIGVsZW0sIGZ1bGxOYW1lICk7XG5cdH07XG5cblx0JFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTtcblx0ZXhpc3RpbmdDb25zdHJ1Y3RvciA9ICRbIG5hbWVzcGFjZSBdWyBuYW1lIF07XG5cdGNvbnN0cnVjdG9yID0gJFsgbmFtZXNwYWNlIF1bIG5hbWUgXSA9IGZ1bmN0aW9uKCBvcHRpb25zLCBlbGVtZW50ICkge1xuXG5cdFx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IFwibmV3XCIga2V5d29yZFxuXHRcdGlmICggIXRoaXMuX2NyZWF0ZVdpZGdldCApIHtcblx0XHRcdHJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGZvciBzaW1wbGUgaW5oZXJpdGFuY2Vcblx0XHQvLyBtdXN0IHVzZSBcIm5ld1wiIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncylcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHR0aGlzLl9jcmVhdGVXaWRnZXQoIG9wdGlvbnMsIGVsZW1lbnQgKTtcblx0XHR9XG5cdH07XG5cblx0Ly8gRXh0ZW5kIHdpdGggdGhlIGV4aXN0aW5nIGNvbnN0cnVjdG9yIHRvIGNhcnJ5IG92ZXIgYW55IHN0YXRpYyBwcm9wZXJ0aWVzXG5cdCQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3Rvciwge1xuXHRcdHZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLFxuXG5cdFx0Ly8gQ29weSB0aGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBwcm90b3R5cGUgaW4gY2FzZSB3ZSBuZWVkIHRvXG5cdFx0Ly8gcmVkZWZpbmUgdGhlIHdpZGdldCBsYXRlclxuXHRcdF9wcm90bzogJC5leHRlbmQoIHt9LCBwcm90b3R5cGUgKSxcblxuXHRcdC8vIFRyYWNrIHdpZGdldHMgdGhhdCBpbmhlcml0IGZyb20gdGhpcyB3aWRnZXQgaW4gY2FzZSB0aGlzIHdpZGdldCBpc1xuXHRcdC8vIHJlZGVmaW5lZCBhZnRlciBhIHdpZGdldCBpbmhlcml0cyBmcm9tIGl0XG5cdFx0X2NoaWxkQ29uc3RydWN0b3JzOiBbXVxuXHR9ICk7XG5cblx0YmFzZVByb3RvdHlwZSA9IG5ldyBiYXNlKCk7XG5cblx0Ly8gV2UgbmVlZCB0byBtYWtlIHRoZSBvcHRpb25zIGhhc2ggYSBwcm9wZXJ0eSBkaXJlY3RseSBvbiB0aGUgbmV3IGluc3RhbmNlXG5cdC8vIG90aGVyd2lzZSB3ZSdsbCBtb2RpZnkgdGhlIG9wdGlvbnMgaGFzaCBvbiB0aGUgcHJvdG90eXBlIHRoYXQgd2UncmVcblx0Ly8gaW5oZXJpdGluZyBmcm9tXG5cdGJhc2VQcm90b3R5cGUub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sIGJhc2VQcm90b3R5cGUub3B0aW9ucyApO1xuXHQkLmVhY2goIHByb3RvdHlwZSwgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdGlmICggISQuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHByb3hpZWRQcm90b3R5cGVbIHByb3AgXSA9IHZhbHVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZnVuY3Rpb24gX3N1cGVyKCkge1xuXHRcdFx0XHRyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIF9zdXBlckFwcGx5KCBhcmdzICkge1xuXHRcdFx0XHRyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBfX3N1cGVyID0gdGhpcy5fc3VwZXI7XG5cdFx0XHRcdHZhciBfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5O1xuXHRcdFx0XHR2YXIgcmV0dXJuVmFsdWU7XG5cblx0XHRcdFx0dGhpcy5fc3VwZXIgPSBfc3VwZXI7XG5cdFx0XHRcdHRoaXMuX3N1cGVyQXBwbHkgPSBfc3VwZXJBcHBseTtcblxuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHZhbHVlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHRcdFx0XHR0aGlzLl9zdXBlciA9IF9fc3VwZXI7XG5cdFx0XHRcdHRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7XG5cblx0XHRcdFx0cmV0dXJuIHJldHVyblZhbHVlO1xuXHRcdFx0fTtcblx0XHR9ICkoKTtcblx0fSApO1xuXHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSAkLndpZGdldC5leHRlbmQoIGJhc2VQcm90b3R5cGUsIHtcblxuXHRcdC8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeFxuXHRcdC8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydFxuXHRcdC8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWRcblx0XHR3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/ICggYmFzZVByb3RvdHlwZS53aWRnZXRFdmVudFByZWZpeCB8fCBuYW1lICkgOiBuYW1lXG5cdH0sIHByb3hpZWRQcm90b3R5cGUsIHtcblx0XHRjb25zdHJ1Y3RvcjogY29uc3RydWN0b3IsXG5cdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2UsXG5cdFx0d2lkZ2V0TmFtZTogbmFtZSxcblx0XHR3aWRnZXRGdWxsTmFtZTogZnVsbE5hbWVcblx0fSApO1xuXG5cdC8vIElmIHRoaXMgd2lkZ2V0IGlzIGJlaW5nIHJlZGVmaW5lZCB0aGVuIHdlIG5lZWQgdG8gZmluZCBhbGwgd2lkZ2V0cyB0aGF0XG5cdC8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb21cblx0Ly8gdGhlIG5ldyB2ZXJzaW9uIG9mIHRoaXMgd2lkZ2V0LiBXZSdyZSBlc3NlbnRpYWxseSB0cnlpbmcgdG8gcmVwbGFjZSBvbmVcblx0Ly8gbGV2ZWwgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi5cblx0aWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkge1xuXHRcdCQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHtcblx0XHRcdHZhciBjaGlsZFByb3RvdHlwZSA9IGNoaWxkLnByb3RvdHlwZTtcblxuXHRcdFx0Ly8gUmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXNcblx0XHRcdC8vIG9yaWdpbmFsbHkgdXNlZCwgYnV0IGluaGVyaXQgZnJvbSB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGJhc2Vcblx0XHRcdCQud2lkZ2V0KCBjaGlsZFByb3RvdHlwZS5uYW1lc3BhY2UgKyBcIi5cIiArIGNoaWxkUHJvdG90eXBlLndpZGdldE5hbWUsIGNvbnN0cnVjdG9yLFxuXHRcdFx0XHRjaGlsZC5fcHJvdG8gKTtcblx0XHR9ICk7XG5cblx0XHQvLyBSZW1vdmUgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgY2hpbGQgY29uc3RydWN0b3JzIGZyb20gdGhlIG9sZCBjb25zdHJ1Y3RvclxuXHRcdC8vIHNvIHRoZSBvbGQgY2hpbGQgY29uc3RydWN0b3JzIGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZFxuXHRcdGRlbGV0ZSBleGlzdGluZ0NvbnN0cnVjdG9yLl9jaGlsZENvbnN0cnVjdG9ycztcblx0fSBlbHNlIHtcblx0XHRiYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApO1xuXHR9XG5cblx0JC53aWRnZXQuYnJpZGdlKCBuYW1lLCBjb25zdHJ1Y3RvciApO1xuXG5cdHJldHVybiBjb25zdHJ1Y3Rvcjtcbn07XG5cbiQud2lkZ2V0LmV4dGVuZCA9IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdHZhciBpbnB1dCA9IHdpZGdldFNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApO1xuXHR2YXIgaW5wdXRJbmRleCA9IDA7XG5cdHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblx0dmFyIGtleTtcblx0dmFyIHZhbHVlO1xuXG5cdGZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7XG5cdFx0Zm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7XG5cdFx0XHR2YWx1ZSA9IGlucHV0WyBpbnB1dEluZGV4IF1bIGtleSBdO1xuXHRcdFx0aWYgKCBpbnB1dFsgaW5wdXRJbmRleCBdLmhhc093blByb3BlcnR5KCBrZXkgKSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIENsb25lIG9iamVjdHNcblx0XHRcdFx0aWYgKCAkLmlzUGxhaW5PYmplY3QoIHZhbHVlICkgKSB7XG5cdFx0XHRcdFx0dGFyZ2V0WyBrZXkgXSA9ICQuaXNQbGFpbk9iamVjdCggdGFyZ2V0WyBrZXkgXSApID9cblx0XHRcdFx0XHRcdCQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0c1xuXHRcdFx0XHRcdFx0JC53aWRnZXQuZXh0ZW5kKCB7fSwgdmFsdWUgKTtcblxuXHRcdFx0XHQvLyBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBieSByZWZlcmVuY2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0YXJnZXRbIGtleSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHRhcmdldDtcbn07XG5cbiQud2lkZ2V0LmJyaWRnZSA9IGZ1bmN0aW9uKCBuYW1lLCBvYmplY3QgKSB7XG5cdHZhciBmdWxsTmFtZSA9IG9iamVjdC5wcm90b3R5cGUud2lkZ2V0RnVsbE5hbWUgfHwgbmFtZTtcblx0JC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdFx0dmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiO1xuXHRcdHZhciBhcmdzID0gd2lkZ2V0U2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICk7XG5cdFx0dmFyIHJldHVyblZhbHVlID0gdGhpcztcblxuXHRcdGlmICggaXNNZXRob2RDYWxsICkge1xuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGFuIGVtcHR5IGNvbGxlY3Rpb24sIHdlIG5lZWQgdG8gaGF2ZSB0aGUgaW5zdGFuY2UgbWV0aG9kXG5cdFx0XHQvLyByZXR1cm4gdW5kZWZpbmVkIGluc3RlYWQgb2YgdGhlIGpRdWVyeSBpbnN0YW5jZVxuXHRcdFx0aWYgKCAhdGhpcy5sZW5ndGggJiYgb3B0aW9ucyA9PT0gXCJpbnN0YW5jZVwiICkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dmFyIG1ldGhvZFZhbHVlO1xuXHRcdFx0XHRcdHZhciBpbnN0YW5jZSA9ICQuZGF0YSggdGhpcywgZnVsbE5hbWUgKTtcblxuXHRcdFx0XHRcdGlmICggb3B0aW9ucyA9PT0gXCJpbnN0YW5jZVwiICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSBpbnN0YW5jZTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoICFpbnN0YW5jZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiAkLmVycm9yKCBcImNhbm5vdCBjYWxsIG1ldGhvZHMgb24gXCIgKyBuYW1lICtcblx0XHRcdFx0XHRcdFx0XCIgcHJpb3IgdG8gaW5pdGlhbGl6YXRpb247IFwiICtcblx0XHRcdFx0XHRcdFx0XCJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJ1wiICsgb3B0aW9ucyArIFwiJ1wiICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhJC5pc0Z1bmN0aW9uKCBpbnN0YW5jZVsgb3B0aW9ucyBdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gXCJfXCIgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJC5lcnJvciggXCJubyBzdWNoIG1ldGhvZCAnXCIgKyBvcHRpb25zICsgXCInIGZvciBcIiArIG5hbWUgK1xuXHRcdFx0XHRcdFx0XHRcIiB3aWRnZXQgaW5zdGFuY2VcIiApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1ldGhvZFZhbHVlID0gaW5zdGFuY2VbIG9wdGlvbnMgXS5hcHBseSggaW5zdGFuY2UsIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggbWV0aG9kVmFsdWUgIT09IGluc3RhbmNlICYmIG1ldGhvZFZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm5WYWx1ZSA9IG1ldGhvZFZhbHVlICYmIG1ldGhvZFZhbHVlLmpxdWVyeSA/XG5cdFx0XHRcdFx0XHRcdHJldHVyblZhbHVlLnB1c2hTdGFjayggbWV0aG9kVmFsdWUuZ2V0KCkgKSA6XG5cdFx0XHRcdFx0XHRcdG1ldGhvZFZhbHVlO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEFsbG93IG11bHRpcGxlIGhhc2hlcyB0byBiZSBwYXNzZWQgb24gaW5pdFxuXHRcdFx0aWYgKCBhcmdzLmxlbmd0aCApIHtcblx0XHRcdFx0b3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZC5hcHBseSggbnVsbCwgWyBvcHRpb25zIF0uY29uY2F0KCBhcmdzICkgKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApO1xuXHRcdFx0XHRpZiAoIGluc3RhbmNlICkge1xuXHRcdFx0XHRcdGluc3RhbmNlLm9wdGlvbiggb3B0aW9ucyB8fCB7fSApO1xuXHRcdFx0XHRcdGlmICggaW5zdGFuY2UuX2luaXQgKSB7XG5cdFx0XHRcdFx0XHRpbnN0YW5jZS5faW5pdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lLCBuZXcgb2JqZWN0KCBvcHRpb25zLCB0aGlzICkgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXR1cm5WYWx1ZTtcblx0fTtcbn07XG5cbiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTtcbiQuV2lkZ2V0Ll9jaGlsZENvbnN0cnVjdG9ycyA9IFtdO1xuXG4kLldpZGdldC5wcm90b3R5cGUgPSB7XG5cdHdpZGdldE5hbWU6IFwid2lkZ2V0XCIsXG5cdHdpZGdldEV2ZW50UHJlZml4OiBcIlwiLFxuXHRkZWZhdWx0RWxlbWVudDogXCI8ZGl2PlwiLFxuXG5cdG9wdGlvbnM6IHtcblx0XHRjbGFzc2VzOiB7fSxcblx0XHRkaXNhYmxlZDogZmFsc2UsXG5cblx0XHQvLyBDYWxsYmFja3Ncblx0XHRjcmVhdGU6IG51bGxcblx0fSxcblxuXHRfY3JlYXRlV2lkZ2V0OiBmdW5jdGlvbiggb3B0aW9ucywgZWxlbWVudCApIHtcblx0XHRlbGVtZW50ID0gJCggZWxlbWVudCB8fCB0aGlzLmRlZmF1bHRFbGVtZW50IHx8IHRoaXMgKVsgMCBdO1xuXHRcdHRoaXMuZWxlbWVudCA9ICQoIGVsZW1lbnQgKTtcblx0XHR0aGlzLnV1aWQgPSB3aWRnZXRVdWlkKys7XG5cdFx0dGhpcy5ldmVudE5hbWVzcGFjZSA9IFwiLlwiICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkO1xuXG5cdFx0dGhpcy5iaW5kaW5ncyA9ICQoKTtcblx0XHR0aGlzLmhvdmVyYWJsZSA9ICQoKTtcblx0XHR0aGlzLmZvY3VzYWJsZSA9ICQoKTtcblx0XHR0aGlzLmNsYXNzZXNFbGVtZW50TG9va3VwID0ge307XG5cblx0XHRpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7XG5cdFx0XHQkLmRhdGEoIGVsZW1lbnQsIHRoaXMud2lkZ2V0RnVsbE5hbWUsIHRoaXMgKTtcblx0XHRcdHRoaXMuX29uKCB0cnVlLCB0aGlzLmVsZW1lbnQsIHtcblx0XHRcdFx0cmVtb3ZlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdFx0aWYgKCBldmVudC50YXJnZXQgPT09IGVsZW1lbnQgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHRcdHRoaXMuZG9jdW1lbnQgPSAkKCBlbGVtZW50LnN0eWxlID9cblxuXHRcdFx0XHQvLyBFbGVtZW50IHdpdGhpbiB0aGUgZG9jdW1lbnRcblx0XHRcdFx0ZWxlbWVudC5vd25lckRvY3VtZW50IDpcblxuXHRcdFx0XHQvLyBFbGVtZW50IGlzIHdpbmRvdyBvciBkb2N1bWVudFxuXHRcdFx0XHRlbGVtZW50LmRvY3VtZW50IHx8IGVsZW1lbnQgKTtcblx0XHRcdHRoaXMud2luZG93ID0gJCggdGhpcy5kb2N1bWVudFsgMCBdLmRlZmF1bHRWaWV3IHx8IHRoaXMuZG9jdW1lbnRbIDAgXS5wYXJlbnRXaW5kb3cgKTtcblx0XHR9XG5cblx0XHR0aGlzLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LFxuXHRcdFx0dGhpcy5vcHRpb25zLFxuXHRcdFx0dGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLFxuXHRcdFx0b3B0aW9ucyApO1xuXG5cdFx0dGhpcy5fY3JlYXRlKCk7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApIHtcblx0XHRcdHRoaXMuX3NldE9wdGlvbkRpc2FibGVkKCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKTtcblx0XHR9XG5cblx0XHR0aGlzLl90cmlnZ2VyKCBcImNyZWF0ZVwiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApO1xuXHRcdHRoaXMuX2luaXQoKTtcblx0fSxcblxuXHRfZ2V0Q3JlYXRlT3B0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHt9O1xuXHR9LFxuXG5cdF9nZXRDcmVhdGVFdmVudERhdGE6ICQubm9vcCxcblxuXHRfY3JlYXRlOiAkLm5vb3AsXG5cblx0X2luaXQ6ICQubm9vcCxcblxuXHRkZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdGhhdCA9IHRoaXM7XG5cblx0XHR0aGlzLl9kZXN0cm95KCk7XG5cdFx0JC5lYWNoKCB0aGlzLmNsYXNzZXNFbGVtZW50TG9va3VwLCBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRcdHRoYXQuX3JlbW92ZUNsYXNzKCB2YWx1ZSwga2V5ICk7XG5cdFx0fSApO1xuXG5cdFx0Ly8gV2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMFxuXHRcdC8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpXG5cdFx0dGhpcy5lbGVtZW50XG5cdFx0XHQub2ZmKCB0aGlzLmV2ZW50TmFtZXNwYWNlIClcblx0XHRcdC5yZW1vdmVEYXRhKCB0aGlzLndpZGdldEZ1bGxOYW1lICk7XG5cdFx0dGhpcy53aWRnZXQoKVxuXHRcdFx0Lm9mZiggdGhpcy5ldmVudE5hbWVzcGFjZSApXG5cdFx0XHQucmVtb3ZlQXR0ciggXCJhcmlhLWRpc2FibGVkXCIgKTtcblxuXHRcdC8vIENsZWFuIHVwIGV2ZW50cyBhbmQgc3RhdGVzXG5cdFx0dGhpcy5iaW5kaW5ncy5vZmYoIHRoaXMuZXZlbnROYW1lc3BhY2UgKTtcblx0fSxcblxuXHRfZGVzdHJveTogJC5ub29wLFxuXG5cdHdpZGdldDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWxlbWVudDtcblx0fSxcblxuXHRvcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBvcHRpb25zID0ga2V5O1xuXHRcdHZhciBwYXJ0cztcblx0XHR2YXIgY3VyT3B0aW9uO1xuXHRcdHZhciBpO1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHQvLyBEb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2hcblx0XHRcdHJldHVybiAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnMgKTtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vIEhhbmRsZSBuZXN0ZWQga2V5cywgZS5nLiwgXCJmb28uYmFyXCIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9XG5cdFx0XHRvcHRpb25zID0ge307XG5cdFx0XHRwYXJ0cyA9IGtleS5zcGxpdCggXCIuXCIgKTtcblx0XHRcdGtleSA9IHBhcnRzLnNoaWZ0KCk7XG5cdFx0XHRpZiAoIHBhcnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y3VyT3B0aW9uID0gb3B0aW9uc1sga2V5IF0gPSAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnNbIGtleSBdICk7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrICkge1xuXHRcdFx0XHRcdGN1ck9wdGlvblsgcGFydHNbIGkgXSBdID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gfHwge307XG5cdFx0XHRcdFx0Y3VyT3B0aW9uID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF07XG5cdFx0XHRcdH1cblx0XHRcdFx0a2V5ID0gcGFydHMucG9wKCk7XG5cdFx0XHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdFx0XHRyZXR1cm4gY3VyT3B0aW9uWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN1ck9wdGlvblsga2V5IF07XG5cdFx0XHRcdH1cblx0XHRcdFx0Y3VyT3B0aW9uWyBrZXkgXSA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLm9wdGlvbnNbIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5vcHRpb25zWyBrZXkgXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvcHRpb25zWyBrZXkgXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuX3NldE9wdGlvbnMoIG9wdGlvbnMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdF9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHR2YXIga2V5O1xuXG5cdFx0Zm9yICgga2V5IGluIG9wdGlvbnMgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb24oIGtleSwgb3B0aW9uc1sga2V5IF0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRpZiAoIGtleSA9PT0gXCJjbGFzc2VzXCIgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb25DbGFzc2VzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdHRoaXMub3B0aW9uc1sga2V5IF0gPSB2YWx1ZTtcblxuXHRcdGlmICgga2V5ID09PSBcImRpc2FibGVkXCIgKSB7XG5cdFx0XHR0aGlzLl9zZXRPcHRpb25EaXNhYmxlZCggdmFsdWUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRfc2V0T3B0aW9uQ2xhc3NlczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc0tleSwgZWxlbWVudHMsIGN1cnJlbnRFbGVtZW50cztcblxuXHRcdGZvciAoIGNsYXNzS2V5IGluIHZhbHVlICkge1xuXHRcdFx0Y3VycmVudEVsZW1lbnRzID0gdGhpcy5jbGFzc2VzRWxlbWVudExvb2t1cFsgY2xhc3NLZXkgXTtcblx0XHRcdGlmICggdmFsdWVbIGNsYXNzS2V5IF0gPT09IHRoaXMub3B0aW9ucy5jbGFzc2VzWyBjbGFzc0tleSBdIHx8XG5cdFx0XHRcdFx0IWN1cnJlbnRFbGVtZW50cyB8fFxuXHRcdFx0XHRcdCFjdXJyZW50RWxlbWVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gV2UgYXJlIGRvaW5nIHRoaXMgdG8gY3JlYXRlIGEgbmV3IGpRdWVyeSBvYmplY3QgYmVjYXVzZSB0aGUgX3JlbW92ZUNsYXNzKCkgY2FsbFxuXHRcdFx0Ly8gb24gdGhlIG5leHQgbGluZSBpcyBnb2luZyB0byBkZXN0cm95IHRoZSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZWxlbWVudHMgYmVpbmdcblx0XHRcdC8vIHRyYWNrZWQuIFdlIG5lZWQgdG8gc2F2ZSBhIGNvcHkgb2YgdGhpcyBjb2xsZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGFkZCB0aGUgbmV3IGNsYXNzZXNcblx0XHRcdC8vIGJlbG93LlxuXHRcdFx0ZWxlbWVudHMgPSAkKCBjdXJyZW50RWxlbWVudHMuZ2V0KCkgKTtcblx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKCBjdXJyZW50RWxlbWVudHMsIGNsYXNzS2V5ICk7XG5cblx0XHRcdC8vIFdlIGRvbid0IHVzZSBfYWRkQ2xhc3MoKSBoZXJlLCBiZWNhdXNlIHRoYXQgdXNlcyB0aGlzLm9wdGlvbnMuY2xhc3Nlc1xuXHRcdFx0Ly8gZm9yIGdlbmVyYXRpbmcgdGhlIHN0cmluZyBvZiBjbGFzc2VzLiBXZSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgcGFzc2VkIGluIGZyb21cblx0XHRcdC8vIF9zZXRPcHRpb24oKSwgdGhpcyBpcyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBjbGFzc2VzIG9wdGlvbiB3aGljaCB3YXMgcGFzc2VkIHRvXG5cdFx0XHQvLyBfc2V0T3B0aW9uKCkuIFdlIHBhc3MgdGhpcyB2YWx1ZSBkaXJlY3RseSB0byBfY2xhc3NlcygpLlxuXHRcdFx0ZWxlbWVudHMuYWRkQ2xhc3MoIHRoaXMuX2NsYXNzZXMoIHtcblx0XHRcdFx0ZWxlbWVudDogZWxlbWVudHMsXG5cdFx0XHRcdGtleXM6IGNsYXNzS2V5LFxuXHRcdFx0XHRjbGFzc2VzOiB2YWx1ZSxcblx0XHRcdFx0YWRkOiB0cnVlXG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cdH0sXG5cblx0X3NldE9wdGlvbkRpc2FibGVkOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dGhpcy5fdG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0KCksIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyBcIi1kaXNhYmxlZFwiLCBudWxsLCAhIXZhbHVlICk7XG5cblx0XHQvLyBJZiB0aGUgd2lkZ2V0IGlzIGJlY29taW5nIGRpc2FibGVkLCB0aGVuIG5vdGhpbmcgaXMgaW50ZXJhY3RpdmVcblx0XHRpZiAoIHZhbHVlICkge1xuXHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoIHRoaXMuaG92ZXJhYmxlLCBudWxsLCBcInVpLXN0YXRlLWhvdmVyXCIgKTtcblx0XHRcdHRoaXMuX3JlbW92ZUNsYXNzKCB0aGlzLmZvY3VzYWJsZSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdGVuYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoIHsgZGlzYWJsZWQ6IGZhbHNlIH0gKTtcblx0fSxcblxuXHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyggeyBkaXNhYmxlZDogdHJ1ZSB9ICk7XG5cdH0sXG5cblx0X2NsYXNzZXM6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdHZhciBmdWxsID0gW107XG5cdFx0dmFyIHRoYXQgPSB0aGlzO1xuXG5cdFx0b3B0aW9ucyA9ICQuZXh0ZW5kKCB7XG5cdFx0XHRlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG5cdFx0XHRjbGFzc2VzOiB0aGlzLm9wdGlvbnMuY2xhc3NlcyB8fCB7fVxuXHRcdH0sIG9wdGlvbnMgKTtcblxuXHRcdGZ1bmN0aW9uIHByb2Nlc3NDbGFzc1N0cmluZyggY2xhc3NlcywgY2hlY2tPcHRpb24gKSB7XG5cdFx0XHR2YXIgY3VycmVudCwgaTtcblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0Y3VycmVudCA9IHRoYXQuY2xhc3Nlc0VsZW1lbnRMb29rdXBbIGNsYXNzZXNbIGkgXSBdIHx8ICQoKTtcblx0XHRcdFx0aWYgKCBvcHRpb25zLmFkZCApIHtcblx0XHRcdFx0XHRjdXJyZW50ID0gJCggJC51bmlxdWUoIGN1cnJlbnQuZ2V0KCkuY29uY2F0KCBvcHRpb25zLmVsZW1lbnQuZ2V0KCkgKSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y3VycmVudCA9ICQoIGN1cnJlbnQubm90KCBvcHRpb25zLmVsZW1lbnQgKS5nZXQoKSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoYXQuY2xhc3Nlc0VsZW1lbnRMb29rdXBbIGNsYXNzZXNbIGkgXSBdID0gY3VycmVudDtcblx0XHRcdFx0ZnVsbC5wdXNoKCBjbGFzc2VzWyBpIF0gKTtcblx0XHRcdFx0aWYgKCBjaGVja09wdGlvbiAmJiBvcHRpb25zLmNsYXNzZXNbIGNsYXNzZXNbIGkgXSBdICkge1xuXHRcdFx0XHRcdGZ1bGwucHVzaCggb3B0aW9ucy5jbGFzc2VzWyBjbGFzc2VzWyBpIF0gXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5fb24oIG9wdGlvbnMuZWxlbWVudCwge1xuXHRcdFx0XCJyZW1vdmVcIjogXCJfdW50cmFja0NsYXNzZXNFbGVtZW50XCJcblx0XHR9ICk7XG5cblx0XHRpZiAoIG9wdGlvbnMua2V5cyApIHtcblx0XHRcdHByb2Nlc3NDbGFzc1N0cmluZyggb3B0aW9ucy5rZXlzLm1hdGNoKCAvXFxTKy9nICkgfHwgW10sIHRydWUgKTtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmV4dHJhICkge1xuXHRcdFx0cHJvY2Vzc0NsYXNzU3RyaW5nKCBvcHRpb25zLmV4dHJhLm1hdGNoKCAvXFxTKy9nICkgfHwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZnVsbC5qb2luKCBcIiBcIiApO1xuXHR9LFxuXG5cdF91bnRyYWNrQ2xhc3Nlc0VsZW1lbnQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgdGhhdCA9IHRoaXM7XG5cdFx0JC5lYWNoKCB0aGF0LmNsYXNzZXNFbGVtZW50TG9va3VwLCBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHRcdGlmICggJC5pbkFycmF5KCBldmVudC50YXJnZXQsIHZhbHVlICkgIT09IC0xICkge1xuXHRcdFx0XHR0aGF0LmNsYXNzZXNFbGVtZW50TG9va3VwWyBrZXkgXSA9ICQoIHZhbHVlLm5vdCggZXZlbnQudGFyZ2V0ICkuZ2V0KCkgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0X3JlbW92ZUNsYXNzOiBmdW5jdGlvbiggZWxlbWVudCwga2V5cywgZXh0cmEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3RvZ2dsZUNsYXNzKCBlbGVtZW50LCBrZXlzLCBleHRyYSwgZmFsc2UgKTtcblx0fSxcblxuXHRfYWRkQ2xhc3M6IGZ1bmN0aW9uKCBlbGVtZW50LCBrZXlzLCBleHRyYSApIHtcblx0XHRyZXR1cm4gdGhpcy5fdG9nZ2xlQ2xhc3MoIGVsZW1lbnQsIGtleXMsIGV4dHJhLCB0cnVlICk7XG5cdH0sXG5cblx0X3RvZ2dsZUNsYXNzOiBmdW5jdGlvbiggZWxlbWVudCwga2V5cywgZXh0cmEsIGFkZCApIHtcblx0XHRhZGQgPSAoIHR5cGVvZiBhZGQgPT09IFwiYm9vbGVhblwiICkgPyBhZGQgOiBleHRyYTtcblx0XHR2YXIgc2hpZnQgPSAoIHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiIHx8IGVsZW1lbnQgPT09IG51bGwgKSxcblx0XHRcdG9wdGlvbnMgPSB7XG5cdFx0XHRcdGV4dHJhOiBzaGlmdCA/IGtleXMgOiBleHRyYSxcblx0XHRcdFx0a2V5czogc2hpZnQgPyBlbGVtZW50IDoga2V5cyxcblx0XHRcdFx0ZWxlbWVudDogc2hpZnQgPyB0aGlzLmVsZW1lbnQgOiBlbGVtZW50LFxuXHRcdFx0XHRhZGQ6IGFkZFxuXHRcdFx0fTtcblx0XHRvcHRpb25zLmVsZW1lbnQudG9nZ2xlQ2xhc3MoIHRoaXMuX2NsYXNzZXMoIG9wdGlvbnMgKSwgYWRkICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0X29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgZGVsZWdhdGVFbGVtZW50O1xuXHRcdHZhciBpbnN0YW5jZSA9IHRoaXM7XG5cblx0XHQvLyBObyBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgZmxhZywgc2h1ZmZsZSBhcmd1bWVudHNcblx0XHRpZiAoIHR5cGVvZiBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgIT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0aGFuZGxlcnMgPSBlbGVtZW50O1xuXHRcdFx0ZWxlbWVudCA9IHN1cHByZXNzRGlzYWJsZWRDaGVjaztcblx0XHRcdHN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIE5vIGVsZW1lbnQgYXJndW1lbnQsIHNodWZmbGUgYW5kIHVzZSB0aGlzLmVsZW1lbnRcblx0XHRpZiAoICFoYW5kbGVycyApIHtcblx0XHRcdGhhbmRsZXJzID0gZWxlbWVudDtcblx0XHRcdGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7XG5cdFx0XHRkZWxlZ2F0ZUVsZW1lbnQgPSB0aGlzLndpZGdldCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtZW50ID0gZGVsZWdhdGVFbGVtZW50ID0gJCggZWxlbWVudCApO1xuXHRcdFx0dGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7XG5cdFx0fVxuXG5cdFx0JC5lYWNoKCBoYW5kbGVycywgZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVyICkge1xuXHRcdFx0ZnVuY3Rpb24gaGFuZGxlclByb3h5KCkge1xuXG5cdFx0XHRcdC8vIEFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZ1xuXHRcdFx0XHQvLyAtIGRpc2FibGVkIGFzIGFuIGFycmF5IGluc3RlYWQgb2YgYm9vbGVhblxuXHRcdFx0XHQvLyAtIGRpc2FibGVkIGNsYXNzIGFzIG1ldGhvZCBmb3IgZGlzYWJsaW5nIGluZGl2aWR1YWwgcGFydHNcblx0XHRcdFx0aWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmXG5cdFx0XHRcdFx0XHQoIGluc3RhbmNlLm9wdGlvbnMuZGlzYWJsZWQgPT09IHRydWUgfHxcblx0XHRcdFx0XHRcdCQoIHRoaXMgKS5oYXNDbGFzcyggXCJ1aS1zdGF0ZS1kaXNhYmxlZFwiICkgKSApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFwic3RyaW5nXCIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApXG5cdFx0XHRcdFx0LmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3Jrc1xuXHRcdFx0aWYgKCB0eXBlb2YgaGFuZGxlciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0aGFuZGxlclByb3h5Lmd1aWQgPSBoYW5kbGVyLmd1aWQgPVxuXHRcdFx0XHRcdGhhbmRsZXIuZ3VpZCB8fCBoYW5kbGVyUHJveHkuZ3VpZCB8fCAkLmd1aWQrKztcblx0XHRcdH1cblxuXHRcdFx0dmFyIG1hdGNoID0gZXZlbnQubWF0Y2goIC9eKFtcXHc6LV0qKVxccyooLiopJC8gKTtcblx0XHRcdHZhciBldmVudE5hbWUgPSBtYXRjaFsgMSBdICsgaW5zdGFuY2UuZXZlbnROYW1lc3BhY2U7XG5cdFx0XHR2YXIgc2VsZWN0b3IgPSBtYXRjaFsgMiBdO1xuXG5cdFx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0XHRkZWxlZ2F0ZUVsZW1lbnQub24oIGV2ZW50TmFtZSwgc2VsZWN0b3IsIGhhbmRsZXJQcm94eSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbWVudC5vbiggZXZlbnROYW1lLCBoYW5kbGVyUHJveHkgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0X29mZjogZnVuY3Rpb24oIGVsZW1lbnQsIGV2ZW50TmFtZSApIHtcblx0XHRldmVudE5hbWUgPSAoIGV2ZW50TmFtZSB8fCBcIlwiICkuc3BsaXQoIFwiIFwiICkuam9pbiggdGhpcy5ldmVudE5hbWVzcGFjZSArIFwiIFwiICkgK1xuXHRcdFx0dGhpcy5ldmVudE5hbWVzcGFjZTtcblx0XHRlbGVtZW50Lm9mZiggZXZlbnROYW1lICkub2ZmKCBldmVudE5hbWUgKTtcblxuXHRcdC8vIENsZWFyIHRoZSBzdGFjayB0byBhdm9pZCBtZW1vcnkgbGVha3MgKCMxMDA1Nilcblx0XHR0aGlzLmJpbmRpbmdzID0gJCggdGhpcy5iaW5kaW5ncy5ub3QoIGVsZW1lbnQgKS5nZXQoKSApO1xuXHRcdHRoaXMuZm9jdXNhYmxlID0gJCggdGhpcy5mb2N1c2FibGUubm90KCBlbGVtZW50ICkuZ2V0KCkgKTtcblx0XHR0aGlzLmhvdmVyYWJsZSA9ICQoIHRoaXMuaG92ZXJhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7XG5cdH0sXG5cblx0X2RlbGF5OiBmdW5jdGlvbiggaGFuZGxlciwgZGVsYXkgKSB7XG5cdFx0ZnVuY3Rpb24gaGFuZGxlclByb3h5KCkge1xuXHRcdFx0cmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09IFwic3RyaW5nXCIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApXG5cdFx0XHRcdC5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0XHR2YXIgaW5zdGFuY2UgPSB0aGlzO1xuXHRcdHJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTtcblx0fSxcblxuXHRfaG92ZXJhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHtcblx0XHR0aGlzLmhvdmVyYWJsZSA9IHRoaXMuaG92ZXJhYmxlLmFkZCggZWxlbWVudCApO1xuXHRcdHRoaXMuX29uKCBlbGVtZW50LCB7XG5cdFx0XHRtb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHRoaXMuX2FkZENsYXNzKCAkKCBldmVudC5jdXJyZW50VGFyZ2V0ICksIG51bGwsIFwidWktc3RhdGUtaG92ZXJcIiApO1xuXHRcdFx0fSxcblx0XHRcdG1vdXNlbGVhdmU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1ob3ZlclwiICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdF9mb2N1c2FibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkge1xuXHRcdHRoaXMuZm9jdXNhYmxlID0gdGhpcy5mb2N1c2FibGUuYWRkKCBlbGVtZW50ICk7XG5cdFx0dGhpcy5fb24oIGVsZW1lbnQsIHtcblx0XHRcdGZvY3VzaW46IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fYWRkQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0XHR9LFxuXHRcdFx0Zm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlQ2xhc3MoICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwgbnVsbCwgXCJ1aS1zdGF0ZS1mb2N1c1wiICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdF90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7XG5cdFx0dmFyIHByb3AsIG9yaWc7XG5cdFx0dmFyIGNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07XG5cblx0XHRkYXRhID0gZGF0YSB8fCB7fTtcblx0XHRldmVudCA9ICQuRXZlbnQoIGV2ZW50ICk7XG5cdFx0ZXZlbnQudHlwZSA9ICggdHlwZSA9PT0gdGhpcy53aWRnZXRFdmVudFByZWZpeCA/XG5cdFx0XHR0eXBlIDpcblx0XHRcdHRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTtcblxuXHRcdC8vIFRoZSBvcmlnaW5hbCBldmVudCBtYXkgY29tZSBmcm9tIGFueSBlbGVtZW50XG5cdFx0Ly8gc28gd2UgbmVlZCB0byByZXNldCB0aGUgdGFyZ2V0IG9uIHRoZSBuZXcgZXZlbnRcblx0XHRldmVudC50YXJnZXQgPSB0aGlzLmVsZW1lbnRbIDAgXTtcblxuXHRcdC8vIENvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnRcblx0XHRvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDtcblx0XHRpZiAoIG9yaWcgKSB7XG5cdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdGlmICggISggcHJvcCBpbiBldmVudCApICkge1xuXHRcdFx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmVsZW1lbnQudHJpZ2dlciggZXZlbnQsIGRhdGEgKTtcblx0XHRyZXR1cm4gISggJC5pc0Z1bmN0aW9uKCBjYWxsYmFjayApICYmXG5cdFx0XHRjYWxsYmFjay5hcHBseSggdGhpcy5lbGVtZW50WyAwIF0sIFsgZXZlbnQgXS5jb25jYXQoIGRhdGEgKSApID09PSBmYWxzZSB8fFxuXHRcdFx0ZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKTtcblx0fVxufTtcblxuJC5lYWNoKCB7IHNob3c6IFwiZmFkZUluXCIsIGhpZGU6IFwiZmFkZU91dFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIGRlZmF1bHRFZmZlY3QgKSB7XG5cdCQuV2lkZ2V0LnByb3RvdHlwZVsgXCJfXCIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHtcblx0XHRpZiAoIHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07XG5cdFx0fVxuXG5cdFx0dmFyIGhhc09wdGlvbnM7XG5cdFx0dmFyIGVmZmVjdE5hbWUgPSAhb3B0aW9ucyA/XG5cdFx0XHRtZXRob2QgOlxuXHRcdFx0b3B0aW9ucyA9PT0gdHJ1ZSB8fCB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJudW1iZXJcIiA/XG5cdFx0XHRcdGRlZmF1bHRFZmZlY3QgOlxuXHRcdFx0XHRvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0O1xuXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0aWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB7IGR1cmF0aW9uOiBvcHRpb25zIH07XG5cdFx0fVxuXG5cdFx0aGFzT3B0aW9ucyA9ICEkLmlzRW1wdHlPYmplY3QoIG9wdGlvbnMgKTtcblx0XHRvcHRpb25zLmNvbXBsZXRlID0gY2FsbGJhY2s7XG5cblx0XHRpZiAoIG9wdGlvbnMuZGVsYXkgKSB7XG5cdFx0XHRlbGVtZW50LmRlbGF5KCBvcHRpb25zLmRlbGF5ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7XG5cdFx0XHRlbGVtZW50WyBtZXRob2QgXSggb3B0aW9ucyApO1xuXHRcdH0gZWxzZSBpZiAoIGVmZmVjdE5hbWUgIT09IG1ldGhvZCAmJiBlbGVtZW50WyBlZmZlY3ROYW1lIF0gKSB7XG5cdFx0XHRlbGVtZW50WyBlZmZlY3ROYW1lIF0oIG9wdGlvbnMuZHVyYXRpb24sIG9wdGlvbnMuZWFzaW5nLCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtZW50LnF1ZXVlKCBmdW5jdGlvbiggbmV4dCApIHtcblx0XHRcdFx0JCggdGhpcyApWyBtZXRob2QgXSgpO1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrLmNhbGwoIGVsZW1lbnRbIDAgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5leHQoKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbnJldHVybiAkLndpZGdldDtcblxufSApICk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vanF1ZXJ5LXVpL3VpL3dpZGdldC5qc1xuLy8gbW9kdWxlIGlkID0gMjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;/**\\n * @license\\n * Lodash \\n * Copyright JS Foundation and other contributors \\n * Released under MIT license \\n * Based on Underscore.js 1.8.3 \\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\\n */\\n;(function() {\\n\\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\\n var undefined;\\n\\n /** Used as the semantic version number. */\\n var VERSION = '4.17.4';\\n\\n /** Used as the size to enable large array optimizations. */\\n var LARGE_ARRAY_SIZE = 200;\\n\\n /** Error message constants. */\\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\\n FUNC_ERROR_TEXT = 'Expected a function';\\n\\n /** Used to stand-in for `undefined` hash values. */\\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\\n\\n /** Used as the maximum memoize cache size. */\\n var MAX_MEMOIZE_SIZE = 500;\\n\\n /** Used as the internal argument placeholder. */\\n var PLACEHOLDER = '__lodash_placeholder__';\\n\\n /** Used to compose bitmasks for cloning. */\\n var CLONE_DEEP_FLAG = 1,\\n CLONE_FLAT_FLAG = 2,\\n CLONE_SYMBOLS_FLAG = 4;\\n\\n /** Used to compose bitmasks for value comparisons. */\\n var COMPARE_PARTIAL_FLAG = 1,\\n COMPARE_UNORDERED_FLAG = 2;\\n\\n /** Used to compose bitmasks for function metadata. */\\n var WRAP_BIND_FLAG = 1,\\n WRAP_BIND_KEY_FLAG = 2,\\n WRAP_CURRY_BOUND_FLAG = 4,\\n WRAP_CURRY_FLAG = 8,\\n WRAP_CURRY_RIGHT_FLAG = 16,\\n WRAP_PARTIAL_FLAG = 32,\\n WRAP_PARTIAL_RIGHT_FLAG = 64,\\n WRAP_ARY_FLAG = 128,\\n WRAP_REARG_FLAG = 256,\\n WRAP_FLIP_FLAG = 512;\\n\\n /** Used as default options for `_.truncate`. */\\n var DEFAULT_TRUNC_LENGTH = 30,\\n DEFAULT_TRUNC_OMISSION = '...';\\n\\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\\n var HOT_COUNT = 800,\\n HOT_SPAN = 16;\\n\\n /** Used to indicate the type of lazy iteratees. */\\n var LAZY_FILTER_FLAG = 1,\\n LAZY_MAP_FLAG = 2,\\n LAZY_WHILE_FLAG = 3;\\n\\n /** Used as references for various `Number` constants. */\\n var INFINITY = 1 / 0,\\n MAX_SAFE_INTEGER = 9007199254740991,\\n MAX_INTEGER = 1.7976931348623157e+308,\\n NAN = 0 / 0;\\n\\n /** Used as references for the maximum length and index of an array. */\\n var MAX_ARRAY_LENGTH = 4294967295,\\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\\n\\n /** Used to associate wrap methods with their bit flags. */\\n var wrapFlags = [\\n ['ary', WRAP_ARY_FLAG],\\n ['bind', WRAP_BIND_FLAG],\\n ['bindKey', WRAP_BIND_KEY_FLAG],\\n ['curry', WRAP_CURRY_FLAG],\\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\\n ['flip', WRAP_FLIP_FLAG],\\n ['partial', WRAP_PARTIAL_FLAG],\\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\\n ['rearg', WRAP_REARG_FLAG]\\n ];\\n\\n /** `Object#toString` result references. */\\n var argsTag = '[object Arguments]',\\n arrayTag = '[object Array]',\\n asyncTag = '[object AsyncFunction]',\\n boolTag = '[object Boolean]',\\n dateTag = '[object Date]',\\n domExcTag = '[object DOMException]',\\n errorTag = '[object Error]',\\n funcTag = '[object Function]',\\n genTag = '[object GeneratorFunction]',\\n mapTag = '[object Map]',\\n numberTag = '[object Number]',\\n nullTag = '[object Null]',\\n objectTag = '[object Object]',\\n promiseTag = '[object Promise]',\\n proxyTag = '[object Proxy]',\\n regexpTag = '[object RegExp]',\\n setTag = '[object Set]',\\n stringTag = '[object String]',\\n symbolTag = '[object Symbol]',\\n undefinedTag = '[object Undefined]',\\n weakMapTag = '[object WeakMap]',\\n weakSetTag = '[object WeakSet]';\\n\\n var arrayBufferTag = '[object ArrayBuffer]',\\n dataViewTag = '[object DataView]',\\n float32Tag = '[object Float32Array]',\\n float64Tag = '[object Float64Array]',\\n int8Tag = '[object Int8Array]',\\n int16Tag = '[object Int16Array]',\\n int32Tag = '[object Int32Array]',\\n uint8Tag = '[object Uint8Array]',\\n uint8ClampedTag = '[object Uint8ClampedArray]',\\n uint16Tag = '[object Uint16Array]',\\n uint32Tag = '[object Uint32Array]';\\n\\n /** Used to match empty string literals in compiled template source. */\\n var reEmptyStringLeading = /\\\\b__p \\\\+= '';/g,\\n reEmptyStringMiddle = /\\\\b(__p \\\\+=) '' \\\\+/g,\\n reEmptyStringTrailing = /(__e\\\\(.*?\\\\)|\\\\b__t\\\\)) \\\\+\\\\n'';/g;\\n\\n /** Used to match HTML entities and HTML characters. */\\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\\n reUnescapedHtml = /[&<>\\\"']/g,\\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\\n\\n /** Used to match template delimiters. */\\n var reEscape = /<%-([\\\\s\\\\S]+?)%>/g,\\n reEvaluate = /<%([\\\\s\\\\S]+?)%>/g,\\n reInterpolate = /<%=([\\\\s\\\\S]+?)%>/g;\\n\\n /** Used to match property names within property paths. */\\n var reIsDeepProp = /\\\\.|\\\\[(?:[^[\\\\]]*|([\\\"'])(?:(?!\\\\1)[^\\\\\\\\]|\\\\\\\\.)*?\\\\1)\\\\]/,\\n reIsPlainProp = /^\\\\w*$/,\\n reLeadingDot = /^\\\\./,\\n rePropName = /[^.[\\\\]]+|\\\\[(?:(-?\\\\d+(?:\\\\.\\\\d+)?)|([\\\"'])((?:(?!\\\\2)[^\\\\\\\\]|\\\\\\\\.)*?)\\\\2)\\\\]|(?=(?:\\\\.|\\\\[\\\\])(?:\\\\.|\\\\[\\\\]|$))/g;\\n\\n /**\\n * Used to match `RegExp`\\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\\n */\\n var reRegExpChar = /[\\\\\\\\^$.*+?()[\\\\]{}|]/g,\\n reHasRegExpChar = RegExp(reRegExpChar.source);\\n\\n /** Used to match leading and trailing whitespace. */\\n var reTrim = /^\\\\s+|\\\\s+$/g,\\n reTrimStart = /^\\\\s+/,\\n reTrimEnd = /\\\\s+$/;\\n\\n /** Used to match wrap detail comments. */\\n var reWrapComment = /\\\\{(?:\\\\n\\\\/\\\\* \\\\[wrapped with .+\\\\] \\\\*\\\\/)?\\\\n?/,\\n reWrapDetails = /\\\\{\\\\n\\\\/\\\\* \\\\[wrapped with (.+)\\\\] \\\\*/,\\n reSplitDetails = /,? & /;\\n\\n /** Used to match words composed of alphanumeric characters. */\\n var reAsciiWord = /[^\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\x7f]+/g;\\n\\n /** Used to match backslashes in property paths. */\\n var reEscapeChar = /\\\\\\\\(\\\\\\\\)?/g;\\n\\n /**\\n * Used to match\\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\\n */\\n var reEsTemplate = /\\\\$\\\\{([^\\\\\\\\}]*(?:\\\\\\\\.[^\\\\\\\\}]*)*)\\\\}/g;\\n\\n /** Used to match `RegExp` flags from their coerced string values. */\\n var reFlags = /\\\\w*$/;\\n\\n /** Used to detect bad signed hexadecimal string values. */\\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\\n\\n /** Used to detect binary string values. */\\n var reIsBinary = /^0b[01]+$/i;\\n\\n /** Used to detect host constructors (Safari). */\\n var reIsHostCtor = /^\\\\[object .+?Constructor\\\\]$/;\\n\\n /** Used to detect octal string values. */\\n var reIsOctal = /^0o[0-7]+$/i;\\n\\n /** Used to detect unsigned integer values. */\\n var reIsUint = /^(?:0|[1-9]\\\\d*)$/;\\n\\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\\n var reLatin = /[\\\\xc0-\\\\xd6\\\\xd8-\\\\xf6\\\\xf8-\\\\xff\\\\u0100-\\\\u017f]/g;\\n\\n /** Used to ensure capturing order of template delimiters. */\\n var reNoMatch = /($^)/;\\n\\n /** Used to match unescaped characters in compiled string literals. */\\n var reUnescapedString = /['\\\\n\\\\r\\\\u2028\\\\u2029\\\\\\\\]/g;\\n\\n /** Used to compose unicode character classes. */\\n var rsAstralRange = '\\\\\\\\ud800-\\\\\\\\udfff',\\n rsComboMarksRange = '\\\\\\\\u0300-\\\\\\\\u036f',\\n reComboHalfMarksRange = '\\\\\\\\ufe20-\\\\\\\\ufe2f',\\n rsComboSymbolsRange = '\\\\\\\\u20d0-\\\\\\\\u20ff',\\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\\n rsDingbatRange = '\\\\\\\\u2700-\\\\\\\\u27bf',\\n rsLowerRange = 'a-z\\\\\\\\xdf-\\\\\\\\xf6\\\\\\\\xf8-\\\\\\\\xff',\\n rsMathOpRange = '\\\\\\\\xac\\\\\\\\xb1\\\\\\\\xd7\\\\\\\\xf7',\\n rsNonCharRange = '\\\\\\\\x00-\\\\\\\\x2f\\\\\\\\x3a-\\\\\\\\x40\\\\\\\\x5b-\\\\\\\\x60\\\\\\\\x7b-\\\\\\\\xbf',\\n rsPunctuationRange = '\\\\\\\\u2000-\\\\\\\\u206f',\\n rsSpaceRange = ' \\\\\\\\t\\\\\\\\x0b\\\\\\\\f\\\\\\\\xa0\\\\\\\\ufeff\\\\\\\\n\\\\\\\\r\\\\\\\\u2028\\\\\\\\u2029\\\\\\\\u1680\\\\\\\\u180e\\\\\\\\u2000\\\\\\\\u2001\\\\\\\\u2002\\\\\\\\u2003\\\\\\\\u2004\\\\\\\\u2005\\\\\\\\u2006\\\\\\\\u2007\\\\\\\\u2008\\\\\\\\u2009\\\\\\\\u200a\\\\\\\\u202f\\\\\\\\u205f\\\\\\\\u3000',\\n rsUpperRange = 'A-Z\\\\\\\\xc0-\\\\\\\\xd6\\\\\\\\xd8-\\\\\\\\xde',\\n rsVarRange = '\\\\\\\\ufe0e\\\\\\\\ufe0f',\\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\\n\\n /** Used to compose unicode capture groups. */\\n var rsApos = \\\"['\\\\u2019]\\\",\\n rsAstral = '[' + rsAstralRange + ']',\\n rsBreak = '[' + rsBreakRange + ']',\\n rsCombo = '[' + rsComboRange + ']',\\n rsDigits = '\\\\\\\\d+',\\n rsDingbat = '[' + rsDingbatRange + ']',\\n rsLower = '[' + rsLowerRange + ']',\\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\\n rsFitz = '\\\\\\\\ud83c[\\\\\\\\udffb-\\\\\\\\udfff]',\\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\\n rsNonAstral = '[^' + rsAstralRange + ']',\\n rsRegional = '(?:\\\\\\\\ud83c[\\\\\\\\udde6-\\\\\\\\uddff]){2}',\\n rsSurrPair = '[\\\\\\\\ud800-\\\\\\\\udbff][\\\\\\\\udc00-\\\\\\\\udfff]',\\n rsUpper = '[' + rsUpperRange + ']',\\n rsZWJ = '\\\\\\\\u200d';\\n\\n /** Used to compose unicode regexes. */\\n var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\\n reOptMod = rsModifier + '?',\\n rsOptVar = '[' + rsVarRange + ']?',\\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\\n rsOrdLower = '\\\\\\\\d*(?:(?:1st|2nd|3rd|(?![123])\\\\\\\\dth)\\\\\\\\b)',\\n rsOrdUpper = '\\\\\\\\d*(?:(?:1ST|2ND|3RD|(?![123])\\\\\\\\dTH)\\\\\\\\b)',\\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\\n\\n /** Used to match apostrophes. */\\n var reApos = RegExp(rsApos, 'g');\\n\\n /**\\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\\n */\\n var reComboMark = RegExp(rsCombo, 'g');\\n\\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\\n\\n /** Used to match complex or compound words. */\\n var reUnicodeWord = RegExp([\\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\\n rsUpper + '+' + rsOptContrUpper,\\n rsOrdUpper,\\n rsOrdLower,\\n rsDigits,\\n rsEmoji\\n ].join('|'), 'g');\\n\\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\\n\\n /** Used to detect strings that need a more robust regexp to match words. */\\n var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\\n\\n /** Used to assign default `context` object properties. */\\n var contextProps = [\\n 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\\n 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\\n '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\\n ];\\n\\n /** Used to make template sourceURLs easier to identify. */\\n var templateCounter = -1;\\n\\n /** Used to identify `toStringTag` values of typed arrays. */\\n var typedArrayTags = {};\\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\\n typedArrayTags[uint32Tag] = true;\\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\\n typedArrayTags[weakMapTag] = false;\\n\\n /** Used to identify `toStringTag` values supported by `_.clone`. */\\n var cloneableTags = {};\\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\\n cloneableTags[boolTag] = cloneableTags[dateTag] =\\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\\n cloneableTags[numberTag] = cloneableTags[objectTag] =\\n cloneableTags[regexpTag] = cloneableTags[setTag] =\\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\\n cloneableTags[errorTag] = cloneableTags[funcTag] =\\n cloneableTags[weakMapTag] = false;\\n\\n /** Used to map Latin Unicode letters to basic Latin letters. */\\n var deburredLetters = {\\n // Latin-1 Supplement block.\\n '\\\\xc0': 'A', '\\\\xc1': 'A', '\\\\xc2': 'A', '\\\\xc3': 'A', '\\\\xc4': 'A', '\\\\xc5': 'A',\\n '\\\\xe0': 'a', '\\\\xe1': 'a', '\\\\xe2': 'a', '\\\\xe3': 'a', '\\\\xe4': 'a', '\\\\xe5': 'a',\\n '\\\\xc7': 'C', '\\\\xe7': 'c',\\n '\\\\xd0': 'D', '\\\\xf0': 'd',\\n '\\\\xc8': 'E', '\\\\xc9': 'E', '\\\\xca': 'E', '\\\\xcb': 'E',\\n '\\\\xe8': 'e', '\\\\xe9': 'e', '\\\\xea': 'e', '\\\\xeb': 'e',\\n '\\\\xcc': 'I', '\\\\xcd': 'I', '\\\\xce': 'I', '\\\\xcf': 'I',\\n '\\\\xec': 'i', '\\\\xed': 'i', '\\\\xee': 'i', '\\\\xef': 'i',\\n '\\\\xd1': 'N', '\\\\xf1': 'n',\\n '\\\\xd2': 'O', '\\\\xd3': 'O', '\\\\xd4': 'O', '\\\\xd5': 'O', '\\\\xd6': 'O', '\\\\xd8': 'O',\\n '\\\\xf2': 'o', '\\\\xf3': 'o', '\\\\xf4': 'o', '\\\\xf5': 'o', '\\\\xf6': 'o', '\\\\xf8': 'o',\\n '\\\\xd9': 'U', '\\\\xda': 'U', '\\\\xdb': 'U', '\\\\xdc': 'U',\\n '\\\\xf9': 'u', '\\\\xfa': 'u', '\\\\xfb': 'u', '\\\\xfc': 'u',\\n '\\\\xdd': 'Y', '\\\\xfd': 'y', '\\\\xff': 'y',\\n '\\\\xc6': 'Ae', '\\\\xe6': 'ae',\\n '\\\\xde': 'Th', '\\\\xfe': 'th',\\n '\\\\xdf': 'ss',\\n // Latin Extended-A block.\\n '\\\\u0100': 'A', '\\\\u0102': 'A', '\\\\u0104': 'A',\\n '\\\\u0101': 'a', '\\\\u0103': 'a', '\\\\u0105': 'a',\\n '\\\\u0106': 'C', '\\\\u0108': 'C', '\\\\u010a': 'C', '\\\\u010c': 'C',\\n '\\\\u0107': 'c', '\\\\u0109': 'c', '\\\\u010b': 'c', '\\\\u010d': 'c',\\n '\\\\u010e': 'D', '\\\\u0110': 'D', '\\\\u010f': 'd', '\\\\u0111': 'd',\\n '\\\\u0112': 'E', '\\\\u0114': 'E', '\\\\u0116': 'E', '\\\\u0118': 'E', '\\\\u011a': 'E',\\n '\\\\u0113': 'e', '\\\\u0115': 'e', '\\\\u0117': 'e', '\\\\u0119': 'e', '\\\\u011b': 'e',\\n '\\\\u011c': 'G', '\\\\u011e': 'G', '\\\\u0120': 'G', '\\\\u0122': 'G',\\n '\\\\u011d': 'g', '\\\\u011f': 'g', '\\\\u0121': 'g', '\\\\u0123': 'g',\\n '\\\\u0124': 'H', '\\\\u0126': 'H', '\\\\u0125': 'h', '\\\\u0127': 'h',\\n '\\\\u0128': 'I', '\\\\u012a': 'I', '\\\\u012c': 'I', '\\\\u012e': 'I', '\\\\u0130': 'I',\\n '\\\\u0129': 'i', '\\\\u012b': 'i', '\\\\u012d': 'i', '\\\\u012f': 'i', '\\\\u0131': 'i',\\n '\\\\u0134': 'J', '\\\\u0135': 'j',\\n '\\\\u0136': 'K', '\\\\u0137': 'k', '\\\\u0138': 'k',\\n '\\\\u0139': 'L', '\\\\u013b': 'L', '\\\\u013d': 'L', '\\\\u013f': 'L', '\\\\u0141': 'L',\\n '\\\\u013a': 'l', '\\\\u013c': 'l', '\\\\u013e': 'l', '\\\\u0140': 'l', '\\\\u0142': 'l',\\n '\\\\u0143': 'N', '\\\\u0145': 'N', '\\\\u0147': 'N', '\\\\u014a': 'N',\\n '\\\\u0144': 'n', '\\\\u0146': 'n', '\\\\u0148': 'n', '\\\\u014b': 'n',\\n '\\\\u014c': 'O', '\\\\u014e': 'O', '\\\\u0150': 'O',\\n '\\\\u014d': 'o', '\\\\u014f': 'o', '\\\\u0151': 'o',\\n '\\\\u0154': 'R', '\\\\u0156': 'R', '\\\\u0158': 'R',\\n '\\\\u0155': 'r', '\\\\u0157': 'r', '\\\\u0159': 'r',\\n '\\\\u015a': 'S', '\\\\u015c': 'S', '\\\\u015e': 'S', '\\\\u0160': 'S',\\n '\\\\u015b': 's', '\\\\u015d': 's', '\\\\u015f': 's', '\\\\u0161': 's',\\n '\\\\u0162': 'T', '\\\\u0164': 'T', '\\\\u0166': 'T',\\n '\\\\u0163': 't', '\\\\u0165': 't', '\\\\u0167': 't',\\n '\\\\u0168': 'U', '\\\\u016a': 'U', '\\\\u016c': 'U', '\\\\u016e': 'U', '\\\\u0170': 'U', '\\\\u0172': 'U',\\n '\\\\u0169': 'u', '\\\\u016b': 'u', '\\\\u016d': 'u', '\\\\u016f': 'u', '\\\\u0171': 'u', '\\\\u0173': 'u',\\n '\\\\u0174': 'W', '\\\\u0175': 'w',\\n '\\\\u0176': 'Y', '\\\\u0177': 'y', '\\\\u0178': 'Y',\\n '\\\\u0179': 'Z', '\\\\u017b': 'Z', '\\\\u017d': 'Z',\\n '\\\\u017a': 'z', '\\\\u017c': 'z', '\\\\u017e': 'z',\\n '\\\\u0132': 'IJ', '\\\\u0133': 'ij',\\n '\\\\u0152': 'Oe', '\\\\u0153': 'oe',\\n '\\\\u0149': \\\"'n\\\", '\\\\u017f': 's'\\n };\\n\\n /** Used to map characters to HTML entities. */\\n var htmlEscapes = {\\n '&': '&',\\n '<': '<',\\n '>': '>',\\n '\\\"': '"',\\n \\\"'\\\": '''\\n };\\n\\n /** Used to map HTML entities to characters. */\\n var htmlUnescapes = {\\n '&': '&',\\n '<': '<',\\n '>': '>',\\n '"': '\\\"',\\n ''': \\\"'\\\"\\n };\\n\\n /** Used to escape characters for inclusion in compiled string literals. */\\n var stringEscapes = {\\n '\\\\\\\\': '\\\\\\\\',\\n \\\"'\\\": \\\"'\\\",\\n '\\\\n': 'n',\\n '\\\\r': 'r',\\n '\\\\u2028': 'u2028',\\n '\\\\u2029': 'u2029'\\n };\\n\\n /** Built-in method references without a dependency on `root`. */\\n var freeParseFloat = parseFloat,\\n freeParseInt = parseInt;\\n\\n /** Detect free variable `global` from Node.js. */\\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\\n\\n /** Detect free variable `self`. */\\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\\n\\n /** Used as a reference to the global object. */\\n var root = freeGlobal || freeSelf || Function('return this')();\\n\\n /** Detect free variable `exports`. */\\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\\n\\n /** Detect free variable `module`. */\\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\\n\\n /** Detect the popular CommonJS extension `module.exports`. */\\n var moduleExports = freeModule && freeModule.exports === freeExports;\\n\\n /** Detect free variable `process` from Node.js. */\\n var freeProcess = moduleExports && freeGlobal.process;\\n\\n /** Used to access faster Node.js helpers. */\\n var nodeUtil = (function() {\\n try {\\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\\n } catch (e) {}\\n }());\\n\\n /* Node.js helper references. */\\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\\n nodeIsDate = nodeUtil && nodeUtil.isDate,\\n nodeIsMap = nodeUtil && nodeUtil.isMap,\\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\\n nodeIsSet = nodeUtil && nodeUtil.isSet,\\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\\n\\n /*--------------------------------------------------------------------------*/\\n\\n /**\\n * Adds the key-value `pair` to `map`.\\n *\\n * @private\\n * @param {Object} map The map to modify.\\n * @param {Array} pair The key-value pair to add.\\n * @returns {Object} Returns `map`.\\n */\\n function addMapEntry(map, pair) {\\n // Don't return `map.set` because it's not chainable in IE 11.\\n map.set(pair[0], pair[1]);\\n return map;\\n }\\n\\n /**\\n * Adds `value` to `set`.\\n *\\n * @private\\n * @param {Object} set The set to modify.\\n * @param {*} value The value to add.\\n * @returns {Object} Returns `set`.\\n */\\n function addSetEntry(set, value) {\\n // Don't return `set.add` because it's not chainable in IE 11.\\n set.add(value);\\n return set;\\n }\\n\\n /**\\n * A faster alternative to `Function#apply`, this function invokes `func`\\n * with the `this` binding of `thisArg` and the arguments of `args`.\\n *\\n * @private\\n * @param {Function} func The function to invoke.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {Array} args The arguments to invoke `func` with.\\n * @returns {*} Returns the result of `func`.\\n */\\n function apply(func, thisArg, args) {\\n switch (args.length) {\\n case 0: return func.call(thisArg);\\n case 1: return func.call(thisArg, args[0]);\\n case 2: return func.call(thisArg, args[0], args[1]);\\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\\n }\\n return func.apply(thisArg, args);\\n }\\n\\n /**\\n * A specialized version of `baseAggregator` for arrays.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform keys.\\n * @param {Object} accumulator The initial aggregated object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function arrayAggregator(array, setter, iteratee, accumulator) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n var value = array[index];\\n setter(accumulator, value, iteratee(value), array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.forEach` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayEach(array, iteratee) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (iteratee(array[index], index, array) === false) {\\n break;\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.forEachRight` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayEachRight(array, iteratee) {\\n var length = array == null ? 0 : array.length;\\n\\n while (length--) {\\n if (iteratee(array[length], length, array) === false) {\\n break;\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.every` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`.\\n */\\n function arrayEvery(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (!predicate(array[index], index, array)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * A specialized version of `_.filter` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n */\\n function arrayFilter(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (predicate(value, index, array)) {\\n result[resIndex++] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.includes` for arrays without support for\\n * specifying an index to search from.\\n *\\n * @private\\n * @param {Array} [array] The array to inspect.\\n * @param {*} target The value to search for.\\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\\n */\\n function arrayIncludes(array, value) {\\n var length = array == null ? 0 : array.length;\\n return !!length && baseIndexOf(array, value, 0) > -1;\\n }\\n\\n /**\\n * This function is like `arrayIncludes` except that it accepts a comparator.\\n *\\n * @private\\n * @param {Array} [array] The array to inspect.\\n * @param {*} target The value to search for.\\n * @param {Function} comparator The comparator invoked per element.\\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\\n */\\n function arrayIncludesWith(array, value, comparator) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (comparator(value, array[index])) {\\n return true;\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * A specialized version of `_.map` for arrays without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n */\\n function arrayMap(array, iteratee) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n result = Array(length);\\n\\n while (++index < length) {\\n result[index] = iteratee(array[index], index, array);\\n }\\n return result;\\n }\\n\\n /**\\n * Appends the elements of `values` to `array`.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to append.\\n * @returns {Array} Returns `array`.\\n */\\n function arrayPush(array, values) {\\n var index = -1,\\n length = values.length,\\n offset = array.length;\\n\\n while (++index < length) {\\n array[offset + index] = values[index];\\n }\\n return array;\\n }\\n\\n /**\\n * A specialized version of `_.reduce` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @param {boolean} [initAccum] Specify using the first element of `array` as\\n * the initial value.\\n * @returns {*} Returns the accumulated value.\\n */\\n function arrayReduce(array, iteratee, accumulator, initAccum) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n if (initAccum && length) {\\n accumulator = array[++index];\\n }\\n while (++index < length) {\\n accumulator = iteratee(accumulator, array[index], index, array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.reduceRight` for arrays without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @param {boolean} [initAccum] Specify using the last element of `array` as\\n * the initial value.\\n * @returns {*} Returns the accumulated value.\\n */\\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\\n var length = array == null ? 0 : array.length;\\n if (initAccum && length) {\\n accumulator = array[--length];\\n }\\n while (length--) {\\n accumulator = iteratee(accumulator, array[length], length, array);\\n }\\n return accumulator;\\n }\\n\\n /**\\n * A specialized version of `_.some` for arrays without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} [array] The array to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n */\\n function arraySome(array, predicate) {\\n var index = -1,\\n length = array == null ? 0 : array.length;\\n\\n while (++index < length) {\\n if (predicate(array[index], index, array)) {\\n return true;\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * Gets the size of an ASCII `string`.\\n *\\n * @private\\n * @param {string} string The string inspect.\\n * @returns {number} Returns the string size.\\n */\\n var asciiSize = baseProperty('length');\\n\\n /**\\n * Converts an ASCII `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function asciiToArray(string) {\\n return string.split('');\\n }\\n\\n /**\\n * Splits an ASCII `string` into an array of its words.\\n *\\n * @private\\n * @param {string} The string to inspect.\\n * @returns {Array} Returns the words of `string`.\\n */\\n function asciiWords(string) {\\n return string.match(reAsciiWord) || [];\\n }\\n\\n /**\\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\\n * without support for iteratee shorthands, which iterates over `collection`\\n * using `eachFunc`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {Function} eachFunc The function to iterate over `collection`.\\n * @returns {*} Returns the found element or its key, else `undefined`.\\n */\\n function baseFindKey(collection, predicate, eachFunc) {\\n var result;\\n eachFunc(collection, function(value, key, collection) {\\n if (predicate(value, key, collection)) {\\n result = key;\\n return false;\\n }\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\\n * support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {number} fromIndex The index to search from.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\\n var length = array.length,\\n index = fromIndex + (fromRight ? 1 : -1);\\n\\n while ((fromRight ? index-- : ++index < length)) {\\n if (predicate(array[index], index, array)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseIndexOf(array, value, fromIndex) {\\n return value === value\\n ? strictIndexOf(array, value, fromIndex)\\n : baseFindIndex(array, baseIsNaN, fromIndex);\\n }\\n\\n /**\\n * This function is like `baseIndexOf` except that it accepts a comparator.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @param {Function} comparator The comparator invoked per element.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function baseIndexOfWith(array, value, fromIndex, comparator) {\\n var index = fromIndex - 1,\\n length = array.length;\\n\\n while (++index < length) {\\n if (comparator(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * The base implementation of `_.isNaN` without support for number objects.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\\n */\\n function baseIsNaN(value) {\\n return value !== value;\\n }\\n\\n /**\\n * The base implementation of `_.mean` and `_.meanBy` without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {number} Returns the mean.\\n */\\n function baseMean(array, iteratee) {\\n var length = array == null ? 0 : array.length;\\n return length ? (baseSum(array, iteratee) / length) : NAN;\\n }\\n\\n /**\\n * The base implementation of `_.property` without support for deep paths.\\n *\\n * @private\\n * @param {string} key The key of the property to get.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function baseProperty(key) {\\n return function(object) {\\n return object == null ? undefined : object[key];\\n };\\n }\\n\\n /**\\n * The base implementation of `_.propertyOf` without support for deep paths.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function basePropertyOf(object) {\\n return function(key) {\\n return object == null ? undefined : object[key];\\n };\\n }\\n\\n /**\\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {*} accumulator The initial value.\\n * @param {boolean} initAccum Specify using the first or last element of\\n * `collection` as the initial value.\\n * @param {Function} eachFunc The function to iterate over `collection`.\\n * @returns {*} Returns the accumulated value.\\n */\\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\\n eachFunc(collection, function(value, index, collection) {\\n accumulator = initAccum\\n ? (initAccum = false, value)\\n : iteratee(accumulator, value, index, collection);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.sortBy` which uses `comparer` to define the\\n * sort order of `array` and replaces criteria objects with their corresponding\\n * values.\\n *\\n * @private\\n * @param {Array} array The array to sort.\\n * @param {Function} comparer The function to define sort order.\\n * @returns {Array} Returns `array`.\\n */\\n function baseSortBy(array, comparer) {\\n var length = array.length;\\n\\n array.sort(comparer);\\n while (length--) {\\n array[length] = array[length].value;\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.sum` and `_.sumBy` without support for\\n * iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {number} Returns the sum.\\n */\\n function baseSum(array, iteratee) {\\n var result,\\n index = -1,\\n length = array.length;\\n\\n while (++index < length) {\\n var current = iteratee(array[index]);\\n if (current !== undefined) {\\n result = result === undefined ? current : (result + current);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.times` without support for iteratee shorthands\\n * or max array length checks.\\n *\\n * @private\\n * @param {number} n The number of times to invoke `iteratee`.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the array of results.\\n */\\n function baseTimes(n, iteratee) {\\n var index = -1,\\n result = Array(n);\\n\\n while (++index < n) {\\n result[index] = iteratee(index);\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\\n * of key-value pairs for `object` corresponding to the property names of `props`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} props The property names to get values for.\\n * @returns {Object} Returns the key-value pairs.\\n */\\n function baseToPairs(object, props) {\\n return arrayMap(props, function(key) {\\n return [key, object[key]];\\n });\\n }\\n\\n /**\\n * The base implementation of `_.unary` without support for storing metadata.\\n *\\n * @private\\n * @param {Function} func The function to cap arguments for.\\n * @returns {Function} Returns the new capped function.\\n */\\n function baseUnary(func) {\\n return function(value) {\\n return func(value);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.values` and `_.valuesIn` which creates an\\n * array of `object` property values corresponding to the property names\\n * of `props`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} props The property names to get values for.\\n * @returns {Object} Returns the array of property values.\\n */\\n function baseValues(object, props) {\\n return arrayMap(props, function(key) {\\n return object[key];\\n });\\n }\\n\\n /**\\n * Checks if a `cache` value for `key` exists.\\n *\\n * @private\\n * @param {Object} cache The cache to query.\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function cacheHas(cache, key) {\\n return cache.has(key);\\n }\\n\\n /**\\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\\n * that is not found in the character symbols.\\n *\\n * @private\\n * @param {Array} strSymbols The string symbols to inspect.\\n * @param {Array} chrSymbols The character symbols to find.\\n * @returns {number} Returns the index of the first unmatched string symbol.\\n */\\n function charsStartIndex(strSymbols, chrSymbols) {\\n var index = -1,\\n length = strSymbols.length;\\n\\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\\n return index;\\n }\\n\\n /**\\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\\n * that is not found in the character symbols.\\n *\\n * @private\\n * @param {Array} strSymbols The string symbols to inspect.\\n * @param {Array} chrSymbols The character symbols to find.\\n * @returns {number} Returns the index of the last unmatched string symbol.\\n */\\n function charsEndIndex(strSymbols, chrSymbols) {\\n var index = strSymbols.length;\\n\\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\\n return index;\\n }\\n\\n /**\\n * Gets the number of `placeholder` occurrences in `array`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} placeholder The placeholder to search for.\\n * @returns {number} Returns the placeholder count.\\n */\\n function countHolders(array, placeholder) {\\n var length = array.length,\\n result = 0;\\n\\n while (length--) {\\n if (array[length] === placeholder) {\\n ++result;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\\n * letters to basic Latin letters.\\n *\\n * @private\\n * @param {string} letter The matched letter to deburr.\\n * @returns {string} Returns the deburred letter.\\n */\\n var deburrLetter = basePropertyOf(deburredLetters);\\n\\n /**\\n * Used by `_.escape` to convert characters to HTML entities.\\n *\\n * @private\\n * @param {string} chr The matched character to escape.\\n * @returns {string} Returns the escaped character.\\n */\\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\\n\\n /**\\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\\n *\\n * @private\\n * @param {string} chr The matched character to escape.\\n * @returns {string} Returns the escaped character.\\n */\\n function escapeStringChar(chr) {\\n return '\\\\\\\\' + stringEscapes[chr];\\n }\\n\\n /**\\n * Gets the value at `key` of `object`.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {string} key The key of the property to get.\\n * @returns {*} Returns the property value.\\n */\\n function getValue(object, key) {\\n return object == null ? undefined : object[key];\\n }\\n\\n /**\\n * Checks if `string` contains Unicode symbols.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\\n */\\n function hasUnicode(string) {\\n return reHasUnicode.test(string);\\n }\\n\\n /**\\n * Checks if `string` contains a word composed of Unicode symbols.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {boolean} Returns `true` if a word is found, else `false`.\\n */\\n function hasUnicodeWord(string) {\\n return reHasUnicodeWord.test(string);\\n }\\n\\n /**\\n * Converts `iterator` to an array.\\n *\\n * @private\\n * @param {Object} iterator The iterator to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function iteratorToArray(iterator) {\\n var data,\\n result = [];\\n\\n while (!(data = iterator.next()).done) {\\n result.push(data.value);\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `map` to its key-value pairs.\\n *\\n * @private\\n * @param {Object} map The map to convert.\\n * @returns {Array} Returns the key-value pairs.\\n */\\n function mapToArray(map) {\\n var index = -1,\\n result = Array(map.size);\\n\\n map.forEach(function(value, key) {\\n result[++index] = [key, value];\\n });\\n return result;\\n }\\n\\n /**\\n * Creates a unary function that invokes `func` with its argument transformed.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {Function} transform The argument transform.\\n * @returns {Function} Returns the new function.\\n */\\n function overArg(func, transform) {\\n return function(arg) {\\n return func(transform(arg));\\n };\\n }\\n\\n /**\\n * Replaces all `placeholder` elements in `array` with an internal placeholder\\n * and returns an array of their indexes.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {*} placeholder The placeholder to replace.\\n * @returns {Array} Returns the new array of placeholder indexes.\\n */\\n function replaceHolders(array, placeholder) {\\n var index = -1,\\n length = array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (value === placeholder || value === PLACEHOLDER) {\\n array[index] = PLACEHOLDER;\\n result[resIndex++] = index;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `set` to an array of its values.\\n *\\n * @private\\n * @param {Object} set The set to convert.\\n * @returns {Array} Returns the values.\\n */\\n function setToArray(set) {\\n var index = -1,\\n result = Array(set.size);\\n\\n set.forEach(function(value) {\\n result[++index] = value;\\n });\\n return result;\\n }\\n\\n /**\\n * Converts `set` to its value-value pairs.\\n *\\n * @private\\n * @param {Object} set The set to convert.\\n * @returns {Array} Returns the value-value pairs.\\n */\\n function setToPairs(set) {\\n var index = -1,\\n result = Array(set.size);\\n\\n set.forEach(function(value) {\\n result[++index] = [value, value];\\n });\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.indexOf` which performs strict equality\\n * comparisons of values, i.e. `===`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function strictIndexOf(array, value, fromIndex) {\\n var index = fromIndex - 1,\\n length = array.length;\\n\\n while (++index < length) {\\n if (array[index] === value) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * A specialized version of `_.lastIndexOf` which performs strict equality\\n * comparisons of values, i.e. `===`.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} fromIndex The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function strictLastIndexOf(array, value, fromIndex) {\\n var index = fromIndex + 1;\\n while (index--) {\\n if (array[index] === value) {\\n return index;\\n }\\n }\\n return index;\\n }\\n\\n /**\\n * Gets the number of symbols in `string`.\\n *\\n * @private\\n * @param {string} string The string to inspect.\\n * @returns {number} Returns the string size.\\n */\\n function stringSize(string) {\\n return hasUnicode(string)\\n ? unicodeSize(string)\\n : asciiSize(string);\\n }\\n\\n /**\\n * Converts `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function stringToArray(string) {\\n return hasUnicode(string)\\n ? unicodeToArray(string)\\n : asciiToArray(string);\\n }\\n\\n /**\\n * Used by `_.unescape` to convert HTML entities to characters.\\n *\\n * @private\\n * @param {string} chr The matched character to unescape.\\n * @returns {string} Returns the unescaped character.\\n */\\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\\n\\n /**\\n * Gets the size of a Unicode `string`.\\n *\\n * @private\\n * @param {string} string The string inspect.\\n * @returns {number} Returns the string size.\\n */\\n function unicodeSize(string) {\\n var result = reUnicode.lastIndex = 0;\\n while (reUnicode.test(string)) {\\n ++result;\\n }\\n return result;\\n }\\n\\n /**\\n * Converts a Unicode `string` to an array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the converted array.\\n */\\n function unicodeToArray(string) {\\n return string.match(reUnicode) || [];\\n }\\n\\n /**\\n * Splits a Unicode `string` into an array of its words.\\n *\\n * @private\\n * @param {string} The string to inspect.\\n * @returns {Array} Returns the words of `string`.\\n */\\n function unicodeWords(string) {\\n return string.match(reUnicodeWord) || [];\\n }\\n\\n /*--------------------------------------------------------------------------*/\\n\\n /**\\n * Create a new pristine `lodash` function using the `context` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Util\\n * @param {Object} [context=root] The context object.\\n * @returns {Function} Returns a new `lodash` function.\\n * @example\\n *\\n * _.mixin({ 'foo': _.constant('foo') });\\n *\\n * var lodash = _.runInContext();\\n * lodash.mixin({ 'bar': lodash.constant('bar') });\\n *\\n * _.isFunction(_.foo);\\n * // => true\\n * _.isFunction(_.bar);\\n * // => false\\n *\\n * lodash.isFunction(lodash.foo);\\n * // => false\\n * lodash.isFunction(lodash.bar);\\n * // => true\\n *\\n * // Create a suped-up `defer` in Node.js.\\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\\n */\\n var runInContext = (function runInContext(context) {\\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\\n\\n /** Built-in constructor references. */\\n var Array = context.Array,\\n Date = context.Date,\\n Error = context.Error,\\n Function = context.Function,\\n Math = context.Math,\\n Object = context.Object,\\n RegExp = context.RegExp,\\n String = context.String,\\n TypeError = context.TypeError;\\n\\n /** Used for built-in method references. */\\n var arrayProto = Array.prototype,\\n funcProto = Function.prototype,\\n objectProto = Object.prototype;\\n\\n /** Used to detect overreaching core-js shims. */\\n var coreJsData = context['__core-js_shared__'];\\n\\n /** Used to resolve the decompiled source of functions. */\\n var funcToString = funcProto.toString;\\n\\n /** Used to check objects for own properties. */\\n var hasOwnProperty = objectProto.hasOwnProperty;\\n\\n /** Used to generate unique IDs. */\\n var idCounter = 0;\\n\\n /** Used to detect methods masquerading as native. */\\n var maskSrcKey = (function() {\\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\\n return uid ? ('Symbol(src)_1.' + uid) : '';\\n }());\\n\\n /**\\n * Used to resolve the\\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\\n * of values.\\n */\\n var nativeObjectToString = objectProto.toString;\\n\\n /** Used to infer the `Object` constructor. */\\n var objectCtorString = funcToString.call(Object);\\n\\n /** Used to restore the original `_` reference in `_.noConflict`. */\\n var oldDash = root._;\\n\\n /** Used to detect if a method is native. */\\n var reIsNative = RegExp('^' +\\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\\\\\$&')\\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\\\\\\\()| for .+?(?=\\\\\\\\\\\\])/g, '$1.*?') + '$'\\n );\\n\\n /** Built-in value references. */\\n var Buffer = moduleExports ? context.Buffer : undefined,\\n Symbol = context.Symbol,\\n Uint8Array = context.Uint8Array,\\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\\n getPrototype = overArg(Object.getPrototypeOf, Object),\\n objectCreate = Object.create,\\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\\n splice = arrayProto.splice,\\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\\n symIterator = Symbol ? Symbol.iterator : undefined,\\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\\n\\n var defineProperty = (function() {\\n try {\\n var func = getNative(Object, 'defineProperty');\\n func({}, '', {});\\n return func;\\n } catch (e) {}\\n }());\\n\\n /** Mocked built-ins. */\\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\\n\\n /* Built-in method references for those with the same name as other `lodash` methods. */\\n var nativeCeil = Math.ceil,\\n nativeFloor = Math.floor,\\n nativeGetSymbols = Object.getOwnPropertySymbols,\\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\\n nativeIsFinite = context.isFinite,\\n nativeJoin = arrayProto.join,\\n nativeKeys = overArg(Object.keys, Object),\\n nativeMax = Math.max,\\n nativeMin = Math.min,\\n nativeNow = Date.now,\\n nativeParseInt = context.parseInt,\\n nativeRandom = Math.random,\\n nativeReverse = arrayProto.reverse;\\n\\n /* Built-in method references that are verified to be native. */\\n var DataView = getNative(context, 'DataView'),\\n Map = getNative(context, 'Map'),\\n Promise = getNative(context, 'Promise'),\\n Set = getNative(context, 'Set'),\\n WeakMap = getNative(context, 'WeakMap'),\\n nativeCreate = getNative(Object, 'create');\\n\\n /** Used to store function metadata. */\\n var metaMap = WeakMap && new WeakMap;\\n\\n /** Used to lookup unminified function names. */\\n var realNames = {};\\n\\n /** Used to detect maps, sets, and weakmaps. */\\n var dataViewCtorString = toSource(DataView),\\n mapCtorString = toSource(Map),\\n promiseCtorString = toSource(Promise),\\n setCtorString = toSource(Set),\\n weakMapCtorString = toSource(WeakMap);\\n\\n /** Used to convert symbols to primitives and strings. */\\n var symbolProto = Symbol ? Symbol.prototype : undefined,\\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\\n symbolToString = symbolProto ? symbolProto.toString : undefined;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a `lodash` object which wraps `value` to enable implicit method\\n * chain sequences. Methods that operate on and return arrays, collections,\\n * and functions can be chained together. Methods that retrieve a single value\\n * or may return a primitive value will automatically end the chain sequence\\n * and return the unwrapped value. Otherwise, the value must be unwrapped\\n * with `_#value`.\\n *\\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\\n * enabled using `_.chain`.\\n *\\n * The execution of chained methods is lazy, that is, it's deferred until\\n * `_#value` is implicitly or explicitly called.\\n *\\n * Lazy evaluation allows several methods to support shortcut fusion.\\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\\n * the creation of intermediate arrays and can greatly reduce the number of\\n * iteratee executions. Sections of a chain sequence qualify for shortcut\\n * fusion if the section is applied to an array and iteratees accept only\\n * one argument. The heuristic for whether a section qualifies for shortcut\\n * fusion is subject to change.\\n *\\n * Chaining is supported in custom builds as long as the `_#value` method is\\n * directly or indirectly included in the build.\\n *\\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\\n *\\n * The wrapper `Array` methods are:\\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\\n *\\n * The wrapper `String` methods are:\\n * `replace` and `split`\\n *\\n * The wrapper methods that support shortcut fusion are:\\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\\n *\\n * The chainable wrapper methods are:\\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\\n * `zipObject`, `zipObjectDeep`, and `zipWith`\\n *\\n * The wrapper methods that are **not** chainable by default are:\\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\\n * `upperFirst`, `value`, and `words`\\n *\\n * @name _\\n * @constructor\\n * @category Seq\\n * @param {*} value The value to wrap in a `lodash` instance.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var wrapped = _([1, 2, 3]);\\n *\\n * // Returns an unwrapped value.\\n * wrapped.reduce(_.add);\\n * // => 6\\n *\\n * // Returns a wrapped value.\\n * var squares = wrapped.map(square);\\n *\\n * _.isArray(squares);\\n * // => false\\n *\\n * _.isArray(squares.value());\\n * // => true\\n */\\n function lodash(value) {\\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\\n if (value instanceof LodashWrapper) {\\n return value;\\n }\\n if (hasOwnProperty.call(value, '__wrapped__')) {\\n return wrapperClone(value);\\n }\\n }\\n return new LodashWrapper(value);\\n }\\n\\n /**\\n * The base implementation of `_.create` without support for assigning\\n * properties to the created object.\\n *\\n * @private\\n * @param {Object} proto The object to inherit from.\\n * @returns {Object} Returns the new object.\\n */\\n var baseCreate = (function() {\\n function object() {}\\n return function(proto) {\\n if (!isObject(proto)) {\\n return {};\\n }\\n if (objectCreate) {\\n return objectCreate(proto);\\n }\\n object.prototype = proto;\\n var result = new object;\\n object.prototype = undefined;\\n return result;\\n };\\n }());\\n\\n /**\\n * The function whose prototype chain sequence wrappers inherit from.\\n *\\n * @private\\n */\\n function baseLodash() {\\n // No operation performed.\\n }\\n\\n /**\\n * The base constructor for creating `lodash` wrapper objects.\\n *\\n * @private\\n * @param {*} value The value to wrap.\\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\\n */\\n function LodashWrapper(value, chainAll) {\\n this.__wrapped__ = value;\\n this.__actions__ = [];\\n this.__chain__ = !!chainAll;\\n this.__index__ = 0;\\n this.__values__ = undefined;\\n }\\n\\n /**\\n * By default, the template delimiters used by lodash are like those in\\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\\n * following template settings to use alternative delimiters.\\n *\\n * @static\\n * @memberOf _\\n * @type {Object}\\n */\\n lodash.templateSettings = {\\n\\n /**\\n * Used to detect `data` property values to be HTML-escaped.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'escape': reEscape,\\n\\n /**\\n * Used to detect code to be evaluated.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'evaluate': reEvaluate,\\n\\n /**\\n * Used to detect `data` property values to inject.\\n *\\n * @memberOf _.templateSettings\\n * @type {RegExp}\\n */\\n 'interpolate': reInterpolate,\\n\\n /**\\n * Used to reference the data object in the template text.\\n *\\n * @memberOf _.templateSettings\\n * @type {string}\\n */\\n 'variable': '',\\n\\n /**\\n * Used to import variables into the compiled template.\\n *\\n * @memberOf _.templateSettings\\n * @type {Object}\\n */\\n 'imports': {\\n\\n /**\\n * A reference to the `lodash` function.\\n *\\n * @memberOf _.templateSettings.imports\\n * @type {Function}\\n */\\n '_': lodash\\n }\\n };\\n\\n // Ensure wrappers are instances of `baseLodash`.\\n lodash.prototype = baseLodash.prototype;\\n lodash.prototype.constructor = lodash;\\n\\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\\n LodashWrapper.prototype.constructor = LodashWrapper;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\\n *\\n * @private\\n * @constructor\\n * @param {*} value The value to wrap.\\n */\\n function LazyWrapper(value) {\\n this.__wrapped__ = value;\\n this.__actions__ = [];\\n this.__dir__ = 1;\\n this.__filtered__ = false;\\n this.__iteratees__ = [];\\n this.__takeCount__ = MAX_ARRAY_LENGTH;\\n this.__views__ = [];\\n }\\n\\n /**\\n * Creates a clone of the lazy wrapper object.\\n *\\n * @private\\n * @name clone\\n * @memberOf LazyWrapper\\n * @returns {Object} Returns the cloned `LazyWrapper` object.\\n */\\n function lazyClone() {\\n var result = new LazyWrapper(this.__wrapped__);\\n result.__actions__ = copyArray(this.__actions__);\\n result.__dir__ = this.__dir__;\\n result.__filtered__ = this.__filtered__;\\n result.__iteratees__ = copyArray(this.__iteratees__);\\n result.__takeCount__ = this.__takeCount__;\\n result.__views__ = copyArray(this.__views__);\\n return result;\\n }\\n\\n /**\\n * Reverses the direction of lazy iteration.\\n *\\n * @private\\n * @name reverse\\n * @memberOf LazyWrapper\\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\\n */\\n function lazyReverse() {\\n if (this.__filtered__) {\\n var result = new LazyWrapper(this);\\n result.__dir__ = -1;\\n result.__filtered__ = true;\\n } else {\\n result = this.clone();\\n result.__dir__ *= -1;\\n }\\n return result;\\n }\\n\\n /**\\n * Extracts the unwrapped value from its lazy wrapper.\\n *\\n * @private\\n * @name value\\n * @memberOf LazyWrapper\\n * @returns {*} Returns the unwrapped value.\\n */\\n function lazyValue() {\\n var array = this.__wrapped__.value(),\\n dir = this.__dir__,\\n isArr = isArray(array),\\n isRight = dir < 0,\\n arrLength = isArr ? array.length : 0,\\n view = getView(0, arrLength, this.__views__),\\n start = view.start,\\n end = view.end,\\n length = end - start,\\n index = isRight ? end : (start - 1),\\n iteratees = this.__iteratees__,\\n iterLength = iteratees.length,\\n resIndex = 0,\\n takeCount = nativeMin(length, this.__takeCount__);\\n\\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\\n return baseWrapperValue(array, this.__actions__);\\n }\\n var result = [];\\n\\n outer:\\n while (length-- && resIndex < takeCount) {\\n index += dir;\\n\\n var iterIndex = -1,\\n value = array[index];\\n\\n while (++iterIndex < iterLength) {\\n var data = iteratees[iterIndex],\\n iteratee = data.iteratee,\\n type = data.type,\\n computed = iteratee(value);\\n\\n if (type == LAZY_MAP_FLAG) {\\n value = computed;\\n } else if (!computed) {\\n if (type == LAZY_FILTER_FLAG) {\\n continue outer;\\n } else {\\n break outer;\\n }\\n }\\n }\\n result[resIndex++] = value;\\n }\\n return result;\\n }\\n\\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\\n LazyWrapper.prototype.constructor = LazyWrapper;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a hash object.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function Hash(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the hash.\\n *\\n * @private\\n * @name clear\\n * @memberOf Hash\\n */\\n function hashClear() {\\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the hash.\\n *\\n * @private\\n * @name delete\\n * @memberOf Hash\\n * @param {Object} hash The hash to modify.\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function hashDelete(key) {\\n var result = this.has(key) && delete this.__data__[key];\\n this.size -= result ? 1 : 0;\\n return result;\\n }\\n\\n /**\\n * Gets the hash value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf Hash\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function hashGet(key) {\\n var data = this.__data__;\\n if (nativeCreate) {\\n var result = data[key];\\n return result === HASH_UNDEFINED ? undefined : result;\\n }\\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\\n }\\n\\n /**\\n * Checks if a hash value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf Hash\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function hashHas(key) {\\n var data = this.__data__;\\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\\n }\\n\\n /**\\n * Sets the hash `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf Hash\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the hash instance.\\n */\\n function hashSet(key, value) {\\n var data = this.__data__;\\n this.size += this.has(key) ? 0 : 1;\\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\\n return this;\\n }\\n\\n // Add methods to `Hash`.\\n Hash.prototype.clear = hashClear;\\n Hash.prototype['delete'] = hashDelete;\\n Hash.prototype.get = hashGet;\\n Hash.prototype.has = hashHas;\\n Hash.prototype.set = hashSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an list cache object.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function ListCache(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the list cache.\\n *\\n * @private\\n * @name clear\\n * @memberOf ListCache\\n */\\n function listCacheClear() {\\n this.__data__ = [];\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the list cache.\\n *\\n * @private\\n * @name delete\\n * @memberOf ListCache\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function listCacheDelete(key) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n if (index < 0) {\\n return false;\\n }\\n var lastIndex = data.length - 1;\\n if (index == lastIndex) {\\n data.pop();\\n } else {\\n splice.call(data, index, 1);\\n }\\n --this.size;\\n return true;\\n }\\n\\n /**\\n * Gets the list cache value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf ListCache\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function listCacheGet(key) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n return index < 0 ? undefined : data[index][1];\\n }\\n\\n /**\\n * Checks if a list cache value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf ListCache\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function listCacheHas(key) {\\n return assocIndexOf(this.__data__, key) > -1;\\n }\\n\\n /**\\n * Sets the list cache `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf ListCache\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the list cache instance.\\n */\\n function listCacheSet(key, value) {\\n var data = this.__data__,\\n index = assocIndexOf(data, key);\\n\\n if (index < 0) {\\n ++this.size;\\n data.push([key, value]);\\n } else {\\n data[index][1] = value;\\n }\\n return this;\\n }\\n\\n // Add methods to `ListCache`.\\n ListCache.prototype.clear = listCacheClear;\\n ListCache.prototype['delete'] = listCacheDelete;\\n ListCache.prototype.get = listCacheGet;\\n ListCache.prototype.has = listCacheHas;\\n ListCache.prototype.set = listCacheSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a map cache object to store key-value pairs.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function MapCache(entries) {\\n var index = -1,\\n length = entries == null ? 0 : entries.length;\\n\\n this.clear();\\n while (++index < length) {\\n var entry = entries[index];\\n this.set(entry[0], entry[1]);\\n }\\n }\\n\\n /**\\n * Removes all key-value entries from the map.\\n *\\n * @private\\n * @name clear\\n * @memberOf MapCache\\n */\\n function mapCacheClear() {\\n this.size = 0;\\n this.__data__ = {\\n 'hash': new Hash,\\n 'map': new (Map || ListCache),\\n 'string': new Hash\\n };\\n }\\n\\n /**\\n * Removes `key` and its value from the map.\\n *\\n * @private\\n * @name delete\\n * @memberOf MapCache\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function mapCacheDelete(key) {\\n var result = getMapData(this, key)['delete'](key);\\n this.size -= result ? 1 : 0;\\n return result;\\n }\\n\\n /**\\n * Gets the map value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf MapCache\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function mapCacheGet(key) {\\n return getMapData(this, key).get(key);\\n }\\n\\n /**\\n * Checks if a map value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf MapCache\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function mapCacheHas(key) {\\n return getMapData(this, key).has(key);\\n }\\n\\n /**\\n * Sets the map `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf MapCache\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the map cache instance.\\n */\\n function mapCacheSet(key, value) {\\n var data = getMapData(this, key),\\n size = data.size;\\n\\n data.set(key, value);\\n this.size += data.size == size ? 0 : 1;\\n return this;\\n }\\n\\n // Add methods to `MapCache`.\\n MapCache.prototype.clear = mapCacheClear;\\n MapCache.prototype['delete'] = mapCacheDelete;\\n MapCache.prototype.get = mapCacheGet;\\n MapCache.prototype.has = mapCacheHas;\\n MapCache.prototype.set = mapCacheSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n *\\n * Creates an array cache object to store unique values.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [values] The values to cache.\\n */\\n function SetCache(values) {\\n var index = -1,\\n length = values == null ? 0 : values.length;\\n\\n this.__data__ = new MapCache;\\n while (++index < length) {\\n this.add(values[index]);\\n }\\n }\\n\\n /**\\n * Adds `value` to the array cache.\\n *\\n * @private\\n * @name add\\n * @memberOf SetCache\\n * @alias push\\n * @param {*} value The value to cache.\\n * @returns {Object} Returns the cache instance.\\n */\\n function setCacheAdd(value) {\\n this.__data__.set(value, HASH_UNDEFINED);\\n return this;\\n }\\n\\n /**\\n * Checks if `value` is in the array cache.\\n *\\n * @private\\n * @name has\\n * @memberOf SetCache\\n * @param {*} value The value to search for.\\n * @returns {number} Returns `true` if `value` is found, else `false`.\\n */\\n function setCacheHas(value) {\\n return this.__data__.has(value);\\n }\\n\\n // Add methods to `SetCache`.\\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\\n SetCache.prototype.has = setCacheHas;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a stack cache object to store key-value pairs.\\n *\\n * @private\\n * @constructor\\n * @param {Array} [entries] The key-value pairs to cache.\\n */\\n function Stack(entries) {\\n var data = this.__data__ = new ListCache(entries);\\n this.size = data.size;\\n }\\n\\n /**\\n * Removes all key-value entries from the stack.\\n *\\n * @private\\n * @name clear\\n * @memberOf Stack\\n */\\n function stackClear() {\\n this.__data__ = new ListCache;\\n this.size = 0;\\n }\\n\\n /**\\n * Removes `key` and its value from the stack.\\n *\\n * @private\\n * @name delete\\n * @memberOf Stack\\n * @param {string} key The key of the value to remove.\\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\\n */\\n function stackDelete(key) {\\n var data = this.__data__,\\n result = data['delete'](key);\\n\\n this.size = data.size;\\n return result;\\n }\\n\\n /**\\n * Gets the stack value for `key`.\\n *\\n * @private\\n * @name get\\n * @memberOf Stack\\n * @param {string} key The key of the value to get.\\n * @returns {*} Returns the entry value.\\n */\\n function stackGet(key) {\\n return this.__data__.get(key);\\n }\\n\\n /**\\n * Checks if a stack value for `key` exists.\\n *\\n * @private\\n * @name has\\n * @memberOf Stack\\n * @param {string} key The key of the entry to check.\\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\\n */\\n function stackHas(key) {\\n return this.__data__.has(key);\\n }\\n\\n /**\\n * Sets the stack `key` to `value`.\\n *\\n * @private\\n * @name set\\n * @memberOf Stack\\n * @param {string} key The key of the value to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns the stack cache instance.\\n */\\n function stackSet(key, value) {\\n var data = this.__data__;\\n if (data instanceof ListCache) {\\n var pairs = data.__data__;\\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\\n pairs.push([key, value]);\\n this.size = ++data.size;\\n return this;\\n }\\n data = this.__data__ = new MapCache(pairs);\\n }\\n data.set(key, value);\\n this.size = data.size;\\n return this;\\n }\\n\\n // Add methods to `Stack`.\\n Stack.prototype.clear = stackClear;\\n Stack.prototype['delete'] = stackDelete;\\n Stack.prototype.get = stackGet;\\n Stack.prototype.has = stackHas;\\n Stack.prototype.set = stackSet;\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an array of the enumerable property names of the array-like `value`.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @param {boolean} inherited Specify returning inherited property names.\\n * @returns {Array} Returns the array of property names.\\n */\\n function arrayLikeKeys(value, inherited) {\\n var isArr = isArray(value),\\n isArg = !isArr && isArguments(value),\\n isBuff = !isArr && !isArg && isBuffer(value),\\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\\n skipIndexes = isArr || isArg || isBuff || isType,\\n result = skipIndexes ? baseTimes(value.length, String) : [],\\n length = result.length;\\n\\n for (var key in value) {\\n if ((inherited || hasOwnProperty.call(value, key)) &&\\n !(skipIndexes && (\\n // Safari 9 has enumerable `arguments.length` in strict mode.\\n key == 'length' ||\\n // Node.js 0.10 has enumerable non-index properties on buffers.\\n (isBuff && (key == 'offset' || key == 'parent')) ||\\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\\n // Skip index properties.\\n isIndex(key, length)\\n ))) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `_.sample` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to sample.\\n * @returns {*} Returns the random element.\\n */\\n function arraySample(array) {\\n var length = array.length;\\n return length ? array[baseRandom(0, length - 1)] : undefined;\\n }\\n\\n /**\\n * A specialized version of `_.sampleSize` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to sample.\\n * @param {number} n The number of elements to sample.\\n * @returns {Array} Returns the random elements.\\n */\\n function arraySampleSize(array, n) {\\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\\n }\\n\\n /**\\n * A specialized version of `_.shuffle` for arrays.\\n *\\n * @private\\n * @param {Array} array The array to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n */\\n function arrayShuffle(array) {\\n return shuffleSelf(copyArray(array));\\n }\\n\\n /**\\n * This function is like `assignValue` except that it doesn't assign\\n * `undefined` values.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function assignMergeValue(object, key, value) {\\n if ((value !== undefined && !eq(object[key], value)) ||\\n (value === undefined && !(key in object))) {\\n baseAssignValue(object, key, value);\\n }\\n }\\n\\n /**\\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function assignValue(object, key, value) {\\n var objValue = object[key];\\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\\n (value === undefined && !(key in object))) {\\n baseAssignValue(object, key, value);\\n }\\n }\\n\\n /**\\n * Gets the index at which the `key` is found in `array` of key-value pairs.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {*} key The key to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n */\\n function assocIndexOf(array, key) {\\n var length = array.length;\\n while (length--) {\\n if (eq(array[length][0], key)) {\\n return length;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * Aggregates elements of `collection` on `accumulator` with keys transformed\\n * by `iteratee` and values set by `setter`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform keys.\\n * @param {Object} accumulator The initial aggregated object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function baseAggregator(collection, setter, iteratee, accumulator) {\\n baseEach(collection, function(value, key, collection) {\\n setter(accumulator, value, iteratee(value), collection);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.assign` without support for multiple sources\\n * or `customizer` functions.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @returns {Object} Returns `object`.\\n */\\n function baseAssign(object, source) {\\n return object && copyObject(source, keys(source), object);\\n }\\n\\n /**\\n * The base implementation of `_.assignIn` without support for multiple sources\\n * or `customizer` functions.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @returns {Object} Returns `object`.\\n */\\n function baseAssignIn(object, source) {\\n return object && copyObject(source, keysIn(source), object);\\n }\\n\\n /**\\n * The base implementation of `assignValue` and `assignMergeValue` without\\n * value checks.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {string} key The key of the property to assign.\\n * @param {*} value The value to assign.\\n */\\n function baseAssignValue(object, key, value) {\\n if (key == '__proto__' && defineProperty) {\\n defineProperty(object, key, {\\n 'configurable': true,\\n 'enumerable': true,\\n 'value': value,\\n 'writable': true\\n });\\n } else {\\n object[key] = value;\\n }\\n }\\n\\n /**\\n * The base implementation of `_.at` without support for individual paths.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {string[]} paths The property paths to pick.\\n * @returns {Array} Returns the picked elements.\\n */\\n function baseAt(object, paths) {\\n var index = -1,\\n length = paths.length,\\n result = Array(length),\\n skip = object == null;\\n\\n while (++index < length) {\\n result[index] = skip ? undefined : get(object, paths[index]);\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.clamp` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {number} number The number to clamp.\\n * @param {number} [lower] The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the clamped number.\\n */\\n function baseClamp(number, lower, upper) {\\n if (number === number) {\\n if (upper !== undefined) {\\n number = number <= upper ? number : upper;\\n }\\n if (lower !== undefined) {\\n number = number >= lower ? number : lower;\\n }\\n }\\n return number;\\n }\\n\\n /**\\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\\n * traversed objects.\\n *\\n * @private\\n * @param {*} value The value to clone.\\n * @param {boolean} bitmask The bitmask flags.\\n * 1 - Deep clone\\n * 2 - Flatten inherited properties\\n * 4 - Clone symbols\\n * @param {Function} [customizer] The function to customize cloning.\\n * @param {string} [key] The key of `value`.\\n * @param {Object} [object] The parent object of `value`.\\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\\n * @returns {*} Returns the cloned value.\\n */\\n function baseClone(value, bitmask, customizer, key, object, stack) {\\n var result,\\n isDeep = bitmask & CLONE_DEEP_FLAG,\\n isFlat = bitmask & CLONE_FLAT_FLAG,\\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\\n\\n if (customizer) {\\n result = object ? customizer(value, key, object, stack) : customizer(value);\\n }\\n if (result !== undefined) {\\n return result;\\n }\\n if (!isObject(value)) {\\n return value;\\n }\\n var isArr = isArray(value);\\n if (isArr) {\\n result = initCloneArray(value);\\n if (!isDeep) {\\n return copyArray(value, result);\\n }\\n } else {\\n var tag = getTag(value),\\n isFunc = tag == funcTag || tag == genTag;\\n\\n if (isBuffer(value)) {\\n return cloneBuffer(value, isDeep);\\n }\\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\\n if (!isDeep) {\\n return isFlat\\n ? copySymbolsIn(value, baseAssignIn(result, value))\\n : copySymbols(value, baseAssign(result, value));\\n }\\n } else {\\n if (!cloneableTags[tag]) {\\n return object ? value : {};\\n }\\n result = initCloneByTag(value, tag, baseClone, isDeep);\\n }\\n }\\n // Check for circular references and return its corresponding clone.\\n stack || (stack = new Stack);\\n var stacked = stack.get(value);\\n if (stacked) {\\n return stacked;\\n }\\n stack.set(value, result);\\n\\n var keysFunc = isFull\\n ? (isFlat ? getAllKeysIn : getAllKeys)\\n : (isFlat ? keysIn : keys);\\n\\n var props = isArr ? undefined : keysFunc(value);\\n arrayEach(props || value, function(subValue, key) {\\n if (props) {\\n key = subValue;\\n subValue = value[key];\\n }\\n // Recursively populate clone (susceptible to call stack limits).\\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.conforms` which doesn't clone `source`.\\n *\\n * @private\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseConforms(source) {\\n var props = keys(source);\\n return function(object) {\\n return baseConformsTo(object, source, props);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.conformsTo` which accepts `props` to check.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\\n */\\n function baseConformsTo(object, source, props) {\\n var length = props.length;\\n if (object == null) {\\n return !length;\\n }\\n object = Object(object);\\n while (length--) {\\n var key = props[length],\\n predicate = source[key],\\n value = object[key];\\n\\n if ((value === undefined && !(key in object)) || !predicate(value)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\\n * to provide to `func`.\\n *\\n * @private\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @param {Array} args The arguments to provide to `func`.\\n * @returns {number|Object} Returns the timer id or timeout object.\\n */\\n function baseDelay(func, wait, args) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n return setTimeout(function() { func.apply(undefined, args); }, wait);\\n }\\n\\n /**\\n * The base implementation of methods like `_.difference` without support\\n * for excluding multiple arrays or iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Array} values The values to exclude.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n */\\n function baseDifference(array, values, iteratee, comparator) {\\n var index = -1,\\n includes = arrayIncludes,\\n isCommon = true,\\n length = array.length,\\n result = [],\\n valuesLength = values.length;\\n\\n if (!length) {\\n return result;\\n }\\n if (iteratee) {\\n values = arrayMap(values, baseUnary(iteratee));\\n }\\n if (comparator) {\\n includes = arrayIncludesWith;\\n isCommon = false;\\n }\\n else if (values.length >= LARGE_ARRAY_SIZE) {\\n includes = cacheHas;\\n isCommon = false;\\n values = new SetCache(values);\\n }\\n outer:\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee == null ? value : iteratee(value);\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (isCommon && computed === computed) {\\n var valuesIndex = valuesLength;\\n while (valuesIndex--) {\\n if (values[valuesIndex] === computed) {\\n continue outer;\\n }\\n }\\n result.push(value);\\n }\\n else if (!includes(values, computed, comparator)) {\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.forEach` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n */\\n var baseEach = createBaseEach(baseForOwn);\\n\\n /**\\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n */\\n var baseEachRight = createBaseEach(baseForOwnRight, true);\\n\\n /**\\n * The base implementation of `_.every` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`\\n */\\n function baseEvery(collection, predicate) {\\n var result = true;\\n baseEach(collection, function(value, index, collection) {\\n result = !!predicate(value, index, collection);\\n return result;\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of methods like `_.max` and `_.min` which accepts a\\n * `comparator` to determine the extremum value.\\n *\\n * @private\\n * @param {Array} array The array to iterate over.\\n * @param {Function} iteratee The iteratee invoked per iteration.\\n * @param {Function} comparator The comparator used to compare values.\\n * @returns {*} Returns the extremum value.\\n */\\n function baseExtremum(array, iteratee, comparator) {\\n var index = -1,\\n length = array.length;\\n\\n while (++index < length) {\\n var value = array[index],\\n current = iteratee(value);\\n\\n if (current != null && (computed === undefined\\n ? (current === current && !isSymbol(current))\\n : comparator(current, computed)\\n )) {\\n var computed = current,\\n result = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.fill` without an iteratee call guard.\\n *\\n * @private\\n * @param {Array} array The array to fill.\\n * @param {*} value The value to fill `array` with.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns `array`.\\n */\\n function baseFill(array, value, start, end) {\\n var length = array.length;\\n\\n start = toInteger(start);\\n if (start < 0) {\\n start = -start > length ? 0 : (length + start);\\n }\\n end = (end === undefined || end > length) ? length : toInteger(end);\\n if (end < 0) {\\n end += length;\\n }\\n end = start > end ? 0 : toLength(end);\\n while (start < end) {\\n array[start++] = value;\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.filter` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n */\\n function baseFilter(collection, predicate) {\\n var result = [];\\n baseEach(collection, function(value, index, collection) {\\n if (predicate(value, index, collection)) {\\n result.push(value);\\n }\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.flatten` with support for restricting flattening.\\n *\\n * @private\\n * @param {Array} array The array to flatten.\\n * @param {number} depth The maximum recursion depth.\\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\\n * @param {Array} [result=[]] The initial result value.\\n * @returns {Array} Returns the new flattened array.\\n */\\n function baseFlatten(array, depth, predicate, isStrict, result) {\\n var index = -1,\\n length = array.length;\\n\\n predicate || (predicate = isFlattenable);\\n result || (result = []);\\n\\n while (++index < length) {\\n var value = array[index];\\n if (depth > 0 && predicate(value)) {\\n if (depth > 1) {\\n // Recursively flatten arrays (susceptible to call stack limits).\\n baseFlatten(value, depth - 1, predicate, isStrict, result);\\n } else {\\n arrayPush(result, value);\\n }\\n } else if (!isStrict) {\\n result[result.length] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `baseForOwn` which iterates over `object`\\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @returns {Object} Returns `object`.\\n */\\n var baseFor = createBaseFor();\\n\\n /**\\n * This function is like `baseFor` except that it iterates over properties\\n * in the opposite order.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @returns {Object} Returns `object`.\\n */\\n var baseForRight = createBaseFor(true);\\n\\n /**\\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n */\\n function baseForOwn(object, iteratee) {\\n return object && baseFor(object, iteratee, keys);\\n }\\n\\n /**\\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n */\\n function baseForOwnRight(object, iteratee) {\\n return object && baseForRight(object, iteratee, keys);\\n }\\n\\n /**\\n * The base implementation of `_.functions` which creates an array of\\n * `object` function property names filtered from `props`.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Array} props The property names to filter.\\n * @returns {Array} Returns the function names.\\n */\\n function baseFunctions(object, props) {\\n return arrayFilter(props, function(key) {\\n return isFunction(object[key]);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.get` without support for default values.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to get.\\n * @returns {*} Returns the resolved value.\\n */\\n function baseGet(object, path) {\\n path = castPath(path, object);\\n\\n var index = 0,\\n length = path.length;\\n\\n while (object != null && index < length) {\\n object = object[toKey(path[index++])];\\n }\\n return (index && index == length) ? object : undefined;\\n }\\n\\n /**\\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\\n * symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Function} keysFunc The function to get the keys of `object`.\\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\\n var result = keysFunc(object);\\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\\n }\\n\\n /**\\n * The base implementation of `getTag` without fallbacks for buggy environments.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the `toStringTag`.\\n */\\n function baseGetTag(value) {\\n if (value == null) {\\n return value === undefined ? undefinedTag : nullTag;\\n }\\n return (symToStringTag && symToStringTag in Object(value))\\n ? getRawTag(value)\\n : objectToString(value);\\n }\\n\\n /**\\n * The base implementation of `_.gt` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\\n * else `false`.\\n */\\n function baseGt(value, other) {\\n return value > other;\\n }\\n\\n /**\\n * The base implementation of `_.has` without support for deep paths.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {Array|string} key The key to check.\\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\\n */\\n function baseHas(object, key) {\\n return object != null && hasOwnProperty.call(object, key);\\n }\\n\\n /**\\n * The base implementation of `_.hasIn` without support for deep paths.\\n *\\n * @private\\n * @param {Object} [object] The object to query.\\n * @param {Array|string} key The key to check.\\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\\n */\\n function baseHasIn(object, key) {\\n return object != null && key in Object(object);\\n }\\n\\n /**\\n * The base implementation of `_.inRange` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {number} number The number to check.\\n * @param {number} start The start of the range.\\n * @param {number} end The end of the range.\\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\\n */\\n function baseInRange(number, start, end) {\\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\\n }\\n\\n /**\\n * The base implementation of methods like `_.intersection`, without support\\n * for iteratee shorthands, that accepts an array of arrays to inspect.\\n *\\n * @private\\n * @param {Array} arrays The arrays to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of shared values.\\n */\\n function baseIntersection(arrays, iteratee, comparator) {\\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\\n length = arrays[0].length,\\n othLength = arrays.length,\\n othIndex = othLength,\\n caches = Array(othLength),\\n maxLength = Infinity,\\n result = [];\\n\\n while (othIndex--) {\\n var array = arrays[othIndex];\\n if (othIndex && iteratee) {\\n array = arrayMap(array, baseUnary(iteratee));\\n }\\n maxLength = nativeMin(array.length, maxLength);\\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\\n ? new SetCache(othIndex && array)\\n : undefined;\\n }\\n array = arrays[0];\\n\\n var index = -1,\\n seen = caches[0];\\n\\n outer:\\n while (++index < length && result.length < maxLength) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (!(seen\\n ? cacheHas(seen, computed)\\n : includes(result, computed, comparator)\\n )) {\\n othIndex = othLength;\\n while (--othIndex) {\\n var cache = caches[othIndex];\\n if (!(cache\\n ? cacheHas(cache, computed)\\n : includes(arrays[othIndex], computed, comparator))\\n ) {\\n continue outer;\\n }\\n }\\n if (seen) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.invert` and `_.invertBy` which inverts\\n * `object` with values transformed by `iteratee` and set by `setter`.\\n *\\n * @private\\n * @param {Object} object The object to iterate over.\\n * @param {Function} setter The function to set `accumulator` values.\\n * @param {Function} iteratee The iteratee to transform values.\\n * @param {Object} accumulator The initial inverted object.\\n * @returns {Function} Returns `accumulator`.\\n */\\n function baseInverter(object, setter, iteratee, accumulator) {\\n baseForOwn(object, function(value, key, object) {\\n setter(accumulator, iteratee(value), key, object);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * The base implementation of `_.invoke` without support for individual\\n * method arguments.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the method to invoke.\\n * @param {Array} args The arguments to invoke the method with.\\n * @returns {*} Returns the result of the invoked method.\\n */\\n function baseInvoke(object, path, args) {\\n path = castPath(path, object);\\n object = parent(object, path);\\n var func = object == null ? object : object[toKey(last(path))];\\n return func == null ? undefined : apply(func, object, args);\\n }\\n\\n /**\\n * The base implementation of `_.isArguments`.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\\n */\\n function baseIsArguments(value) {\\n return isObjectLike(value) && baseGetTag(value) == argsTag;\\n }\\n\\n /**\\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\\n */\\n function baseIsArrayBuffer(value) {\\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\\n }\\n\\n /**\\n * The base implementation of `_.isDate` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\\n */\\n function baseIsDate(value) {\\n return isObjectLike(value) && baseGetTag(value) == dateTag;\\n }\\n\\n /**\\n * The base implementation of `_.isEqual` which supports partial comparisons\\n * and tracks traversed objects.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @param {boolean} bitmask The bitmask flags.\\n * 1 - Unordered comparison\\n * 2 - Partial comparison\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n */\\n function baseIsEqual(value, other, bitmask, customizer, stack) {\\n if (value === other) {\\n return true;\\n }\\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\\n return value !== value && other !== other;\\n }\\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\\n }\\n\\n /**\\n * A specialized version of `baseIsEqual` for arrays and objects which performs\\n * deep comparisons and tracks traversed objects enabling objects with circular\\n * references to be compared.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\\n var objIsArr = isArray(object),\\n othIsArr = isArray(other),\\n objTag = objIsArr ? arrayTag : getTag(object),\\n othTag = othIsArr ? arrayTag : getTag(other);\\n\\n objTag = objTag == argsTag ? objectTag : objTag;\\n othTag = othTag == argsTag ? objectTag : othTag;\\n\\n var objIsObj = objTag == objectTag,\\n othIsObj = othTag == objectTag,\\n isSameTag = objTag == othTag;\\n\\n if (isSameTag && isBuffer(object)) {\\n if (!isBuffer(other)) {\\n return false;\\n }\\n objIsArr = true;\\n objIsObj = false;\\n }\\n if (isSameTag && !objIsObj) {\\n stack || (stack = new Stack);\\n return (objIsArr || isTypedArray(object))\\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\\n }\\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\\n\\n if (objIsWrapped || othIsWrapped) {\\n var objUnwrapped = objIsWrapped ? object.value() : object,\\n othUnwrapped = othIsWrapped ? other.value() : other;\\n\\n stack || (stack = new Stack);\\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\\n }\\n }\\n if (!isSameTag) {\\n return false;\\n }\\n stack || (stack = new Stack);\\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\\n }\\n\\n /**\\n * The base implementation of `_.isMap` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\\n */\\n function baseIsMap(value) {\\n return isObjectLike(value) && getTag(value) == mapTag;\\n }\\n\\n /**\\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @param {Array} matchData The property names, values, and compare flags to match.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n */\\n function baseIsMatch(object, source, matchData, customizer) {\\n var index = matchData.length,\\n length = index,\\n noCustomizer = !customizer;\\n\\n if (object == null) {\\n return !length;\\n }\\n object = Object(object);\\n while (index--) {\\n var data = matchData[index];\\n if ((noCustomizer && data[2])\\n ? data[1] !== object[data[0]]\\n : !(data[0] in object)\\n ) {\\n return false;\\n }\\n }\\n while (++index < length) {\\n data = matchData[index];\\n var key = data[0],\\n objValue = object[key],\\n srcValue = data[1];\\n\\n if (noCustomizer && data[2]) {\\n if (objValue === undefined && !(key in object)) {\\n return false;\\n }\\n } else {\\n var stack = new Stack;\\n if (customizer) {\\n var result = customizer(objValue, srcValue, key, object, source, stack);\\n }\\n if (!(result === undefined\\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\\n : result\\n )) {\\n return false;\\n }\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * The base implementation of `_.isNative` without bad shim checks.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a native function,\\n * else `false`.\\n */\\n function baseIsNative(value) {\\n if (!isObject(value) || isMasked(value)) {\\n return false;\\n }\\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\\n return pattern.test(toSource(value));\\n }\\n\\n /**\\n * The base implementation of `_.isRegExp` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\\n */\\n function baseIsRegExp(value) {\\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\\n }\\n\\n /**\\n * The base implementation of `_.isSet` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\\n */\\n function baseIsSet(value) {\\n return isObjectLike(value) && getTag(value) == setTag;\\n }\\n\\n /**\\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\\n */\\n function baseIsTypedArray(value) {\\n return isObjectLike(value) &&\\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\\n }\\n\\n /**\\n * The base implementation of `_.iteratee`.\\n *\\n * @private\\n * @param {*} [value=_.identity] The value to convert to an iteratee.\\n * @returns {Function} Returns the iteratee.\\n */\\n function baseIteratee(value) {\\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\\n if (typeof value == 'function') {\\n return value;\\n }\\n if (value == null) {\\n return identity;\\n }\\n if (typeof value == 'object') {\\n return isArray(value)\\n ? baseMatchesProperty(value[0], value[1])\\n : baseMatches(value);\\n }\\n return property(value);\\n }\\n\\n /**\\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function baseKeys(object) {\\n if (!isPrototype(object)) {\\n return nativeKeys(object);\\n }\\n var result = [];\\n for (var key in Object(object)) {\\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function baseKeysIn(object) {\\n if (!isObject(object)) {\\n return nativeKeysIn(object);\\n }\\n var isProto = isPrototype(object),\\n result = [];\\n\\n for (var key in object) {\\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.lt` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than `other`,\\n * else `false`.\\n */\\n function baseLt(value, other) {\\n return value < other;\\n }\\n\\n /**\\n * The base implementation of `_.map` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} iteratee The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n */\\n function baseMap(collection, iteratee) {\\n var index = -1,\\n result = isArrayLike(collection) ? Array(collection.length) : [];\\n\\n baseEach(collection, function(value, key, collection) {\\n result[++index] = iteratee(value, key, collection);\\n });\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.matches` which doesn't clone `source`.\\n *\\n * @private\\n * @param {Object} source The object of property values to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseMatches(source) {\\n var matchData = getMatchData(source);\\n if (matchData.length == 1 && matchData[0][2]) {\\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\\n }\\n return function(object) {\\n return object === source || baseIsMatch(object, source, matchData);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\\n *\\n * @private\\n * @param {string} path The path of the property to get.\\n * @param {*} srcValue The value to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function baseMatchesProperty(path, srcValue) {\\n if (isKey(path) && isStrictComparable(srcValue)) {\\n return matchesStrictComparable(toKey(path), srcValue);\\n }\\n return function(object) {\\n var objValue = get(object, path);\\n return (objValue === undefined && objValue === srcValue)\\n ? hasIn(object, path)\\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.merge` without support for multiple sources.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @param {number} srcIndex The index of `source`.\\n * @param {Function} [customizer] The function to customize merged values.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n */\\n function baseMerge(object, source, srcIndex, customizer, stack) {\\n if (object === source) {\\n return;\\n }\\n baseFor(source, function(srcValue, key) {\\n if (isObject(srcValue)) {\\n stack || (stack = new Stack);\\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\\n }\\n else {\\n var newValue = customizer\\n ? customizer(object[key], srcValue, (key + ''), object, source, stack)\\n : undefined;\\n\\n if (newValue === undefined) {\\n newValue = srcValue;\\n }\\n assignMergeValue(object, key, newValue);\\n }\\n }, keysIn);\\n }\\n\\n /**\\n * A specialized version of `baseMerge` for arrays and objects which performs\\n * deep merges and tracks traversed objects enabling objects with circular\\n * references to be merged.\\n *\\n * @private\\n * @param {Object} object The destination object.\\n * @param {Object} source The source object.\\n * @param {string} key The key of the value to merge.\\n * @param {number} srcIndex The index of `source`.\\n * @param {Function} mergeFunc The function to merge values.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n */\\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\\n var objValue = object[key],\\n srcValue = source[key],\\n stacked = stack.get(srcValue);\\n\\n if (stacked) {\\n assignMergeValue(object, key, stacked);\\n return;\\n }\\n var newValue = customizer\\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\\n : undefined;\\n\\n var isCommon = newValue === undefined;\\n\\n if (isCommon) {\\n var isArr = isArray(srcValue),\\n isBuff = !isArr && isBuffer(srcValue),\\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\\n\\n newValue = srcValue;\\n if (isArr || isBuff || isTyped) {\\n if (isArray(objValue)) {\\n newValue = objValue;\\n }\\n else if (isArrayLikeObject(objValue)) {\\n newValue = copyArray(objValue);\\n }\\n else if (isBuff) {\\n isCommon = false;\\n newValue = cloneBuffer(srcValue, true);\\n }\\n else if (isTyped) {\\n isCommon = false;\\n newValue = cloneTypedArray(srcValue, true);\\n }\\n else {\\n newValue = [];\\n }\\n }\\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\\n newValue = objValue;\\n if (isArguments(objValue)) {\\n newValue = toPlainObject(objValue);\\n }\\n else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {\\n newValue = initCloneObject(srcValue);\\n }\\n }\\n else {\\n isCommon = false;\\n }\\n }\\n if (isCommon) {\\n // Recursively merge objects and arrays (susceptible to call stack limits).\\n stack.set(srcValue, newValue);\\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\\n stack['delete'](srcValue);\\n }\\n assignMergeValue(object, key, newValue);\\n }\\n\\n /**\\n * The base implementation of `_.nth` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {Array} array The array to query.\\n * @param {number} n The index of the element to return.\\n * @returns {*} Returns the nth element of `array`.\\n */\\n function baseNth(array, n) {\\n var length = array.length;\\n if (!length) {\\n return;\\n }\\n n += n < 0 ? length : 0;\\n return isIndex(n, length) ? array[n] : undefined;\\n }\\n\\n /**\\n * The base implementation of `_.orderBy` without param guards.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\\n * @param {string[]} orders The sort orders of `iteratees`.\\n * @returns {Array} Returns the new sorted array.\\n */\\n function baseOrderBy(collection, iteratees, orders) {\\n var index = -1;\\n iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\\n\\n var result = baseMap(collection, function(value, key, collection) {\\n var criteria = arrayMap(iteratees, function(iteratee) {\\n return iteratee(value);\\n });\\n return { 'criteria': criteria, 'index': ++index, 'value': value };\\n });\\n\\n return baseSortBy(result, function(object, other) {\\n return compareMultiple(object, other, orders);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.pick` without support for individual\\n * property identifiers.\\n *\\n * @private\\n * @param {Object} object The source object.\\n * @param {string[]} paths The property paths to pick.\\n * @returns {Object} Returns the new object.\\n */\\n function basePick(object, paths) {\\n return basePickBy(object, paths, function(value, path) {\\n return hasIn(object, path);\\n });\\n }\\n\\n /**\\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Object} object The source object.\\n * @param {string[]} paths The property paths to pick.\\n * @param {Function} predicate The function invoked per property.\\n * @returns {Object} Returns the new object.\\n */\\n function basePickBy(object, paths, predicate) {\\n var index = -1,\\n length = paths.length,\\n result = {};\\n\\n while (++index < length) {\\n var path = paths[index],\\n value = baseGet(object, path);\\n\\n if (predicate(value, path)) {\\n baseSet(result, castPath(path, object), value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseProperty` which supports deep paths.\\n *\\n * @private\\n * @param {Array|string} path The path of the property to get.\\n * @returns {Function} Returns the new accessor function.\\n */\\n function basePropertyDeep(path) {\\n return function(object) {\\n return baseGet(object, path);\\n };\\n }\\n\\n /**\\n * The base implementation of `_.pullAllBy` without support for iteratee\\n * shorthands.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns `array`.\\n */\\n function basePullAll(array, values, iteratee, comparator) {\\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\\n index = -1,\\n length = values.length,\\n seen = array;\\n\\n if (array === values) {\\n values = copyArray(values);\\n }\\n if (iteratee) {\\n seen = arrayMap(array, baseUnary(iteratee));\\n }\\n while (++index < length) {\\n var fromIndex = 0,\\n value = values[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\\n if (seen !== array) {\\n splice.call(seen, fromIndex, 1);\\n }\\n splice.call(array, fromIndex, 1);\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.pullAt` without support for individual\\n * indexes or capturing the removed elements.\\n *\\n * @private\\n * @param {Array} array The array to modify.\\n * @param {number[]} indexes The indexes of elements to remove.\\n * @returns {Array} Returns `array`.\\n */\\n function basePullAt(array, indexes) {\\n var length = array ? indexes.length : 0,\\n lastIndex = length - 1;\\n\\n while (length--) {\\n var index = indexes[length];\\n if (length == lastIndex || index !== previous) {\\n var previous = index;\\n if (isIndex(index)) {\\n splice.call(array, index, 1);\\n } else {\\n baseUnset(array, index);\\n }\\n }\\n }\\n return array;\\n }\\n\\n /**\\n * The base implementation of `_.random` without support for returning\\n * floating-point numbers.\\n *\\n * @private\\n * @param {number} lower The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the random number.\\n */\\n function baseRandom(lower, upper) {\\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\\n }\\n\\n /**\\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\\n * coerce arguments.\\n *\\n * @private\\n * @param {number} start The start of the range.\\n * @param {number} end The end of the range.\\n * @param {number} step The value to increment or decrement by.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Array} Returns the range of numbers.\\n */\\n function baseRange(start, end, step, fromRight) {\\n var index = -1,\\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\\n result = Array(length);\\n\\n while (length--) {\\n result[fromRight ? length : ++index] = start;\\n start += step;\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.repeat` which doesn't coerce arguments.\\n *\\n * @private\\n * @param {string} string The string to repeat.\\n * @param {number} n The number of times to repeat the string.\\n * @returns {string} Returns the repeated string.\\n */\\n function baseRepeat(string, n) {\\n var result = '';\\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\\n return result;\\n }\\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\\n do {\\n if (n % 2) {\\n result += string;\\n }\\n n = nativeFloor(n / 2);\\n if (n) {\\n string += string;\\n }\\n } while (n);\\n\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @returns {Function} Returns the new function.\\n */\\n function baseRest(func, start) {\\n return setToString(overRest(func, start, identity), func + '');\\n }\\n\\n /**\\n * The base implementation of `_.sample`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to sample.\\n * @returns {*} Returns the random element.\\n */\\n function baseSample(collection) {\\n return arraySample(values(collection));\\n }\\n\\n /**\\n * The base implementation of `_.sampleSize` without param guards.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to sample.\\n * @param {number} n The number of elements to sample.\\n * @returns {Array} Returns the random elements.\\n */\\n function baseSampleSize(collection, n) {\\n var array = values(collection);\\n return shuffleSelf(array, baseClamp(n, 0, array.length));\\n }\\n\\n /**\\n * The base implementation of `_.set`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @param {Function} [customizer] The function to customize path creation.\\n * @returns {Object} Returns `object`.\\n */\\n function baseSet(object, path, value, customizer) {\\n if (!isObject(object)) {\\n return object;\\n }\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length,\\n lastIndex = length - 1,\\n nested = object;\\n\\n while (nested != null && ++index < length) {\\n var key = toKey(path[index]),\\n newValue = value;\\n\\n if (index != lastIndex) {\\n var objValue = nested[key];\\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\\n if (newValue === undefined) {\\n newValue = isObject(objValue)\\n ? objValue\\n : (isIndex(path[index + 1]) ? [] : {});\\n }\\n }\\n assignValue(nested, key, newValue);\\n nested = nested[key];\\n }\\n return object;\\n }\\n\\n /**\\n * The base implementation of `setData` without support for hot loop shorting.\\n *\\n * @private\\n * @param {Function} func The function to associate metadata with.\\n * @param {*} data The metadata.\\n * @returns {Function} Returns `func`.\\n */\\n var baseSetData = !metaMap ? identity : function(func, data) {\\n metaMap.set(func, data);\\n return func;\\n };\\n\\n /**\\n * The base implementation of `setToString` without support for hot loop shorting.\\n *\\n * @private\\n * @param {Function} func The function to modify.\\n * @param {Function} string The `toString` result.\\n * @returns {Function} Returns `func`.\\n */\\n var baseSetToString = !defineProperty ? identity : function(func, string) {\\n return defineProperty(func, 'toString', {\\n 'configurable': true,\\n 'enumerable': false,\\n 'value': constant(string),\\n 'writable': true\\n });\\n };\\n\\n /**\\n * The base implementation of `_.shuffle`.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n */\\n function baseShuffle(collection) {\\n return shuffleSelf(values(collection));\\n }\\n\\n /**\\n * The base implementation of `_.slice` without an iteratee call guard.\\n *\\n * @private\\n * @param {Array} array The array to slice.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function baseSlice(array, start, end) {\\n var index = -1,\\n length = array.length;\\n\\n if (start < 0) {\\n start = -start > length ? 0 : (length + start);\\n }\\n end = end > length ? length : end;\\n if (end < 0) {\\n end += length;\\n }\\n length = start > end ? 0 : ((end - start) >>> 0);\\n start >>>= 0;\\n\\n var result = Array(length);\\n while (++index < length) {\\n result[index] = array[index + start];\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.some` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} predicate The function invoked per iteration.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n */\\n function baseSome(collection, predicate) {\\n var result;\\n\\n baseEach(collection, function(value, index, collection) {\\n result = predicate(value, index, collection);\\n return !result;\\n });\\n return !!result;\\n }\\n\\n /**\\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\\n * performs a binary search of `array` to determine the index at which `value`\\n * should be inserted into `array` in order to maintain its sort order.\\n *\\n * @private\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n */\\n function baseSortedIndex(array, value, retHighest) {\\n var low = 0,\\n high = array == null ? low : array.length;\\n\\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\\n while (low < high) {\\n var mid = (low + high) >>> 1,\\n computed = array[mid];\\n\\n if (computed !== null && !isSymbol(computed) &&\\n (retHighest ? (computed <= value) : (computed < value))) {\\n low = mid + 1;\\n } else {\\n high = mid;\\n }\\n }\\n return high;\\n }\\n return baseSortedIndexBy(array, value, identity, retHighest);\\n }\\n\\n /**\\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\\n * which invokes `iteratee` for `value` and each element of `array` to compute\\n * their sort ranking. The iteratee is invoked with one argument; (value).\\n *\\n * @private\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} iteratee The iteratee invoked per element.\\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n */\\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\\n value = iteratee(value);\\n\\n var low = 0,\\n high = array == null ? 0 : array.length,\\n valIsNaN = value !== value,\\n valIsNull = value === null,\\n valIsSymbol = isSymbol(value),\\n valIsUndefined = value === undefined;\\n\\n while (low < high) {\\n var mid = nativeFloor((low + high) / 2),\\n computed = iteratee(array[mid]),\\n othIsDefined = computed !== undefined,\\n othIsNull = computed === null,\\n othIsReflexive = computed === computed,\\n othIsSymbol = isSymbol(computed);\\n\\n if (valIsNaN) {\\n var setLow = retHighest || othIsReflexive;\\n } else if (valIsUndefined) {\\n setLow = othIsReflexive && (retHighest || othIsDefined);\\n } else if (valIsNull) {\\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\\n } else if (valIsSymbol) {\\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\\n } else if (othIsNull || othIsSymbol) {\\n setLow = false;\\n } else {\\n setLow = retHighest ? (computed <= value) : (computed < value);\\n }\\n if (setLow) {\\n low = mid + 1;\\n } else {\\n high = mid;\\n }\\n }\\n return nativeMin(high, MAX_ARRAY_INDEX);\\n }\\n\\n /**\\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\\n * support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n */\\n function baseSortedUniq(array, iteratee) {\\n var index = -1,\\n length = array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n if (!index || !eq(computed, seen)) {\\n var seen = computed;\\n result[resIndex++] = value === 0 ? 0 : value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.toNumber` which doesn't ensure correct\\n * conversions of binary, hexadecimal, or octal string values.\\n *\\n * @private\\n * @param {*} value The value to process.\\n * @returns {number} Returns the number.\\n */\\n function baseToNumber(value) {\\n if (typeof value == 'number') {\\n return value;\\n }\\n if (isSymbol(value)) {\\n return NAN;\\n }\\n return +value;\\n }\\n\\n /**\\n * The base implementation of `_.toString` which doesn't convert nullish\\n * values to empty strings.\\n *\\n * @private\\n * @param {*} value The value to process.\\n * @returns {string} Returns the string.\\n */\\n function baseToString(value) {\\n // Exit early for strings to avoid a performance hit in some environments.\\n if (typeof value == 'string') {\\n return value;\\n }\\n if (isArray(value)) {\\n // Recursively convert values (susceptible to call stack limits).\\n return arrayMap(value, baseToString) + '';\\n }\\n if (isSymbol(value)) {\\n return symbolToString ? symbolToString.call(value) : '';\\n }\\n var result = (value + '');\\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\\n }\\n\\n /**\\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n */\\n function baseUniq(array, iteratee, comparator) {\\n var index = -1,\\n includes = arrayIncludes,\\n length = array.length,\\n isCommon = true,\\n result = [],\\n seen = result;\\n\\n if (comparator) {\\n isCommon = false;\\n includes = arrayIncludesWith;\\n }\\n else if (length >= LARGE_ARRAY_SIZE) {\\n var set = iteratee ? null : createSet(array);\\n if (set) {\\n return setToArray(set);\\n }\\n isCommon = false;\\n includes = cacheHas;\\n seen = new SetCache;\\n }\\n else {\\n seen = iteratee ? [] : result;\\n }\\n outer:\\n while (++index < length) {\\n var value = array[index],\\n computed = iteratee ? iteratee(value) : value;\\n\\n value = (comparator || value !== 0) ? value : 0;\\n if (isCommon && computed === computed) {\\n var seenIndex = seen.length;\\n while (seenIndex--) {\\n if (seen[seenIndex] === computed) {\\n continue outer;\\n }\\n }\\n if (iteratee) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n else if (!includes(seen, computed, comparator)) {\\n if (seen !== result) {\\n seen.push(computed);\\n }\\n result.push(value);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * The base implementation of `_.unset`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The property path to unset.\\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\\n */\\n function baseUnset(object, path) {\\n path = castPath(path, object);\\n object = parent(object, path);\\n return object == null || delete object[toKey(last(path))];\\n }\\n\\n /**\\n * The base implementation of `_.update`.\\n *\\n * @private\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to update.\\n * @param {Function} updater The function to produce the updated value.\\n * @param {Function} [customizer] The function to customize path creation.\\n * @returns {Object} Returns `object`.\\n */\\n function baseUpdate(object, path, updater, customizer) {\\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\\n }\\n\\n /**\\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\\n * without support for iteratee shorthands.\\n *\\n * @private\\n * @param {Array} array The array to query.\\n * @param {Function} predicate The function invoked per iteration.\\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function baseWhile(array, predicate, isDrop, fromRight) {\\n var length = array.length,\\n index = fromRight ? length : -1;\\n\\n while ((fromRight ? index-- : ++index < length) &&\\n predicate(array[index], index, array)) {}\\n\\n return isDrop\\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\\n }\\n\\n /**\\n * The base implementation of `wrapperValue` which returns the result of\\n * performing a sequence of actions on the unwrapped `value`, where each\\n * successive action is supplied the return value of the previous.\\n *\\n * @private\\n * @param {*} value The unwrapped value.\\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\\n * @returns {*} Returns the resolved value.\\n */\\n function baseWrapperValue(value, actions) {\\n var result = value;\\n if (result instanceof LazyWrapper) {\\n result = result.value();\\n }\\n return arrayReduce(actions, function(result, action) {\\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\\n }, result);\\n }\\n\\n /**\\n * The base implementation of methods like `_.xor`, without support for\\n * iteratee shorthands, that accepts an array of arrays to inspect.\\n *\\n * @private\\n * @param {Array} arrays The arrays to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of values.\\n */\\n function baseXor(arrays, iteratee, comparator) {\\n var length = arrays.length;\\n if (length < 2) {\\n return length ? baseUniq(arrays[0]) : [];\\n }\\n var index = -1,\\n result = Array(length);\\n\\n while (++index < length) {\\n var array = arrays[index],\\n othIndex = -1;\\n\\n while (++othIndex < length) {\\n if (othIndex != index) {\\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\\n }\\n }\\n }\\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\\n }\\n\\n /**\\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\\n *\\n * @private\\n * @param {Array} props The property identifiers.\\n * @param {Array} values The property values.\\n * @param {Function} assignFunc The function to assign values.\\n * @returns {Object} Returns the new object.\\n */\\n function baseZipObject(props, values, assignFunc) {\\n var index = -1,\\n length = props.length,\\n valsLength = values.length,\\n result = {};\\n\\n while (++index < length) {\\n var value = index < valsLength ? values[index] : undefined;\\n assignFunc(result, props[index], value);\\n }\\n return result;\\n }\\n\\n /**\\n * Casts `value` to an empty array if it's not an array like object.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {Array|Object} Returns the cast array-like object.\\n */\\n function castArrayLikeObject(value) {\\n return isArrayLikeObject(value) ? value : [];\\n }\\n\\n /**\\n * Casts `value` to `identity` if it's not a function.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {Function} Returns cast function.\\n */\\n function castFunction(value) {\\n return typeof value == 'function' ? value : identity;\\n }\\n\\n /**\\n * Casts `value` to a path array if it's not one.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @param {Object} [object] The object to query keys on.\\n * @returns {Array} Returns the cast property path array.\\n */\\n function castPath(value, object) {\\n if (isArray(value)) {\\n return value;\\n }\\n return isKey(value, object) ? [value] : stringToPath(toString(value));\\n }\\n\\n /**\\n * A `baseRest` alias which can be replaced with `identity` by module\\n * replacement plugins.\\n *\\n * @private\\n * @type {Function}\\n * @param {Function} func The function to apply a rest parameter to.\\n * @returns {Function} Returns the new function.\\n */\\n var castRest = baseRest;\\n\\n /**\\n * Casts `array` to a slice if it's needed.\\n *\\n * @private\\n * @param {Array} array The array to inspect.\\n * @param {number} start The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the cast slice.\\n */\\n function castSlice(array, start, end) {\\n var length = array.length;\\n end = end === undefined ? length : end;\\n return (!start && end >= length) ? array : baseSlice(array, start, end);\\n }\\n\\n /**\\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\\n *\\n * @private\\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\\n */\\n var clearTimeout = ctxClearTimeout || function(id) {\\n return root.clearTimeout(id);\\n };\\n\\n /**\\n * Creates a clone of `buffer`.\\n *\\n * @private\\n * @param {Buffer} buffer The buffer to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Buffer} Returns the cloned buffer.\\n */\\n function cloneBuffer(buffer, isDeep) {\\n if (isDeep) {\\n return buffer.slice();\\n }\\n var length = buffer.length,\\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\\n\\n buffer.copy(result);\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `arrayBuffer`.\\n *\\n * @private\\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\\n * @returns {ArrayBuffer} Returns the cloned array buffer.\\n */\\n function cloneArrayBuffer(arrayBuffer) {\\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `dataView`.\\n *\\n * @private\\n * @param {Object} dataView The data view to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned data view.\\n */\\n function cloneDataView(dataView, isDeep) {\\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\\n }\\n\\n /**\\n * Creates a clone of `map`.\\n *\\n * @private\\n * @param {Object} map The map to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned map.\\n */\\n function cloneMap(map, isDeep, cloneFunc) {\\n var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map);\\n return arrayReduce(array, addMapEntry, new map.constructor);\\n }\\n\\n /**\\n * Creates a clone of `regexp`.\\n *\\n * @private\\n * @param {Object} regexp The regexp to clone.\\n * @returns {Object} Returns the cloned regexp.\\n */\\n function cloneRegExp(regexp) {\\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\\n result.lastIndex = regexp.lastIndex;\\n return result;\\n }\\n\\n /**\\n * Creates a clone of `set`.\\n *\\n * @private\\n * @param {Object} set The set to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned set.\\n */\\n function cloneSet(set, isDeep, cloneFunc) {\\n var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set);\\n return arrayReduce(array, addSetEntry, new set.constructor);\\n }\\n\\n /**\\n * Creates a clone of the `symbol` object.\\n *\\n * @private\\n * @param {Object} symbol The symbol object to clone.\\n * @returns {Object} Returns the cloned symbol object.\\n */\\n function cloneSymbol(symbol) {\\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\\n }\\n\\n /**\\n * Creates a clone of `typedArray`.\\n *\\n * @private\\n * @param {Object} typedArray The typed array to clone.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the cloned typed array.\\n */\\n function cloneTypedArray(typedArray, isDeep) {\\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\\n }\\n\\n /**\\n * Compares values to sort them in ascending order.\\n *\\n * @private\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {number} Returns the sort order indicator for `value`.\\n */\\n function compareAscending(value, other) {\\n if (value !== other) {\\n var valIsDefined = value !== undefined,\\n valIsNull = value === null,\\n valIsReflexive = value === value,\\n valIsSymbol = isSymbol(value);\\n\\n var othIsDefined = other !== undefined,\\n othIsNull = other === null,\\n othIsReflexive = other === other,\\n othIsSymbol = isSymbol(other);\\n\\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\\n (valIsNull && othIsDefined && othIsReflexive) ||\\n (!valIsDefined && othIsReflexive) ||\\n !valIsReflexive) {\\n return 1;\\n }\\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\\n (othIsNull && valIsDefined && valIsReflexive) ||\\n (!othIsDefined && valIsReflexive) ||\\n !othIsReflexive) {\\n return -1;\\n }\\n }\\n return 0;\\n }\\n\\n /**\\n * Used by `_.orderBy` to compare multiple properties of a value to another\\n * and stable sort them.\\n *\\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\\n * specify an order of \\\"desc\\\" for descending or \\\"asc\\\" for ascending sort order\\n * of corresponding values.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {boolean[]|string[]} orders The order to sort by for each property.\\n * @returns {number} Returns the sort order indicator for `object`.\\n */\\n function compareMultiple(object, other, orders) {\\n var index = -1,\\n objCriteria = object.criteria,\\n othCriteria = other.criteria,\\n length = objCriteria.length,\\n ordersLength = orders.length;\\n\\n while (++index < length) {\\n var result = compareAscending(objCriteria[index], othCriteria[index]);\\n if (result) {\\n if (index >= ordersLength) {\\n return result;\\n }\\n var order = orders[index];\\n return result * (order == 'desc' ? -1 : 1);\\n }\\n }\\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\\n // that causes it, under certain circumstances, to provide the same value for\\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\\n // for more details.\\n //\\n // This also ensures a stable sort in V8 and other engines.\\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\\n return object.index - other.index;\\n }\\n\\n /**\\n * Creates an array that is the composition of partially applied arguments,\\n * placeholders, and provided arguments into a single array of arguments.\\n *\\n * @private\\n * @param {Array} args The provided arguments.\\n * @param {Array} partials The arguments to prepend to those provided.\\n * @param {Array} holders The `partials` placeholder indexes.\\n * @params {boolean} [isCurried] Specify composing for a curried function.\\n * @returns {Array} Returns the new array of composed arguments.\\n */\\n function composeArgs(args, partials, holders, isCurried) {\\n var argsIndex = -1,\\n argsLength = args.length,\\n holdersLength = holders.length,\\n leftIndex = -1,\\n leftLength = partials.length,\\n rangeLength = nativeMax(argsLength - holdersLength, 0),\\n result = Array(leftLength + rangeLength),\\n isUncurried = !isCurried;\\n\\n while (++leftIndex < leftLength) {\\n result[leftIndex] = partials[leftIndex];\\n }\\n while (++argsIndex < holdersLength) {\\n if (isUncurried || argsIndex < argsLength) {\\n result[holders[argsIndex]] = args[argsIndex];\\n }\\n }\\n while (rangeLength--) {\\n result[leftIndex++] = args[argsIndex++];\\n }\\n return result;\\n }\\n\\n /**\\n * This function is like `composeArgs` except that the arguments composition\\n * is tailored for `_.partialRight`.\\n *\\n * @private\\n * @param {Array} args The provided arguments.\\n * @param {Array} partials The arguments to append to those provided.\\n * @param {Array} holders The `partials` placeholder indexes.\\n * @params {boolean} [isCurried] Specify composing for a curried function.\\n * @returns {Array} Returns the new array of composed arguments.\\n */\\n function composeArgsRight(args, partials, holders, isCurried) {\\n var argsIndex = -1,\\n argsLength = args.length,\\n holdersIndex = -1,\\n holdersLength = holders.length,\\n rightIndex = -1,\\n rightLength = partials.length,\\n rangeLength = nativeMax(argsLength - holdersLength, 0),\\n result = Array(rangeLength + rightLength),\\n isUncurried = !isCurried;\\n\\n while (++argsIndex < rangeLength) {\\n result[argsIndex] = args[argsIndex];\\n }\\n var offset = argsIndex;\\n while (++rightIndex < rightLength) {\\n result[offset + rightIndex] = partials[rightIndex];\\n }\\n while (++holdersIndex < holdersLength) {\\n if (isUncurried || argsIndex < argsLength) {\\n result[offset + holders[holdersIndex]] = args[argsIndex++];\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Copies the values of `source` to `array`.\\n *\\n * @private\\n * @param {Array} source The array to copy values from.\\n * @param {Array} [array=[]] The array to copy values to.\\n * @returns {Array} Returns `array`.\\n */\\n function copyArray(source, array) {\\n var index = -1,\\n length = source.length;\\n\\n array || (array = Array(length));\\n while (++index < length) {\\n array[index] = source[index];\\n }\\n return array;\\n }\\n\\n /**\\n * Copies properties of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy properties from.\\n * @param {Array} props The property identifiers to copy.\\n * @param {Object} [object={}] The object to copy properties to.\\n * @param {Function} [customizer] The function to customize copied values.\\n * @returns {Object} Returns `object`.\\n */\\n function copyObject(source, props, object, customizer) {\\n var isNew = !object;\\n object || (object = {});\\n\\n var index = -1,\\n length = props.length;\\n\\n while (++index < length) {\\n var key = props[index];\\n\\n var newValue = customizer\\n ? customizer(object[key], source[key], key, object, source)\\n : undefined;\\n\\n if (newValue === undefined) {\\n newValue = source[key];\\n }\\n if (isNew) {\\n baseAssignValue(object, key, newValue);\\n } else {\\n assignValue(object, key, newValue);\\n }\\n }\\n return object;\\n }\\n\\n /**\\n * Copies own symbols of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy symbols from.\\n * @param {Object} [object={}] The object to copy symbols to.\\n * @returns {Object} Returns `object`.\\n */\\n function copySymbols(source, object) {\\n return copyObject(source, getSymbols(source), object);\\n }\\n\\n /**\\n * Copies own and inherited symbols of `source` to `object`.\\n *\\n * @private\\n * @param {Object} source The object to copy symbols from.\\n * @param {Object} [object={}] The object to copy symbols to.\\n * @returns {Object} Returns `object`.\\n */\\n function copySymbolsIn(source, object) {\\n return copyObject(source, getSymbolsIn(source), object);\\n }\\n\\n /**\\n * Creates a function like `_.groupBy`.\\n *\\n * @private\\n * @param {Function} setter The function to set accumulator values.\\n * @param {Function} [initializer] The accumulator object initializer.\\n * @returns {Function} Returns the new aggregator function.\\n */\\n function createAggregator(setter, initializer) {\\n return function(collection, iteratee) {\\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\\n accumulator = initializer ? initializer() : {};\\n\\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\\n };\\n }\\n\\n /**\\n * Creates a function like `_.assign`.\\n *\\n * @private\\n * @param {Function} assigner The function to assign values.\\n * @returns {Function} Returns the new assigner function.\\n */\\n function createAssigner(assigner) {\\n return baseRest(function(object, sources) {\\n var index = -1,\\n length = sources.length,\\n customizer = length > 1 ? sources[length - 1] : undefined,\\n guard = length > 2 ? sources[2] : undefined;\\n\\n customizer = (assigner.length > 3 && typeof customizer == 'function')\\n ? (length--, customizer)\\n : undefined;\\n\\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\\n customizer = length < 3 ? undefined : customizer;\\n length = 1;\\n }\\n object = Object(object);\\n while (++index < length) {\\n var source = sources[index];\\n if (source) {\\n assigner(object, source, index, customizer);\\n }\\n }\\n return object;\\n });\\n }\\n\\n /**\\n * Creates a `baseEach` or `baseEachRight` function.\\n *\\n * @private\\n * @param {Function} eachFunc The function to iterate over a collection.\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new base function.\\n */\\n function createBaseEach(eachFunc, fromRight) {\\n return function(collection, iteratee) {\\n if (collection == null) {\\n return collection;\\n }\\n if (!isArrayLike(collection)) {\\n return eachFunc(collection, iteratee);\\n }\\n var length = collection.length,\\n index = fromRight ? length : -1,\\n iterable = Object(collection);\\n\\n while ((fromRight ? index-- : ++index < length)) {\\n if (iteratee(iterable[index], index, iterable) === false) {\\n break;\\n }\\n }\\n return collection;\\n };\\n }\\n\\n /**\\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new base function.\\n */\\n function createBaseFor(fromRight) {\\n return function(object, iteratee, keysFunc) {\\n var index = -1,\\n iterable = Object(object),\\n props = keysFunc(object),\\n length = props.length;\\n\\n while (length--) {\\n var key = props[fromRight ? length : ++index];\\n if (iteratee(iterable[key], key, iterable) === false) {\\n break;\\n }\\n }\\n return object;\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with the optional `this`\\n * binding of `thisArg`.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createBind(func, bitmask, thisArg) {\\n var isBind = bitmask & WRAP_BIND_FLAG,\\n Ctor = createCtor(func);\\n\\n function wrapper() {\\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n return fn.apply(isBind ? thisArg : this, arguments);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a function like `_.lowerFirst`.\\n *\\n * @private\\n * @param {string} methodName The name of the `String` case method to use.\\n * @returns {Function} Returns the new case function.\\n */\\n function createCaseFirst(methodName) {\\n return function(string) {\\n string = toString(string);\\n\\n var strSymbols = hasUnicode(string)\\n ? stringToArray(string)\\n : undefined;\\n\\n var chr = strSymbols\\n ? strSymbols[0]\\n : string.charAt(0);\\n\\n var trailing = strSymbols\\n ? castSlice(strSymbols, 1).join('')\\n : string.slice(1);\\n\\n return chr[methodName]() + trailing;\\n };\\n }\\n\\n /**\\n * Creates a function like `_.camelCase`.\\n *\\n * @private\\n * @param {Function} callback The function to combine each word.\\n * @returns {Function} Returns the new compounder function.\\n */\\n function createCompounder(callback) {\\n return function(string) {\\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\\n };\\n }\\n\\n /**\\n * Creates a function that produces an instance of `Ctor` regardless of\\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\\n *\\n * @private\\n * @param {Function} Ctor The constructor to wrap.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createCtor(Ctor) {\\n return function() {\\n // Use a `switch` statement to work with class constructors. See\\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\\n // for more details.\\n var args = arguments;\\n switch (args.length) {\\n case 0: return new Ctor;\\n case 1: return new Ctor(args[0]);\\n case 2: return new Ctor(args[0], args[1]);\\n case 3: return new Ctor(args[0], args[1], args[2]);\\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\\n }\\n var thisBinding = baseCreate(Ctor.prototype),\\n result = Ctor.apply(thisBinding, args);\\n\\n // Mimic the constructor's `return` behavior.\\n // See https://es5.github.io/#x13.2.2 for more details.\\n return isObject(result) ? result : thisBinding;\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to enable currying.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {number} arity The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createCurry(func, bitmask, arity) {\\n var Ctor = createCtor(func);\\n\\n function wrapper() {\\n var length = arguments.length,\\n args = Array(length),\\n index = length,\\n placeholder = getHolder(wrapper);\\n\\n while (index--) {\\n args[index] = arguments[index];\\n }\\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\\n ? []\\n : replaceHolders(args, placeholder);\\n\\n length -= holders.length;\\n if (length < arity) {\\n return createRecurry(\\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\\n args, holders, undefined, undefined, arity - length);\\n }\\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n return apply(fn, this, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a `_.find` or `_.findLast` function.\\n *\\n * @private\\n * @param {Function} findIndexFunc The function to find the collection index.\\n * @returns {Function} Returns the new find function.\\n */\\n function createFind(findIndexFunc) {\\n return function(collection, predicate, fromIndex) {\\n var iterable = Object(collection);\\n if (!isArrayLike(collection)) {\\n var iteratee = getIteratee(predicate, 3);\\n collection = keys(collection);\\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\\n }\\n var index = findIndexFunc(collection, predicate, fromIndex);\\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\\n };\\n }\\n\\n /**\\n * Creates a `_.flow` or `_.flowRight` function.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new flow function.\\n */\\n function createFlow(fromRight) {\\n return flatRest(function(funcs) {\\n var length = funcs.length,\\n index = length,\\n prereq = LodashWrapper.prototype.thru;\\n\\n if (fromRight) {\\n funcs.reverse();\\n }\\n while (index--) {\\n var func = funcs[index];\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\\n var wrapper = new LodashWrapper([], true);\\n }\\n }\\n index = wrapper ? index : length;\\n while (++index < length) {\\n func = funcs[index];\\n\\n var funcName = getFuncName(func),\\n data = funcName == 'wrapper' ? getData(func) : undefined;\\n\\n if (data && isLaziable(data[0]) &&\\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\\n !data[4].length && data[9] == 1\\n ) {\\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\\n } else {\\n wrapper = (func.length == 1 && isLaziable(func))\\n ? wrapper[funcName]()\\n : wrapper.thru(func);\\n }\\n }\\n return function() {\\n var args = arguments,\\n value = args[0];\\n\\n if (wrapper && args.length == 1 && isArray(value)) {\\n return wrapper.plant(value).value();\\n }\\n var index = 0,\\n result = length ? funcs[index].apply(this, args) : value;\\n\\n while (++index < length) {\\n result = funcs[index].call(this, result);\\n }\\n return result;\\n };\\n });\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with optional `this`\\n * binding of `thisArg`, partial application, and currying.\\n *\\n * @private\\n * @param {Function|string} func The function or method name to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to prepend to those provided to\\n * the new function.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [partialsRight] The arguments to append to those provided\\n * to the new function.\\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\\n var isAry = bitmask & WRAP_ARY_FLAG,\\n isBind = bitmask & WRAP_BIND_FLAG,\\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\\n isFlip = bitmask & WRAP_FLIP_FLAG,\\n Ctor = isBindKey ? undefined : createCtor(func);\\n\\n function wrapper() {\\n var length = arguments.length,\\n args = Array(length),\\n index = length;\\n\\n while (index--) {\\n args[index] = arguments[index];\\n }\\n if (isCurried) {\\n var placeholder = getHolder(wrapper),\\n holdersCount = countHolders(args, placeholder);\\n }\\n if (partials) {\\n args = composeArgs(args, partials, holders, isCurried);\\n }\\n if (partialsRight) {\\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\\n }\\n length -= holdersCount;\\n if (isCurried && length < arity) {\\n var newHolders = replaceHolders(args, placeholder);\\n return createRecurry(\\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\\n args, newHolders, argPos, ary, arity - length\\n );\\n }\\n var thisBinding = isBind ? thisArg : this,\\n fn = isBindKey ? thisBinding[func] : func;\\n\\n length = args.length;\\n if (argPos) {\\n args = reorder(args, argPos);\\n } else if (isFlip && length > 1) {\\n args.reverse();\\n }\\n if (isAry && ary < length) {\\n args.length = ary;\\n }\\n if (this && this !== root && this instanceof wrapper) {\\n fn = Ctor || createCtor(fn);\\n }\\n return fn.apply(thisBinding, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a function like `_.invertBy`.\\n *\\n * @private\\n * @param {Function} setter The function to set accumulator values.\\n * @param {Function} toIteratee The function to resolve iteratees.\\n * @returns {Function} Returns the new inverter function.\\n */\\n function createInverter(setter, toIteratee) {\\n return function(object, iteratee) {\\n return baseInverter(object, setter, toIteratee(iteratee), {});\\n };\\n }\\n\\n /**\\n * Creates a function that performs a mathematical operation on two values.\\n *\\n * @private\\n * @param {Function} operator The function to perform the operation.\\n * @param {number} [defaultValue] The value used for `undefined` arguments.\\n * @returns {Function} Returns the new mathematical operation function.\\n */\\n function createMathOperation(operator, defaultValue) {\\n return function(value, other) {\\n var result;\\n if (value === undefined && other === undefined) {\\n return defaultValue;\\n }\\n if (value !== undefined) {\\n result = value;\\n }\\n if (other !== undefined) {\\n if (result === undefined) {\\n return other;\\n }\\n if (typeof value == 'string' || typeof other == 'string') {\\n value = baseToString(value);\\n other = baseToString(other);\\n } else {\\n value = baseToNumber(value);\\n other = baseToNumber(other);\\n }\\n result = operator(value, other);\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Creates a function like `_.over`.\\n *\\n * @private\\n * @param {Function} arrayFunc The function to iterate over iteratees.\\n * @returns {Function} Returns the new over function.\\n */\\n function createOver(arrayFunc) {\\n return flatRest(function(iteratees) {\\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\\n return baseRest(function(args) {\\n var thisArg = this;\\n return arrayFunc(iteratees, function(iteratee) {\\n return apply(iteratee, thisArg, args);\\n });\\n });\\n });\\n }\\n\\n /**\\n * Creates the padding for `string` based on `length`. The `chars` string\\n * is truncated if the number of characters exceeds `length`.\\n *\\n * @private\\n * @param {number} length The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padding for `string`.\\n */\\n function createPadding(length, chars) {\\n chars = chars === undefined ? ' ' : baseToString(chars);\\n\\n var charsLength = chars.length;\\n if (charsLength < 2) {\\n return charsLength ? baseRepeat(chars, length) : chars;\\n }\\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\\n return hasUnicode(chars)\\n ? castSlice(stringToArray(result), 0, length).join('')\\n : result.slice(0, length);\\n }\\n\\n /**\\n * Creates a function that wraps `func` to invoke it with the `this` binding\\n * of `thisArg` and `partials` prepended to the arguments it receives.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {Array} partials The arguments to prepend to those provided to\\n * the new function.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createPartial(func, bitmask, thisArg, partials) {\\n var isBind = bitmask & WRAP_BIND_FLAG,\\n Ctor = createCtor(func);\\n\\n function wrapper() {\\n var argsIndex = -1,\\n argsLength = arguments.length,\\n leftIndex = -1,\\n leftLength = partials.length,\\n args = Array(leftLength + argsLength),\\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\\n\\n while (++leftIndex < leftLength) {\\n args[leftIndex] = partials[leftIndex];\\n }\\n while (argsLength--) {\\n args[leftIndex++] = arguments[++argsIndex];\\n }\\n return apply(fn, isBind ? thisArg : this, args);\\n }\\n return wrapper;\\n }\\n\\n /**\\n * Creates a `_.range` or `_.rangeRight` function.\\n *\\n * @private\\n * @param {boolean} [fromRight] Specify iterating from right to left.\\n * @returns {Function} Returns the new range function.\\n */\\n function createRange(fromRight) {\\n return function(start, end, step) {\\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\\n end = step = undefined;\\n }\\n // Ensure the sign of `-0` is preserved.\\n start = toFinite(start);\\n if (end === undefined) {\\n end = start;\\n start = 0;\\n } else {\\n end = toFinite(end);\\n }\\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\\n return baseRange(start, end, step, fromRight);\\n };\\n }\\n\\n /**\\n * Creates a function that performs a relational operation on two values.\\n *\\n * @private\\n * @param {Function} operator The function to perform the operation.\\n * @returns {Function} Returns the new relational operation function.\\n */\\n function createRelationalOperation(operator) {\\n return function(value, other) {\\n if (!(typeof value == 'string' && typeof other == 'string')) {\\n value = toNumber(value);\\n other = toNumber(other);\\n }\\n return operator(value, other);\\n };\\n }\\n\\n /**\\n * Creates a function that wraps `func` to continue currying.\\n *\\n * @private\\n * @param {Function} func The function to wrap.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @param {Function} wrapFunc The function to create the `func` wrapper.\\n * @param {*} placeholder The placeholder value.\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to prepend to those provided to\\n * the new function.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\\n var isCurry = bitmask & WRAP_CURRY_FLAG,\\n newHolders = isCurry ? holders : undefined,\\n newHoldersRight = isCurry ? undefined : holders,\\n newPartials = isCurry ? partials : undefined,\\n newPartialsRight = isCurry ? undefined : partials;\\n\\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\\n\\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\\n }\\n var newData = [\\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\\n newHoldersRight, argPos, ary, arity\\n ];\\n\\n var result = wrapFunc.apply(undefined, newData);\\n if (isLaziable(func)) {\\n setData(result, newData);\\n }\\n result.placeholder = placeholder;\\n return setWrapToString(result, func, bitmask);\\n }\\n\\n /**\\n * Creates a function like `_.round`.\\n *\\n * @private\\n * @param {string} methodName The name of the `Math` method to use when rounding.\\n * @returns {Function} Returns the new round function.\\n */\\n function createRound(methodName) {\\n var func = Math[methodName];\\n return function(number, precision) {\\n number = toNumber(number);\\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\\n if (precision) {\\n // Shift with exponential notation to avoid floating-point issues.\\n // See [MDN](https://mdn.io/round#Examples) for more details.\\n var pair = (toString(number) + 'e').split('e'),\\n value = func(pair[0] + 'e' + (+pair[1] + precision));\\n\\n pair = (toString(value) + 'e').split('e');\\n return +(pair[0] + 'e' + (+pair[1] - precision));\\n }\\n return func(number);\\n };\\n }\\n\\n /**\\n * Creates a set object of `values`.\\n *\\n * @private\\n * @param {Array} values The values to add to the set.\\n * @returns {Object} Returns the new set.\\n */\\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\\n return new Set(values);\\n };\\n\\n /**\\n * Creates a `_.toPairs` or `_.toPairsIn` function.\\n *\\n * @private\\n * @param {Function} keysFunc The function to get the keys of a given object.\\n * @returns {Function} Returns the new pairs function.\\n */\\n function createToPairs(keysFunc) {\\n return function(object) {\\n var tag = getTag(object);\\n if (tag == mapTag) {\\n return mapToArray(object);\\n }\\n if (tag == setTag) {\\n return setToPairs(object);\\n }\\n return baseToPairs(object, keysFunc(object));\\n };\\n }\\n\\n /**\\n * Creates a function that either curries or invokes `func` with optional\\n * `this` binding and partially applied arguments.\\n *\\n * @private\\n * @param {Function|string} func The function or method name to wrap.\\n * @param {number} bitmask The bitmask flags.\\n * 1 - `_.bind`\\n * 2 - `_.bindKey`\\n * 4 - `_.curry` or `_.curryRight` of a bound function\\n * 8 - `_.curry`\\n * 16 - `_.curryRight`\\n * 32 - `_.partial`\\n * 64 - `_.partialRight`\\n * 128 - `_.rearg`\\n * 256 - `_.ary`\\n * 512 - `_.flip`\\n * @param {*} [thisArg] The `this` binding of `func`.\\n * @param {Array} [partials] The arguments to be partially applied.\\n * @param {Array} [holders] The `partials` placeholder indexes.\\n * @param {Array} [argPos] The argument positions of the new function.\\n * @param {number} [ary] The arity cap of `func`.\\n * @param {number} [arity] The arity of `func`.\\n * @returns {Function} Returns the new wrapped function.\\n */\\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\\n if (!isBindKey && typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n var length = partials ? partials.length : 0;\\n if (!length) {\\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\\n partials = holders = undefined;\\n }\\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\\n arity = arity === undefined ? arity : toInteger(arity);\\n length -= holders ? holders.length : 0;\\n\\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\\n var partialsRight = partials,\\n holdersRight = holders;\\n\\n partials = holders = undefined;\\n }\\n var data = isBindKey ? undefined : getData(func);\\n\\n var newData = [\\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\\n argPos, ary, arity\\n ];\\n\\n if (data) {\\n mergeData(newData, data);\\n }\\n func = newData[0];\\n bitmask = newData[1];\\n thisArg = newData[2];\\n partials = newData[3];\\n holders = newData[4];\\n arity = newData[9] = newData[9] === undefined\\n ? (isBindKey ? 0 : func.length)\\n : nativeMax(newData[9] - length, 0);\\n\\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\\n }\\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\\n var result = createBind(func, bitmask, thisArg);\\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\\n result = createCurry(func, bitmask, arity);\\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\\n result = createPartial(func, bitmask, thisArg, partials);\\n } else {\\n result = createHybrid.apply(undefined, newData);\\n }\\n var setter = data ? baseSetData : setData;\\n return setWrapToString(setter(result, newData), func, bitmask);\\n }\\n\\n /**\\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\\n * of source objects to the destination object for all destination properties\\n * that resolve to `undefined`.\\n *\\n * @private\\n * @param {*} objValue The destination value.\\n * @param {*} srcValue The source value.\\n * @param {string} key The key of the property to assign.\\n * @param {Object} object The parent object of `objValue`.\\n * @returns {*} Returns the value to assign.\\n */\\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\\n if (objValue === undefined ||\\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\\n return srcValue;\\n }\\n return objValue;\\n }\\n\\n /**\\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\\n * objects into destination objects that are passed thru.\\n *\\n * @private\\n * @param {*} objValue The destination value.\\n * @param {*} srcValue The source value.\\n * @param {string} key The key of the property to merge.\\n * @param {Object} object The parent object of `objValue`.\\n * @param {Object} source The parent object of `srcValue`.\\n * @param {Object} [stack] Tracks traversed source values and their merged\\n * counterparts.\\n * @returns {*} Returns the value to assign.\\n */\\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\\n if (isObject(objValue) && isObject(srcValue)) {\\n // Recursively merge objects and arrays (susceptible to call stack limits).\\n stack.set(srcValue, objValue);\\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\\n stack['delete'](srcValue);\\n }\\n return objValue;\\n }\\n\\n /**\\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\\n * objects.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @param {string} key The key of the property to inspect.\\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\\n */\\n function customOmitClone(value) {\\n return isPlainObject(value) ? undefined : value;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for arrays with support for\\n * partial deep comparisons.\\n *\\n * @private\\n * @param {Array} array The array to compare.\\n * @param {Array} other The other array to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `array` and `other` objects.\\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\\n */\\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\\n arrLength = array.length,\\n othLength = other.length;\\n\\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\\n return false;\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(array);\\n if (stacked && stack.get(other)) {\\n return stacked == other;\\n }\\n var index = -1,\\n result = true,\\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\\n\\n stack.set(array, other);\\n stack.set(other, array);\\n\\n // Ignore non-index properties.\\n while (++index < arrLength) {\\n var arrValue = array[index],\\n othValue = other[index];\\n\\n if (customizer) {\\n var compared = isPartial\\n ? customizer(othValue, arrValue, index, other, array, stack)\\n : customizer(arrValue, othValue, index, array, other, stack);\\n }\\n if (compared !== undefined) {\\n if (compared) {\\n continue;\\n }\\n result = false;\\n break;\\n }\\n // Recursively compare arrays (susceptible to call stack limits).\\n if (seen) {\\n if (!arraySome(other, function(othValue, othIndex) {\\n if (!cacheHas(seen, othIndex) &&\\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\\n return seen.push(othIndex);\\n }\\n })) {\\n result = false;\\n break;\\n }\\n } else if (!(\\n arrValue === othValue ||\\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\\n )) {\\n result = false;\\n break;\\n }\\n }\\n stack['delete'](array);\\n stack['delete'](other);\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for comparing objects of\\n * the same `toStringTag`.\\n *\\n * **Note:** This function only supports comparing values with tags of\\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {string} tag The `toStringTag` of the objects to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\\n switch (tag) {\\n case dataViewTag:\\n if ((object.byteLength != other.byteLength) ||\\n (object.byteOffset != other.byteOffset)) {\\n return false;\\n }\\n object = object.buffer;\\n other = other.buffer;\\n\\n case arrayBufferTag:\\n if ((object.byteLength != other.byteLength) ||\\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\\n return false;\\n }\\n return true;\\n\\n case boolTag:\\n case dateTag:\\n case numberTag:\\n // Coerce booleans to `1` or `0` and dates to milliseconds.\\n // Invalid dates are coerced to `NaN`.\\n return eq(+object, +other);\\n\\n case errorTag:\\n return object.name == other.name && object.message == other.message;\\n\\n case regexpTag:\\n case stringTag:\\n // Coerce regexes to strings and treat strings, primitives and objects,\\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\\n // for more details.\\n return object == (other + '');\\n\\n case mapTag:\\n var convert = mapToArray;\\n\\n case setTag:\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\\n convert || (convert = setToArray);\\n\\n if (object.size != other.size && !isPartial) {\\n return false;\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(object);\\n if (stacked) {\\n return stacked == other;\\n }\\n bitmask |= COMPARE_UNORDERED_FLAG;\\n\\n // Recursively compare objects (susceptible to call stack limits).\\n stack.set(object, other);\\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\\n stack['delete'](object);\\n return result;\\n\\n case symbolTag:\\n if (symbolValueOf) {\\n return symbolValueOf.call(object) == symbolValueOf.call(other);\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * A specialized version of `baseIsEqualDeep` for objects with support for\\n * partial deep comparisons.\\n *\\n * @private\\n * @param {Object} object The object to compare.\\n * @param {Object} other The other object to compare.\\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\\n * @param {Function} customizer The function to customize comparisons.\\n * @param {Function} equalFunc The function to determine equivalents of values.\\n * @param {Object} stack Tracks traversed `object` and `other` objects.\\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\\n */\\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\\n objProps = getAllKeys(object),\\n objLength = objProps.length,\\n othProps = getAllKeys(other),\\n othLength = othProps.length;\\n\\n if (objLength != othLength && !isPartial) {\\n return false;\\n }\\n var index = objLength;\\n while (index--) {\\n var key = objProps[index];\\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\\n return false;\\n }\\n }\\n // Assume cyclic values are equal.\\n var stacked = stack.get(object);\\n if (stacked && stack.get(other)) {\\n return stacked == other;\\n }\\n var result = true;\\n stack.set(object, other);\\n stack.set(other, object);\\n\\n var skipCtor = isPartial;\\n while (++index < objLength) {\\n key = objProps[index];\\n var objValue = object[key],\\n othValue = other[key];\\n\\n if (customizer) {\\n var compared = isPartial\\n ? customizer(othValue, objValue, key, other, object, stack)\\n : customizer(objValue, othValue, key, object, other, stack);\\n }\\n // Recursively compare objects (susceptible to call stack limits).\\n if (!(compared === undefined\\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\\n : compared\\n )) {\\n result = false;\\n break;\\n }\\n skipCtor || (skipCtor = key == 'constructor');\\n }\\n if (result && !skipCtor) {\\n var objCtor = object.constructor,\\n othCtor = other.constructor;\\n\\n // Non `Object` object instances with different constructors are not equal.\\n if (objCtor != othCtor &&\\n ('constructor' in object && 'constructor' in other) &&\\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\\n result = false;\\n }\\n }\\n stack['delete'](object);\\n stack['delete'](other);\\n return result;\\n }\\n\\n /**\\n * A specialized version of `baseRest` which flattens the rest array.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @returns {Function} Returns the new function.\\n */\\n function flatRest(func) {\\n return setToString(overRest(func, undefined, flatten), func + '');\\n }\\n\\n /**\\n * Creates an array of own enumerable property names and symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function getAllKeys(object) {\\n return baseGetAllKeys(object, keys, getSymbols);\\n }\\n\\n /**\\n * Creates an array of own and inherited enumerable property names and\\n * symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names and symbols.\\n */\\n function getAllKeysIn(object) {\\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\\n }\\n\\n /**\\n * Gets metadata for `func`.\\n *\\n * @private\\n * @param {Function} func The function to query.\\n * @returns {*} Returns the metadata for `func`.\\n */\\n var getData = !metaMap ? noop : function(func) {\\n return metaMap.get(func);\\n };\\n\\n /**\\n * Gets the name of `func`.\\n *\\n * @private\\n * @param {Function} func The function to query.\\n * @returns {string} Returns the function name.\\n */\\n function getFuncName(func) {\\n var result = (func.name + ''),\\n array = realNames[result],\\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\\n\\n while (length--) {\\n var data = array[length],\\n otherFunc = data.func;\\n if (otherFunc == null || otherFunc == func) {\\n return data.name;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the argument placeholder value for `func`.\\n *\\n * @private\\n * @param {Function} func The function to inspect.\\n * @returns {*} Returns the placeholder value.\\n */\\n function getHolder(func) {\\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\\n return object.placeholder;\\n }\\n\\n /**\\n * Gets the appropriate \\\"iteratee\\\" function. If `_.iteratee` is customized,\\n * this function returns the custom method, otherwise it returns `baseIteratee`.\\n * If arguments are provided, the chosen function is invoked with them and\\n * its result is returned.\\n *\\n * @private\\n * @param {*} [value] The value to convert to an iteratee.\\n * @param {number} [arity] The arity of the created iteratee.\\n * @returns {Function} Returns the chosen function or its result.\\n */\\n function getIteratee() {\\n var result = lodash.iteratee || iteratee;\\n result = result === iteratee ? baseIteratee : result;\\n return arguments.length ? result(arguments[0], arguments[1]) : result;\\n }\\n\\n /**\\n * Gets the data for `map`.\\n *\\n * @private\\n * @param {Object} map The map to query.\\n * @param {string} key The reference key.\\n * @returns {*} Returns the map data.\\n */\\n function getMapData(map, key) {\\n var data = map.__data__;\\n return isKeyable(key)\\n ? data[typeof key == 'string' ? 'string' : 'hash']\\n : data.map;\\n }\\n\\n /**\\n * Gets the property names, values, and compare flags of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the match data of `object`.\\n */\\n function getMatchData(object) {\\n var result = keys(object),\\n length = result.length;\\n\\n while (length--) {\\n var key = result[length],\\n value = object[key];\\n\\n result[length] = [key, value, isStrictComparable(value)];\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the native function at `key` of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {string} key The key of the method to get.\\n * @returns {*} Returns the function if it's native, else `undefined`.\\n */\\n function getNative(object, key) {\\n var value = getValue(object, key);\\n return baseIsNative(value) ? value : undefined;\\n }\\n\\n /**\\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the raw `toStringTag`.\\n */\\n function getRawTag(value) {\\n var isOwn = hasOwnProperty.call(value, symToStringTag),\\n tag = value[symToStringTag];\\n\\n try {\\n value[symToStringTag] = undefined;\\n var unmasked = true;\\n } catch (e) {}\\n\\n var result = nativeObjectToString.call(value);\\n if (unmasked) {\\n if (isOwn) {\\n value[symToStringTag] = tag;\\n } else {\\n delete value[symToStringTag];\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Creates an array of the own enumerable symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of symbols.\\n */\\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\\n if (object == null) {\\n return [];\\n }\\n object = Object(object);\\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\\n return propertyIsEnumerable.call(object, symbol);\\n });\\n };\\n\\n /**\\n * Creates an array of the own and inherited enumerable symbols of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of symbols.\\n */\\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\\n var result = [];\\n while (object) {\\n arrayPush(result, getSymbols(object));\\n object = getPrototype(object);\\n }\\n return result;\\n };\\n\\n /**\\n * Gets the `toStringTag` of `value`.\\n *\\n * @private\\n * @param {*} value The value to query.\\n * @returns {string} Returns the `toStringTag`.\\n */\\n var getTag = baseGetTag;\\n\\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\\n (Map && getTag(new Map) != mapTag) ||\\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\\n (Set && getTag(new Set) != setTag) ||\\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\\n getTag = function(value) {\\n var result = baseGetTag(value),\\n Ctor = result == objectTag ? value.constructor : undefined,\\n ctorString = Ctor ? toSource(Ctor) : '';\\n\\n if (ctorString) {\\n switch (ctorString) {\\n case dataViewCtorString: return dataViewTag;\\n case mapCtorString: return mapTag;\\n case promiseCtorString: return promiseTag;\\n case setCtorString: return setTag;\\n case weakMapCtorString: return weakMapTag;\\n }\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\\n *\\n * @private\\n * @param {number} start The start of the view.\\n * @param {number} end The end of the view.\\n * @param {Array} transforms The transformations to apply to the view.\\n * @returns {Object} Returns an object containing the `start` and `end`\\n * positions of the view.\\n */\\n function getView(start, end, transforms) {\\n var index = -1,\\n length = transforms.length;\\n\\n while (++index < length) {\\n var data = transforms[index],\\n size = data.size;\\n\\n switch (data.type) {\\n case 'drop': start += size; break;\\n case 'dropRight': end -= size; break;\\n case 'take': end = nativeMin(end, start + size); break;\\n case 'takeRight': start = nativeMax(start, end - size); break;\\n }\\n }\\n return { 'start': start, 'end': end };\\n }\\n\\n /**\\n * Extracts wrapper details from the `source` body comment.\\n *\\n * @private\\n * @param {string} source The source to inspect.\\n * @returns {Array} Returns the wrapper details.\\n */\\n function getWrapDetails(source) {\\n var match = source.match(reWrapDetails);\\n return match ? match[1].split(reSplitDetails) : [];\\n }\\n\\n /**\\n * Checks if `path` exists on `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @param {Function} hasFunc The function to check properties.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n */\\n function hasPath(object, path, hasFunc) {\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length,\\n result = false;\\n\\n while (++index < length) {\\n var key = toKey(path[index]);\\n if (!(result = object != null && hasFunc(object, key))) {\\n break;\\n }\\n object = object[key];\\n }\\n if (result || ++index != length) {\\n return result;\\n }\\n length = object == null ? 0 : object.length;\\n return !!length && isLength(length) && isIndex(key, length) &&\\n (isArray(object) || isArguments(object));\\n }\\n\\n /**\\n * Initializes an array clone.\\n *\\n * @private\\n * @param {Array} array The array to clone.\\n * @returns {Array} Returns the initialized clone.\\n */\\n function initCloneArray(array) {\\n var length = array.length,\\n result = array.constructor(length);\\n\\n // Add properties assigned by `RegExp#exec`.\\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\\n result.index = array.index;\\n result.input = array.input;\\n }\\n return result;\\n }\\n\\n /**\\n * Initializes an object clone.\\n *\\n * @private\\n * @param {Object} object The object to clone.\\n * @returns {Object} Returns the initialized clone.\\n */\\n function initCloneObject(object) {\\n return (typeof object.constructor == 'function' && !isPrototype(object))\\n ? baseCreate(getPrototype(object))\\n : {};\\n }\\n\\n /**\\n * Initializes an object clone based on its `toStringTag`.\\n *\\n * **Note:** This function only supports cloning values with tags of\\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\\n *\\n * @private\\n * @param {Object} object The object to clone.\\n * @param {string} tag The `toStringTag` of the object to clone.\\n * @param {Function} cloneFunc The function to clone values.\\n * @param {boolean} [isDeep] Specify a deep clone.\\n * @returns {Object} Returns the initialized clone.\\n */\\n function initCloneByTag(object, tag, cloneFunc, isDeep) {\\n var Ctor = object.constructor;\\n switch (tag) {\\n case arrayBufferTag:\\n return cloneArrayBuffer(object);\\n\\n case boolTag:\\n case dateTag:\\n return new Ctor(+object);\\n\\n case dataViewTag:\\n return cloneDataView(object, isDeep);\\n\\n case float32Tag: case float64Tag:\\n case int8Tag: case int16Tag: case int32Tag:\\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\\n return cloneTypedArray(object, isDeep);\\n\\n case mapTag:\\n return cloneMap(object, isDeep, cloneFunc);\\n\\n case numberTag:\\n case stringTag:\\n return new Ctor(object);\\n\\n case regexpTag:\\n return cloneRegExp(object);\\n\\n case setTag:\\n return cloneSet(object, isDeep, cloneFunc);\\n\\n case symbolTag:\\n return cloneSymbol(object);\\n }\\n }\\n\\n /**\\n * Inserts wrapper `details` in a comment at the top of the `source` body.\\n *\\n * @private\\n * @param {string} source The source to modify.\\n * @returns {Array} details The details to insert.\\n * @returns {string} Returns the modified source.\\n */\\n function insertWrapDetails(source, details) {\\n var length = details.length;\\n if (!length) {\\n return source;\\n }\\n var lastIndex = length - 1;\\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\\n details = details.join(length > 2 ? ', ' : ' ');\\n return source.replace(reWrapComment, '{\\\\n/* [wrapped with ' + details + '] */\\\\n');\\n }\\n\\n /**\\n * Checks if `value` is a flattenable `arguments` object or array.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\\n */\\n function isFlattenable(value) {\\n return isArray(value) || isArguments(value) ||\\n !!(spreadableSymbol && value && value[spreadableSymbol]);\\n }\\n\\n /**\\n * Checks if `value` is a valid array-like index.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\\n */\\n function isIndex(value, length) {\\n length = length == null ? MAX_SAFE_INTEGER : length;\\n return !!length &&\\n (typeof value == 'number' || reIsUint.test(value)) &&\\n (value > -1 && value % 1 == 0 && value < length);\\n }\\n\\n /**\\n * Checks if the given arguments are from an iteratee call.\\n *\\n * @private\\n * @param {*} value The potential iteratee value argument.\\n * @param {*} index The potential iteratee index or key argument.\\n * @param {*} object The potential iteratee object argument.\\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\\n * else `false`.\\n */\\n function isIterateeCall(value, index, object) {\\n if (!isObject(object)) {\\n return false;\\n }\\n var type = typeof index;\\n if (type == 'number'\\n ? (isArrayLike(object) && isIndex(index, object.length))\\n : (type == 'string' && index in object)\\n ) {\\n return eq(object[index], value);\\n }\\n return false;\\n }\\n\\n /**\\n * Checks if `value` is a property name and not a property path.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @param {Object} [object] The object to query keys on.\\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\\n */\\n function isKey(value, object) {\\n if (isArray(value)) {\\n return false;\\n }\\n var type = typeof value;\\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\\n value == null || isSymbol(value)) {\\n return true;\\n }\\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\\n (object != null && value in Object(object));\\n }\\n\\n /**\\n * Checks if `value` is suitable for use as unique object key.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\\n */\\n function isKeyable(value) {\\n var type = typeof value;\\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\\n ? (value !== '__proto__')\\n : (value === null);\\n }\\n\\n /**\\n * Checks if `func` has a lazy counterpart.\\n *\\n * @private\\n * @param {Function} func The function to check.\\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\\n * else `false`.\\n */\\n function isLaziable(func) {\\n var funcName = getFuncName(func),\\n other = lodash[funcName];\\n\\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\\n return false;\\n }\\n if (func === other) {\\n return true;\\n }\\n var data = getData(other);\\n return !!data && func === data[0];\\n }\\n\\n /**\\n * Checks if `func` has its source masked.\\n *\\n * @private\\n * @param {Function} func The function to check.\\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\\n */\\n function isMasked(func) {\\n return !!maskSrcKey && (maskSrcKey in func);\\n }\\n\\n /**\\n * Checks if `func` is capable of being masked.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\\n */\\n var isMaskable = coreJsData ? isFunction : stubFalse;\\n\\n /**\\n * Checks if `value` is likely a prototype object.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\\n */\\n function isPrototype(value) {\\n var Ctor = value && value.constructor,\\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\\n\\n return value === proto;\\n }\\n\\n /**\\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\\n *\\n * @private\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` if suitable for strict\\n * equality comparisons, else `false`.\\n */\\n function isStrictComparable(value) {\\n return value === value && !isObject(value);\\n }\\n\\n /**\\n * A specialized version of `matchesProperty` for source values suitable\\n * for strict equality comparisons, i.e. `===`.\\n *\\n * @private\\n * @param {string} key The key of the property to get.\\n * @param {*} srcValue The value to match.\\n * @returns {Function} Returns the new spec function.\\n */\\n function matchesStrictComparable(key, srcValue) {\\n return function(object) {\\n if (object == null) {\\n return false;\\n }\\n return object[key] === srcValue &&\\n (srcValue !== undefined || (key in Object(object)));\\n };\\n }\\n\\n /**\\n * A specialized version of `_.memoize` which clears the memoized function's\\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\\n *\\n * @private\\n * @param {Function} func The function to have its output memoized.\\n * @returns {Function} Returns the new memoized function.\\n */\\n function memoizeCapped(func) {\\n var result = memoize(func, function(key) {\\n if (cache.size === MAX_MEMOIZE_SIZE) {\\n cache.clear();\\n }\\n return key;\\n });\\n\\n var cache = result.cache;\\n return result;\\n }\\n\\n /**\\n * Merges the function metadata of `source` into `data`.\\n *\\n * Merging metadata reduces the number of wrappers used to invoke a function.\\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\\n * may be applied regardless of execution order. Methods like `_.ary` and\\n * `_.rearg` modify function arguments, making the order in which they are\\n * executed important, preventing the merging of metadata. However, we make\\n * an exception for a safe combined case where curried functions have `_.ary`\\n * and or `_.rearg` applied.\\n *\\n * @private\\n * @param {Array} data The destination metadata.\\n * @param {Array} source The source metadata.\\n * @returns {Array} Returns `data`.\\n */\\n function mergeData(data, source) {\\n var bitmask = data[1],\\n srcBitmask = source[1],\\n newBitmask = bitmask | srcBitmask,\\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\\n\\n var isCombo =\\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\\n\\n // Exit early if metadata can't be merged.\\n if (!(isCommon || isCombo)) {\\n return data;\\n }\\n // Use source `thisArg` if available.\\n if (srcBitmask & WRAP_BIND_FLAG) {\\n data[2] = source[2];\\n // Set when currying a bound function.\\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\\n }\\n // Compose partial arguments.\\n var value = source[3];\\n if (value) {\\n var partials = data[3];\\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\\n }\\n // Compose partial right arguments.\\n value = source[5];\\n if (value) {\\n partials = data[5];\\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\\n }\\n // Use source `argPos` if available.\\n value = source[7];\\n if (value) {\\n data[7] = value;\\n }\\n // Use source `ary` if it's smaller.\\n if (srcBitmask & WRAP_ARY_FLAG) {\\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\\n }\\n // Use source `arity` if one is not provided.\\n if (data[9] == null) {\\n data[9] = source[9];\\n }\\n // Use source `func` and merge bitmasks.\\n data[0] = source[0];\\n data[1] = newBitmask;\\n\\n return data;\\n }\\n\\n /**\\n * This function is like\\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\\n * except that it includes inherited enumerable properties.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n */\\n function nativeKeysIn(object) {\\n var result = [];\\n if (object != null) {\\n for (var key in Object(object)) {\\n result.push(key);\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Converts `value` to a string using `Object.prototype.toString`.\\n *\\n * @private\\n * @param {*} value The value to convert.\\n * @returns {string} Returns the converted string.\\n */\\n function objectToString(value) {\\n return nativeObjectToString.call(value);\\n }\\n\\n /**\\n * A specialized version of `baseRest` which transforms the rest array.\\n *\\n * @private\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @param {Function} transform The rest array transform.\\n * @returns {Function} Returns the new function.\\n */\\n function overRest(func, start, transform) {\\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\\n return function() {\\n var args = arguments,\\n index = -1,\\n length = nativeMax(args.length - start, 0),\\n array = Array(length);\\n\\n while (++index < length) {\\n array[index] = args[start + index];\\n }\\n index = -1;\\n var otherArgs = Array(start + 1);\\n while (++index < start) {\\n otherArgs[index] = args[index];\\n }\\n otherArgs[start] = transform(array);\\n return apply(func, this, otherArgs);\\n };\\n }\\n\\n /**\\n * Gets the parent value at `path` of `object`.\\n *\\n * @private\\n * @param {Object} object The object to query.\\n * @param {Array} path The path to get the parent value of.\\n * @returns {*} Returns the parent value.\\n */\\n function parent(object, path) {\\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\\n }\\n\\n /**\\n * Reorder `array` according to the specified indexes where the element at\\n * the first index is assigned as the first element, the element at\\n * the second index is assigned as the second element, and so on.\\n *\\n * @private\\n * @param {Array} array The array to reorder.\\n * @param {Array} indexes The arranged array indexes.\\n * @returns {Array} Returns `array`.\\n */\\n function reorder(array, indexes) {\\n var arrLength = array.length,\\n length = nativeMin(indexes.length, arrLength),\\n oldArray = copyArray(array);\\n\\n while (length--) {\\n var index = indexes[length];\\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\\n }\\n return array;\\n }\\n\\n /**\\n * Sets metadata for `func`.\\n *\\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\\n * period of time, it will trip its breaker and transition to an identity\\n * function to avoid garbage collection pauses in V8. See\\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\\n * for more details.\\n *\\n * @private\\n * @param {Function} func The function to associate metadata with.\\n * @param {*} data The metadata.\\n * @returns {Function} Returns `func`.\\n */\\n var setData = shortOut(baseSetData);\\n\\n /**\\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\\n *\\n * @private\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @returns {number|Object} Returns the timer id or timeout object.\\n */\\n var setTimeout = ctxSetTimeout || function(func, wait) {\\n return root.setTimeout(func, wait);\\n };\\n\\n /**\\n * Sets the `toString` method of `func` to return `string`.\\n *\\n * @private\\n * @param {Function} func The function to modify.\\n * @param {Function} string The `toString` result.\\n * @returns {Function} Returns `func`.\\n */\\n var setToString = shortOut(baseSetToString);\\n\\n /**\\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\\n * with wrapper details in a comment at the top of the source body.\\n *\\n * @private\\n * @param {Function} wrapper The function to modify.\\n * @param {Function} reference The reference function.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @returns {Function} Returns `wrapper`.\\n */\\n function setWrapToString(wrapper, reference, bitmask) {\\n var source = (reference + '');\\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\\n }\\n\\n /**\\n * Creates a function that'll short out and invoke `identity` instead\\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\\n * milliseconds.\\n *\\n * @private\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new shortable function.\\n */\\n function shortOut(func) {\\n var count = 0,\\n lastCalled = 0;\\n\\n return function() {\\n var stamp = nativeNow(),\\n remaining = HOT_SPAN - (stamp - lastCalled);\\n\\n lastCalled = stamp;\\n if (remaining > 0) {\\n if (++count >= HOT_COUNT) {\\n return arguments[0];\\n }\\n } else {\\n count = 0;\\n }\\n return func.apply(undefined, arguments);\\n };\\n }\\n\\n /**\\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\\n *\\n * @private\\n * @param {Array} array The array to shuffle.\\n * @param {number} [size=array.length] The size of `array`.\\n * @returns {Array} Returns `array`.\\n */\\n function shuffleSelf(array, size) {\\n var index = -1,\\n length = array.length,\\n lastIndex = length - 1;\\n\\n size = size === undefined ? length : size;\\n while (++index < size) {\\n var rand = baseRandom(index, lastIndex),\\n value = array[rand];\\n\\n array[rand] = array[index];\\n array[index] = value;\\n }\\n array.length = size;\\n return array;\\n }\\n\\n /**\\n * Converts `string` to a property path array.\\n *\\n * @private\\n * @param {string} string The string to convert.\\n * @returns {Array} Returns the property path array.\\n */\\n var stringToPath = memoizeCapped(function(string) {\\n var result = [];\\n if (reLeadingDot.test(string)) {\\n result.push('');\\n }\\n string.replace(rePropName, function(match, number, quote, string) {\\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\\n });\\n return result;\\n });\\n\\n /**\\n * Converts `value` to a string key if it's not a string or symbol.\\n *\\n * @private\\n * @param {*} value The value to inspect.\\n * @returns {string|symbol} Returns the key.\\n */\\n function toKey(value) {\\n if (typeof value == 'string' || isSymbol(value)) {\\n return value;\\n }\\n var result = (value + '');\\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\\n }\\n\\n /**\\n * Converts `func` to its source code.\\n *\\n * @private\\n * @param {Function} func The function to convert.\\n * @returns {string} Returns the source code.\\n */\\n function toSource(func) {\\n if (func != null) {\\n try {\\n return funcToString.call(func);\\n } catch (e) {}\\n try {\\n return (func + '');\\n } catch (e) {}\\n }\\n return '';\\n }\\n\\n /**\\n * Updates wrapper `details` based on `bitmask` flags.\\n *\\n * @private\\n * @returns {Array} details The details to modify.\\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\\n * @returns {Array} Returns `details`.\\n */\\n function updateWrapDetails(details, bitmask) {\\n arrayEach(wrapFlags, function(pair) {\\n var value = '_.' + pair[0];\\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\\n details.push(value);\\n }\\n });\\n return details.sort();\\n }\\n\\n /**\\n * Creates a clone of `wrapper`.\\n *\\n * @private\\n * @param {Object} wrapper The wrapper to clone.\\n * @returns {Object} Returns the cloned wrapper.\\n */\\n function wrapperClone(wrapper) {\\n if (wrapper instanceof LazyWrapper) {\\n return wrapper.clone();\\n }\\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\\n result.__actions__ = copyArray(wrapper.__actions__);\\n result.__index__ = wrapper.__index__;\\n result.__values__ = wrapper.__values__;\\n return result;\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an array of elements split into groups the length of `size`.\\n * If `array` can't be split evenly, the final chunk will be the remaining\\n * elements.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to process.\\n * @param {number} [size=1] The length of each chunk\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the new array of chunks.\\n * @example\\n *\\n * _.chunk(['a', 'b', 'c', 'd'], 2);\\n * // => [['a', 'b'], ['c', 'd']]\\n *\\n * _.chunk(['a', 'b', 'c', 'd'], 3);\\n * // => [['a', 'b', 'c'], ['d']]\\n */\\n function chunk(array, size, guard) {\\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\\n size = 1;\\n } else {\\n size = nativeMax(toInteger(size), 0);\\n }\\n var length = array == null ? 0 : array.length;\\n if (!length || size < 1) {\\n return [];\\n }\\n var index = 0,\\n resIndex = 0,\\n result = Array(nativeCeil(length / size));\\n\\n while (index < length) {\\n result[resIndex++] = baseSlice(array, index, (index += size));\\n }\\n return result;\\n }\\n\\n /**\\n * Creates an array with all falsey values removed. The values `false`, `null`,\\n * `0`, `\\\"\\\"`, `undefined`, and `NaN` are falsey.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to compact.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.compact([0, 1, false, 2, '', 3]);\\n * // => [1, 2, 3]\\n */\\n function compact(array) {\\n var index = -1,\\n length = array == null ? 0 : array.length,\\n resIndex = 0,\\n result = [];\\n\\n while (++index < length) {\\n var value = array[index];\\n if (value) {\\n result[resIndex++] = value;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * Creates a new array concatenating `array` with any additional arrays\\n * and/or values.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to concatenate.\\n * @param {...*} [values] The values to concatenate.\\n * @returns {Array} Returns the new concatenated array.\\n * @example\\n *\\n * var array = [1];\\n * var other = _.concat(array, 2, [3], [[4]]);\\n *\\n * console.log(other);\\n * // => [1, 2, 3, [4]]\\n *\\n * console.log(array);\\n * // => [1]\\n */\\n function concat() {\\n var length = arguments.length;\\n if (!length) {\\n return [];\\n }\\n var args = Array(length - 1),\\n array = arguments[0],\\n index = length;\\n\\n while (index--) {\\n args[index - 1] = arguments[index];\\n }\\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\\n }\\n\\n /**\\n * Creates an array of `array` values not included in the other given arrays\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. The order and references of result values are\\n * determined by the first array.\\n *\\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.without, _.xor\\n * @example\\n *\\n * _.difference([2, 1], [2, 3]);\\n * // => [1]\\n */\\n var difference = baseRest(function(array, values) {\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.difference` except that it accepts `iteratee` which\\n * is invoked for each element of `array` and `values` to generate the criterion\\n * by which they're compared. The order and references of result values are\\n * determined by the first array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\\n * // => [{ 'x': 2 }]\\n */\\n var differenceBy = baseRest(function(array, values) {\\n var iteratee = last(values);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.difference` except that it accepts `comparator`\\n * which is invoked to compare elements of `array` to `values`. The order and\\n * references of result values are determined by the first array. The comparator\\n * is invoked with two arguments: (arrVal, othVal).\\n *\\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...Array} [values] The values to exclude.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n *\\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\\n * // => [{ 'x': 2, 'y': 1 }]\\n */\\n var differenceWith = baseRest(function(array, values) {\\n var comparator = last(values);\\n if (isArrayLikeObject(comparator)) {\\n comparator = undefined;\\n }\\n return isArrayLikeObject(array)\\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\\n : [];\\n });\\n\\n /**\\n * Creates a slice of `array` with `n` elements dropped from the beginning.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to drop.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.drop([1, 2, 3]);\\n * // => [2, 3]\\n *\\n * _.drop([1, 2, 3], 2);\\n * // => [3]\\n *\\n * _.drop([1, 2, 3], 5);\\n * // => []\\n *\\n * _.drop([1, 2, 3], 0);\\n * // => [1, 2, 3]\\n */\\n function drop(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n return baseSlice(array, n < 0 ? 0 : n, length);\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements dropped from the end.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to drop.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.dropRight([1, 2, 3]);\\n * // => [1, 2]\\n *\\n * _.dropRight([1, 2, 3], 2);\\n * // => [1]\\n *\\n * _.dropRight([1, 2, 3], 5);\\n * // => []\\n *\\n * _.dropRight([1, 2, 3], 0);\\n * // => [1, 2, 3]\\n */\\n function dropRight(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n n = length - n;\\n return baseSlice(array, 0, n < 0 ? 0 : n);\\n }\\n\\n /**\\n * Creates a slice of `array` excluding elements dropped from the end.\\n * Elements are dropped until `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.dropRightWhile(users, function(o) { return !o.active; });\\n * // => objects for ['barney']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.dropRightWhile(users, ['active', false]);\\n * // => objects for ['barney']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.dropRightWhile(users, 'active');\\n * // => objects for ['barney', 'fred', 'pebbles']\\n */\\n function dropRightWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\\n : [];\\n }\\n\\n /**\\n * Creates a slice of `array` excluding elements dropped from the beginning.\\n * Elements are dropped until `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.dropWhile(users, function(o) { return !o.active; });\\n * // => objects for ['pebbles']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.dropWhile(users, ['active', false]);\\n * // => objects for ['pebbles']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.dropWhile(users, 'active');\\n * // => objects for ['barney', 'fred', 'pebbles']\\n */\\n function dropWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), true)\\n : [];\\n }\\n\\n /**\\n * Fills elements of `array` with `value` from `start` up to, but not\\n * including, `end`.\\n *\\n * **Note:** This method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.2.0\\n * @category Array\\n * @param {Array} array The array to fill.\\n * @param {*} value The value to fill `array` with.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _.fill(array, 'a');\\n * console.log(array);\\n * // => ['a', 'a', 'a']\\n *\\n * _.fill(Array(3), 2);\\n * // => [2, 2, 2]\\n *\\n * _.fill([4, 6, 8, 10], '*', 1, 3);\\n * // => [4, '*', '*', 10]\\n */\\n function fill(array, value, start, end) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\\n start = 0;\\n end = length;\\n }\\n return baseFill(array, value, start, end);\\n }\\n\\n /**\\n * This method is like `_.find` except that it returns the index of the first\\n * element `predicate` returns truthy for instead of the element itself.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {number} Returns the index of the found element, else `-1`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\\n * // => 0\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findIndex(users, { 'user': 'fred', 'active': false });\\n * // => 1\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findIndex(users, ['active', false]);\\n * // => 0\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findIndex(users, 'active');\\n * // => 2\\n */\\n function findIndex(array, predicate, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\\n if (index < 0) {\\n index = nativeMax(length + index, 0);\\n }\\n return baseFindIndex(array, getIteratee(predicate, 3), index);\\n }\\n\\n /**\\n * This method is like `_.findIndex` except that it iterates over elements\\n * of `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=array.length-1] The index to search from.\\n * @returns {number} Returns the index of the found element, else `-1`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\\n * // => 2\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\\n * // => 0\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findLastIndex(users, ['active', false]);\\n * // => 2\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findLastIndex(users, 'active');\\n * // => 0\\n */\\n function findLastIndex(array, predicate, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = length - 1;\\n if (fromIndex !== undefined) {\\n index = toInteger(fromIndex);\\n index = fromIndex < 0\\n ? nativeMax(length + index, 0)\\n : nativeMin(index, length - 1);\\n }\\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\\n }\\n\\n /**\\n * Flattens `array` a single level deep.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * _.flatten([1, [2, [3, [4]], 5]]);\\n * // => [1, 2, [3, [4]], 5]\\n */\\n function flatten(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseFlatten(array, 1) : [];\\n }\\n\\n /**\\n * Recursively flattens `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\\n * // => [1, 2, 3, 4, 5]\\n */\\n function flattenDeep(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseFlatten(array, INFINITY) : [];\\n }\\n\\n /**\\n * Recursively flatten `array` up to `depth` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.4.0\\n * @category Array\\n * @param {Array} array The array to flatten.\\n * @param {number} [depth=1] The maximum recursion depth.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * var array = [1, [2, [3, [4]], 5]];\\n *\\n * _.flattenDepth(array, 1);\\n * // => [1, 2, [3, [4]], 5]\\n *\\n * _.flattenDepth(array, 2);\\n * // => [1, 2, 3, [4], 5]\\n */\\n function flattenDepth(array, depth) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n depth = depth === undefined ? 1 : toInteger(depth);\\n return baseFlatten(array, depth);\\n }\\n\\n /**\\n * The inverse of `_.toPairs`; this method returns an object composed\\n * from key-value `pairs`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} pairs The key-value pairs.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.fromPairs([['a', 1], ['b', 2]]);\\n * // => { 'a': 1, 'b': 2 }\\n */\\n function fromPairs(pairs) {\\n var index = -1,\\n length = pairs == null ? 0 : pairs.length,\\n result = {};\\n\\n while (++index < length) {\\n var pair = pairs[index];\\n result[pair[0]] = pair[1];\\n }\\n return result;\\n }\\n\\n /**\\n * Gets the first element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @alias first\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {*} Returns the first element of `array`.\\n * @example\\n *\\n * _.head([1, 2, 3]);\\n * // => 1\\n *\\n * _.head([]);\\n * // => undefined\\n */\\n function head(array) {\\n return (array && array.length) ? array[0] : undefined;\\n }\\n\\n /**\\n * Gets the index at which the first occurrence of `value` is found in `array`\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. If `fromIndex` is negative, it's used as the\\n * offset from the end of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.indexOf([1, 2, 1, 2], 2);\\n * // => 1\\n *\\n * // Search from the `fromIndex`.\\n * _.indexOf([1, 2, 1, 2], 2, 2);\\n * // => 3\\n */\\n function indexOf(array, value, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\\n if (index < 0) {\\n index = nativeMax(length + index, 0);\\n }\\n return baseIndexOf(array, value, index);\\n }\\n\\n /**\\n * Gets all but the last element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.initial([1, 2, 3]);\\n * // => [1, 2]\\n */\\n function initial(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseSlice(array, 0, -1) : [];\\n }\\n\\n /**\\n * Creates an array of unique values that are included in all given arrays\\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons. The order and references of result values are\\n * determined by the first array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * _.intersection([2, 1], [2, 3]);\\n * // => [2]\\n */\\n var intersection = baseRest(function(arrays) {\\n var mapped = arrayMap(arrays, castArrayLikeObject);\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped)\\n : [];\\n });\\n\\n /**\\n * This method is like `_.intersection` except that it accepts `iteratee`\\n * which is invoked for each element of each `arrays` to generate the criterion\\n * by which they're compared. The order and references of result values are\\n * determined by the first array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [2.1]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }]\\n */\\n var intersectionBy = baseRest(function(arrays) {\\n var iteratee = last(arrays),\\n mapped = arrayMap(arrays, castArrayLikeObject);\\n\\n if (iteratee === last(mapped)) {\\n iteratee = undefined;\\n } else {\\n mapped.pop();\\n }\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\\n : [];\\n });\\n\\n /**\\n * This method is like `_.intersection` except that it accepts `comparator`\\n * which is invoked to compare elements of `arrays`. The order and references\\n * of result values are determined by the first array. The comparator is\\n * invoked with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of intersecting values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.intersectionWith(objects, others, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }]\\n */\\n var intersectionWith = baseRest(function(arrays) {\\n var comparator = last(arrays),\\n mapped = arrayMap(arrays, castArrayLikeObject);\\n\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n if (comparator) {\\n mapped.pop();\\n }\\n return (mapped.length && mapped[0] === arrays[0])\\n ? baseIntersection(mapped, undefined, comparator)\\n : [];\\n });\\n\\n /**\\n * Converts all elements in `array` into a string separated by `separator`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to convert.\\n * @param {string} [separator=','] The element separator.\\n * @returns {string} Returns the joined string.\\n * @example\\n *\\n * _.join(['a', 'b', 'c'], '~');\\n * // => 'a~b~c'\\n */\\n function join(array, separator) {\\n return array == null ? '' : nativeJoin.call(array, separator);\\n }\\n\\n /**\\n * Gets the last element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {*} Returns the last element of `array`.\\n * @example\\n *\\n * _.last([1, 2, 3]);\\n * // => 3\\n */\\n function last(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? array[length - 1] : undefined;\\n }\\n\\n /**\\n * This method is like `_.indexOf` except that it iterates over elements of\\n * `array` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=array.length-1] The index to search from.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.lastIndexOf([1, 2, 1, 2], 2);\\n * // => 3\\n *\\n * // Search from the `fromIndex`.\\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\\n * // => 1\\n */\\n function lastIndexOf(array, value, fromIndex) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return -1;\\n }\\n var index = length;\\n if (fromIndex !== undefined) {\\n index = toInteger(fromIndex);\\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\\n }\\n return value === value\\n ? strictLastIndexOf(array, value, index)\\n : baseFindIndex(array, baseIsNaN, index, true);\\n }\\n\\n /**\\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\\n * element from the end is returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.11.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=0] The index of the element to return.\\n * @returns {*} Returns the nth element of `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'd'];\\n *\\n * _.nth(array, 1);\\n * // => 'b'\\n *\\n * _.nth(array, -2);\\n * // => 'c';\\n */\\n function nth(array, n) {\\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\\n }\\n\\n /**\\n * Removes all given values from `array` using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\\n * to remove elements from an array by predicate.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {...*} [values] The values to remove.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\\n *\\n * _.pull(array, 'a', 'c');\\n * console.log(array);\\n * // => ['b', 'b']\\n */\\n var pull = baseRest(pullAll);\\n\\n /**\\n * This method is like `_.pull` except that it accepts an array of values to remove.\\n *\\n * **Note:** Unlike `_.difference`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\\n *\\n * _.pullAll(array, ['a', 'c']);\\n * console.log(array);\\n * // => ['b', 'b']\\n */\\n function pullAll(array, values) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values)\\n : array;\\n }\\n\\n /**\\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\\n * invoked for each element of `array` and `values` to generate the criterion\\n * by which they're compared. The iteratee is invoked with one argument: (value).\\n *\\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\\n *\\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\\n * console.log(array);\\n * // => [{ 'x': 2 }]\\n */\\n function pullAllBy(array, values, iteratee) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values, getIteratee(iteratee, 2))\\n : array;\\n }\\n\\n /**\\n * This method is like `_.pullAll` except that it accepts `comparator` which\\n * is invoked to compare elements of `array` to `values`. The comparator is\\n * invoked with two arguments: (arrVal, othVal).\\n *\\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Array} values The values to remove.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\\n *\\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\\n * console.log(array);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\\n */\\n function pullAllWith(array, values, comparator) {\\n return (array && array.length && values && values.length)\\n ? basePullAll(array, values, undefined, comparator)\\n : array;\\n }\\n\\n /**\\n * Removes elements from `array` corresponding to `indexes` and returns an\\n * array of removed elements.\\n *\\n * **Note:** Unlike `_.at`, this method mutates `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\\n * @returns {Array} Returns the new array of removed elements.\\n * @example\\n *\\n * var array = ['a', 'b', 'c', 'd'];\\n * var pulled = _.pullAt(array, [1, 3]);\\n *\\n * console.log(array);\\n * // => ['a', 'c']\\n *\\n * console.log(pulled);\\n * // => ['b', 'd']\\n */\\n var pullAt = flatRest(function(array, indexes) {\\n var length = array == null ? 0 : array.length,\\n result = baseAt(array, indexes);\\n\\n basePullAt(array, arrayMap(indexes, function(index) {\\n return isIndex(index, length) ? +index : index;\\n }).sort(compareAscending));\\n\\n return result;\\n });\\n\\n /**\\n * Removes all elements from `array` that `predicate` returns truthy for\\n * and returns an array of the removed elements. The predicate is invoked\\n * with three arguments: (value, index, array).\\n *\\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\\n * to pull elements from an array by value.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new array of removed elements.\\n * @example\\n *\\n * var array = [1, 2, 3, 4];\\n * var evens = _.remove(array, function(n) {\\n * return n % 2 == 0;\\n * });\\n *\\n * console.log(array);\\n * // => [1, 3]\\n *\\n * console.log(evens);\\n * // => [2, 4]\\n */\\n function remove(array, predicate) {\\n var result = [];\\n if (!(array && array.length)) {\\n return result;\\n }\\n var index = -1,\\n indexes = [],\\n length = array.length;\\n\\n predicate = getIteratee(predicate, 3);\\n while (++index < length) {\\n var value = array[index];\\n if (predicate(value, index, array)) {\\n result.push(value);\\n indexes.push(index);\\n }\\n }\\n basePullAt(array, indexes);\\n return result;\\n }\\n\\n /**\\n * Reverses `array` so that the first element becomes the last, the second\\n * element becomes the second to last, and so on.\\n *\\n * **Note:** This method mutates `array` and is based on\\n * [`Array#reverse`](https://mdn.io/Array/reverse).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to modify.\\n * @returns {Array} Returns `array`.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _.reverse(array);\\n * // => [3, 2, 1]\\n *\\n * console.log(array);\\n * // => [3, 2, 1]\\n */\\n function reverse(array) {\\n return array == null ? array : nativeReverse.call(array);\\n }\\n\\n /**\\n * Creates a slice of `array` from `start` up to, but not including, `end`.\\n *\\n * **Note:** This method is used instead of\\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\\n * returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to slice.\\n * @param {number} [start=0] The start position.\\n * @param {number} [end=array.length] The end position.\\n * @returns {Array} Returns the slice of `array`.\\n */\\n function slice(array, start, end) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\\n start = 0;\\n end = length;\\n }\\n else {\\n start = start == null ? 0 : toInteger(start);\\n end = end === undefined ? length : toInteger(end);\\n }\\n return baseSlice(array, start, end);\\n }\\n\\n /**\\n * Uses a binary search to determine the lowest index at which `value`\\n * should be inserted into `array` in order to maintain its sort order.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * _.sortedIndex([30, 50], 40);\\n * // => 1\\n */\\n function sortedIndex(array, value) {\\n return baseSortedIndex(array, value);\\n }\\n\\n /**\\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\\n * which is invoked for `value` and each element of `array` to compute their\\n * sort ranking. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\\n *\\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\\n * // => 0\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\\n * // => 0\\n */\\n function sortedIndexBy(array, value, iteratee) {\\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\\n }\\n\\n /**\\n * This method is like `_.indexOf` except that it performs a binary\\n * search on a sorted `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\\n * // => 1\\n */\\n function sortedIndexOf(array, value) {\\n var length = array == null ? 0 : array.length;\\n if (length) {\\n var index = baseSortedIndex(array, value);\\n if (index < length && eq(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * This method is like `_.sortedIndex` except that it returns the highest\\n * index at which `value` should be inserted into `array` in order to\\n * maintain its sort order.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\\n * // => 4\\n */\\n function sortedLastIndex(array, value) {\\n return baseSortedIndex(array, value, true);\\n }\\n\\n /**\\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\\n * which is invoked for `value` and each element of `array` to compute their\\n * sort ranking. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The sorted array to inspect.\\n * @param {*} value The value to evaluate.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {number} Returns the index at which `value` should be inserted\\n * into `array`.\\n * @example\\n *\\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\\n *\\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\\n * // => 1\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\\n * // => 1\\n */\\n function sortedLastIndexBy(array, value, iteratee) {\\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\\n }\\n\\n /**\\n * This method is like `_.lastIndexOf` except that it performs a binary\\n * search on a sorted `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {*} value The value to search for.\\n * @returns {number} Returns the index of the matched value, else `-1`.\\n * @example\\n *\\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\\n * // => 3\\n */\\n function sortedLastIndexOf(array, value) {\\n var length = array == null ? 0 : array.length;\\n if (length) {\\n var index = baseSortedIndex(array, value, true) - 1;\\n if (eq(array[index], value)) {\\n return index;\\n }\\n }\\n return -1;\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it's designed and optimized\\n * for sorted arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.sortedUniq([1, 1, 2]);\\n * // => [1, 2]\\n */\\n function sortedUniq(array) {\\n return (array && array.length)\\n ? baseSortedUniq(array)\\n : [];\\n }\\n\\n /**\\n * This method is like `_.uniqBy` except that it's designed and optimized\\n * for sorted arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\\n * // => [1.1, 2.3]\\n */\\n function sortedUniqBy(array, iteratee) {\\n return (array && array.length)\\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\\n : [];\\n }\\n\\n /**\\n * Gets all but the first element of `array`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.tail([1, 2, 3]);\\n * // => [2, 3]\\n */\\n function tail(array) {\\n var length = array == null ? 0 : array.length;\\n return length ? baseSlice(array, 1, length) : [];\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements taken from the beginning.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to take.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.take([1, 2, 3]);\\n * // => [1]\\n *\\n * _.take([1, 2, 3], 2);\\n * // => [1, 2]\\n *\\n * _.take([1, 2, 3], 5);\\n * // => [1, 2, 3]\\n *\\n * _.take([1, 2, 3], 0);\\n * // => []\\n */\\n function take(array, n, guard) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n return baseSlice(array, 0, n < 0 ? 0 : n);\\n }\\n\\n /**\\n * Creates a slice of `array` with `n` elements taken from the end.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {number} [n=1] The number of elements to take.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * _.takeRight([1, 2, 3]);\\n * // => [3]\\n *\\n * _.takeRight([1, 2, 3], 2);\\n * // => [2, 3]\\n *\\n * _.takeRight([1, 2, 3], 5);\\n * // => [1, 2, 3]\\n *\\n * _.takeRight([1, 2, 3], 0);\\n * // => []\\n */\\n function takeRight(array, n, guard) {\\n var length = array == null ? 0 : array.length;\\n if (!length) {\\n return [];\\n }\\n n = (guard || n === undefined) ? 1 : toInteger(n);\\n n = length - n;\\n return baseSlice(array, n < 0 ? 0 : n, length);\\n }\\n\\n /**\\n * Creates a slice of `array` with elements taken from the end. Elements are\\n * taken until `predicate` returns falsey. The predicate is invoked with\\n * three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': false }\\n * ];\\n *\\n * _.takeRightWhile(users, function(o) { return !o.active; });\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\\n * // => objects for ['pebbles']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.takeRightWhile(users, ['active', false]);\\n * // => objects for ['fred', 'pebbles']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.takeRightWhile(users, 'active');\\n * // => []\\n */\\n function takeRightWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\\n : [];\\n }\\n\\n /**\\n * Creates a slice of `array` with elements taken from the beginning. Elements\\n * are taken until `predicate` returns falsey. The predicate is invoked with\\n * three arguments: (value, index, array).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Array\\n * @param {Array} array The array to query.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the slice of `array`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': false },\\n * { 'user': 'fred', 'active': false },\\n * { 'user': 'pebbles', 'active': true }\\n * ];\\n *\\n * _.takeWhile(users, function(o) { return !o.active; });\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.takeWhile(users, ['active', false]);\\n * // => objects for ['barney', 'fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.takeWhile(users, 'active');\\n * // => []\\n */\\n function takeWhile(array, predicate) {\\n return (array && array.length)\\n ? baseWhile(array, getIteratee(predicate, 3))\\n : [];\\n }\\n\\n /**\\n * Creates an array of unique values, in order, from all given arrays using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * _.union([2], [1, 2]);\\n * // => [2, 1]\\n */\\n var union = baseRest(function(arrays) {\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\\n });\\n\\n /**\\n * This method is like `_.union` except that it accepts `iteratee` which is\\n * invoked for each element of each `arrays` to generate the criterion by\\n * which uniqueness is computed. Result values are chosen from the first\\n * array in which the value occurs. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\\n * // => [2.1, 1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }, { 'x': 2 }]\\n */\\n var unionBy = baseRest(function(arrays) {\\n var iteratee = last(arrays);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\\n });\\n\\n /**\\n * This method is like `_.union` except that it accepts `comparator` which\\n * is invoked to compare elements of `arrays`. Result values are chosen from\\n * the first array in which the value occurs. The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of combined values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.unionWith(objects, others, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\\n */\\n var unionWith = baseRest(function(arrays) {\\n var comparator = last(arrays);\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\\n });\\n\\n /**\\n * Creates a duplicate-free version of an array, using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons, in which only the first occurrence of each element\\n * is kept. The order of result values is determined by the order they occur\\n * in the array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.uniq([2, 1, 2]);\\n * // => [2, 1]\\n */\\n function uniq(array) {\\n return (array && array.length) ? baseUniq(array) : [];\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it accepts `iteratee` which is\\n * invoked for each element in `array` to generate the criterion by which\\n * uniqueness is computed. The order of result values is determined by the\\n * order they occur in the array. The iteratee is invoked with one argument:\\n * (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\\n * // => [2.1, 1.2]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 1 }, { 'x': 2 }]\\n */\\n function uniqBy(array, iteratee) {\\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\\n }\\n\\n /**\\n * This method is like `_.uniq` except that it accepts `comparator` which\\n * is invoked to compare elements of `array`. The order of result values is\\n * determined by the order they occur in the array.The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new duplicate free array.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.uniqWith(objects, _.isEqual);\\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\\n */\\n function uniqWith(array, comparator) {\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\\n }\\n\\n /**\\n * This method is like `_.zip` except that it accepts an array of grouped\\n * elements and creates an array regrouping the elements to their pre-zip\\n * configuration.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.2.0\\n * @category Array\\n * @param {Array} array The array of grouped elements to process.\\n * @returns {Array} Returns the new array of regrouped elements.\\n * @example\\n *\\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\\n * // => [['a', 1, true], ['b', 2, false]]\\n *\\n * _.unzip(zipped);\\n * // => [['a', 'b'], [1, 2], [true, false]]\\n */\\n function unzip(array) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n var length = 0;\\n array = arrayFilter(array, function(group) {\\n if (isArrayLikeObject(group)) {\\n length = nativeMax(group.length, length);\\n return true;\\n }\\n });\\n return baseTimes(length, function(index) {\\n return arrayMap(array, baseProperty(index));\\n });\\n }\\n\\n /**\\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\\n * how regrouped values should be combined. The iteratee is invoked with the\\n * elements of each group: (...group).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Array\\n * @param {Array} array The array of grouped elements to process.\\n * @param {Function} [iteratee=_.identity] The function to combine\\n * regrouped values.\\n * @returns {Array} Returns the new array of regrouped elements.\\n * @example\\n *\\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\\n * // => [[1, 10, 100], [2, 20, 200]]\\n *\\n * _.unzipWith(zipped, _.add);\\n * // => [3, 30, 300]\\n */\\n function unzipWith(array, iteratee) {\\n if (!(array && array.length)) {\\n return [];\\n }\\n var result = unzip(array);\\n if (iteratee == null) {\\n return result;\\n }\\n return arrayMap(result, function(group) {\\n return apply(iteratee, undefined, group);\\n });\\n }\\n\\n /**\\n * Creates an array excluding all given values using\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * for equality comparisons.\\n *\\n * **Note:** Unlike `_.pull`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {Array} array The array to inspect.\\n * @param {...*} [values] The values to exclude.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.difference, _.xor\\n * @example\\n *\\n * _.without([2, 1, 2, 3], 1, 2);\\n * // => [3]\\n */\\n var without = baseRest(function(array, values) {\\n return isArrayLikeObject(array)\\n ? baseDifference(array, values)\\n : [];\\n });\\n\\n /**\\n * Creates an array of unique values that is the\\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\\n * of the given arrays. The order of result values is determined by the order\\n * they occur in the arrays.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @returns {Array} Returns the new array of filtered values.\\n * @see _.difference, _.without\\n * @example\\n *\\n * _.xor([2, 1], [2, 3]);\\n * // => [1, 3]\\n */\\n var xor = baseRest(function(arrays) {\\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\\n });\\n\\n /**\\n * This method is like `_.xor` except that it accepts `iteratee` which is\\n * invoked for each element of each `arrays` to generate the criterion by\\n * which by which they're compared. The order of result values is determined\\n * by the order they occur in the arrays. The iteratee is invoked with one\\n * argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\\n * // => [1.2, 3.4]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\\n * // => [{ 'x': 2 }]\\n */\\n var xorBy = baseRest(function(arrays) {\\n var iteratee = last(arrays);\\n if (isArrayLikeObject(iteratee)) {\\n iteratee = undefined;\\n }\\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\\n });\\n\\n /**\\n * This method is like `_.xor` except that it accepts `comparator` which is\\n * invoked to compare elements of `arrays`. The order of result values is\\n * determined by the order they occur in the arrays. The comparator is invoked\\n * with two arguments: (arrVal, othVal).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to inspect.\\n * @param {Function} [comparator] The comparator invoked per element.\\n * @returns {Array} Returns the new array of filtered values.\\n * @example\\n *\\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\\n *\\n * _.xorWith(objects, others, _.isEqual);\\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\\n */\\n var xorWith = baseRest(function(arrays) {\\n var comparator = last(arrays);\\n comparator = typeof comparator == 'function' ? comparator : undefined;\\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\\n });\\n\\n /**\\n * Creates an array of grouped elements, the first of which contains the\\n * first elements of the given arrays, the second of which contains the\\n * second elements of the given arrays, and so on.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to process.\\n * @returns {Array} Returns the new array of grouped elements.\\n * @example\\n *\\n * _.zip(['a', 'b'], [1, 2], [true, false]);\\n * // => [['a', 1, true], ['b', 2, false]]\\n */\\n var zip = baseRest(unzip);\\n\\n /**\\n * This method is like `_.fromPairs` except that it accepts two arrays,\\n * one of property identifiers and one of corresponding values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.4.0\\n * @category Array\\n * @param {Array} [props=[]] The property identifiers.\\n * @param {Array} [values=[]] The property values.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.zipObject(['a', 'b'], [1, 2]);\\n * // => { 'a': 1, 'b': 2 }\\n */\\n function zipObject(props, values) {\\n return baseZipObject(props || [], values || [], assignValue);\\n }\\n\\n /**\\n * This method is like `_.zipObject` except that it supports property paths.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.1.0\\n * @category Array\\n * @param {Array} [props=[]] The property identifiers.\\n * @param {Array} [values=[]] The property values.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\\n */\\n function zipObjectDeep(props, values) {\\n return baseZipObject(props || [], values || [], baseSet);\\n }\\n\\n /**\\n * This method is like `_.zip` except that it accepts `iteratee` to specify\\n * how grouped values should be combined. The iteratee is invoked with the\\n * elements of each group: (...group).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Array\\n * @param {...Array} [arrays] The arrays to process.\\n * @param {Function} [iteratee=_.identity] The function to combine\\n * grouped values.\\n * @returns {Array} Returns the new array of grouped elements.\\n * @example\\n *\\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\\n * return a + b + c;\\n * });\\n * // => [111, 222]\\n */\\n var zipWith = baseRest(function(arrays) {\\n var length = arrays.length,\\n iteratee = length > 1 ? arrays[length - 1] : undefined;\\n\\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\\n return unzipWith(arrays, iteratee);\\n });\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\\n * chain sequences enabled. The result of such sequences must be unwrapped\\n * with `_#value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.3.0\\n * @category Seq\\n * @param {*} value The value to wrap.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'pebbles', 'age': 1 }\\n * ];\\n *\\n * var youngest = _\\n * .chain(users)\\n * .sortBy('age')\\n * .map(function(o) {\\n * return o.user + ' is ' + o.age;\\n * })\\n * .head()\\n * .value();\\n * // => 'pebbles is 1'\\n */\\n function chain(value) {\\n var result = lodash(value);\\n result.__chain__ = true;\\n return result;\\n }\\n\\n /**\\n * This method invokes `interceptor` and returns `value`. The interceptor\\n * is invoked with one argument; (value). The purpose of this method is to\\n * \\\"tap into\\\" a method chain sequence in order to modify intermediate results.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @param {*} value The value to provide to `interceptor`.\\n * @param {Function} interceptor The function to invoke.\\n * @returns {*} Returns `value`.\\n * @example\\n *\\n * _([1, 2, 3])\\n * .tap(function(array) {\\n * // Mutate input array.\\n * array.pop();\\n * })\\n * .reverse()\\n * .value();\\n * // => [2, 1]\\n */\\n function tap(value, interceptor) {\\n interceptor(value);\\n return value;\\n }\\n\\n /**\\n * This method is like `_.tap` except that it returns the result of `interceptor`.\\n * The purpose of this method is to \\\"pass thru\\\" values replacing intermediate\\n * results in a method chain sequence.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Seq\\n * @param {*} value The value to provide to `interceptor`.\\n * @param {Function} interceptor The function to invoke.\\n * @returns {*} Returns the result of `interceptor`.\\n * @example\\n *\\n * _(' abc ')\\n * .chain()\\n * .trim()\\n * .thru(function(value) {\\n * return [value];\\n * })\\n * .value();\\n * // => ['abc']\\n */\\n function thru(value, interceptor) {\\n return interceptor(value);\\n }\\n\\n /**\\n * This method is the wrapper version of `_.at`.\\n *\\n * @name at\\n * @memberOf _\\n * @since 1.0.0\\n * @category Seq\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\\n *\\n * _(object).at(['a[0].b.c', 'a[1]']).value();\\n * // => [3, 4]\\n */\\n var wrapperAt = flatRest(function(paths) {\\n var length = paths.length,\\n start = length ? paths[0] : 0,\\n value = this.__wrapped__,\\n interceptor = function(object) { return baseAt(object, paths); };\\n\\n if (length > 1 || this.__actions__.length ||\\n !(value instanceof LazyWrapper) || !isIndex(start)) {\\n return this.thru(interceptor);\\n }\\n value = value.slice(start, +start + (length ? 1 : 0));\\n value.__actions__.push({\\n 'func': thru,\\n 'args': [interceptor],\\n 'thisArg': undefined\\n });\\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\\n if (length && !array.length) {\\n array.push(undefined);\\n }\\n return array;\\n });\\n });\\n\\n /**\\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\\n *\\n * @name chain\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 }\\n * ];\\n *\\n * // A sequence without explicit chaining.\\n * _(users).head();\\n * // => { 'user': 'barney', 'age': 36 }\\n *\\n * // A sequence with explicit chaining.\\n * _(users)\\n * .chain()\\n * .head()\\n * .pick('user')\\n * .value();\\n * // => { 'user': 'barney' }\\n */\\n function wrapperChain() {\\n return chain(this);\\n }\\n\\n /**\\n * Executes the chain sequence and returns the wrapped result.\\n *\\n * @name commit\\n * @memberOf _\\n * @since 3.2.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var array = [1, 2];\\n * var wrapped = _(array).push(3);\\n *\\n * console.log(array);\\n * // => [1, 2]\\n *\\n * wrapped = wrapped.commit();\\n * console.log(array);\\n * // => [1, 2, 3]\\n *\\n * wrapped.last();\\n * // => 3\\n *\\n * console.log(array);\\n * // => [1, 2, 3]\\n */\\n function wrapperCommit() {\\n return new LodashWrapper(this.value(), this.__chain__);\\n }\\n\\n /**\\n * Gets the next value on a wrapped object following the\\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\\n *\\n * @name next\\n * @memberOf _\\n * @since 4.0.0\\n * @category Seq\\n * @returns {Object} Returns the next iterator value.\\n * @example\\n *\\n * var wrapped = _([1, 2]);\\n *\\n * wrapped.next();\\n * // => { 'done': false, 'value': 1 }\\n *\\n * wrapped.next();\\n * // => { 'done': false, 'value': 2 }\\n *\\n * wrapped.next();\\n * // => { 'done': true, 'value': undefined }\\n */\\n function wrapperNext() {\\n if (this.__values__ === undefined) {\\n this.__values__ = toArray(this.value());\\n }\\n var done = this.__index__ >= this.__values__.length,\\n value = done ? undefined : this.__values__[this.__index__++];\\n\\n return { 'done': done, 'value': value };\\n }\\n\\n /**\\n * Enables the wrapper to be iterable.\\n *\\n * @name Symbol.iterator\\n * @memberOf _\\n * @since 4.0.0\\n * @category Seq\\n * @returns {Object} Returns the wrapper object.\\n * @example\\n *\\n * var wrapped = _([1, 2]);\\n *\\n * wrapped[Symbol.iterator]() === wrapped;\\n * // => true\\n *\\n * Array.from(wrapped);\\n * // => [1, 2]\\n */\\n function wrapperToIterator() {\\n return this;\\n }\\n\\n /**\\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\\n *\\n * @name plant\\n * @memberOf _\\n * @since 3.2.0\\n * @category Seq\\n * @param {*} value The value to plant.\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var wrapped = _([1, 2]).map(square);\\n * var other = wrapped.plant([3, 4]);\\n *\\n * other.value();\\n * // => [9, 16]\\n *\\n * wrapped.value();\\n * // => [1, 4]\\n */\\n function wrapperPlant(value) {\\n var result,\\n parent = this;\\n\\n while (parent instanceof baseLodash) {\\n var clone = wrapperClone(parent);\\n clone.__index__ = 0;\\n clone.__values__ = undefined;\\n if (result) {\\n previous.__wrapped__ = clone;\\n } else {\\n result = clone;\\n }\\n var previous = clone;\\n parent = parent.__wrapped__;\\n }\\n previous.__wrapped__ = value;\\n return result;\\n }\\n\\n /**\\n * This method is the wrapper version of `_.reverse`.\\n *\\n * **Note:** This method mutates the wrapped array.\\n *\\n * @name reverse\\n * @memberOf _\\n * @since 0.1.0\\n * @category Seq\\n * @returns {Object} Returns the new `lodash` wrapper instance.\\n * @example\\n *\\n * var array = [1, 2, 3];\\n *\\n * _(array).reverse().value()\\n * // => [3, 2, 1]\\n *\\n * console.log(array);\\n * // => [3, 2, 1]\\n */\\n function wrapperReverse() {\\n var value = this.__wrapped__;\\n if (value instanceof LazyWrapper) {\\n var wrapped = value;\\n if (this.__actions__.length) {\\n wrapped = new LazyWrapper(this);\\n }\\n wrapped = wrapped.reverse();\\n wrapped.__actions__.push({\\n 'func': thru,\\n 'args': [reverse],\\n 'thisArg': undefined\\n });\\n return new LodashWrapper(wrapped, this.__chain__);\\n }\\n return this.thru(reverse);\\n }\\n\\n /**\\n * Executes the chain sequence to resolve the unwrapped value.\\n *\\n * @name value\\n * @memberOf _\\n * @since 0.1.0\\n * @alias toJSON, valueOf\\n * @category Seq\\n * @returns {*} Returns the resolved unwrapped value.\\n * @example\\n *\\n * _([1, 2, 3]).value();\\n * // => [1, 2, 3]\\n */\\n function wrapperValue() {\\n return baseWrapperValue(this.__wrapped__, this.__actions__);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The corresponding value of\\n * each key is the number of times the key was returned by `iteratee`. The\\n * iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\\n * // => { '4': 1, '6': 2 }\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.countBy(['one', 'two', 'three'], 'length');\\n * // => { '3': 2, '5': 1 }\\n */\\n var countBy = createAggregator(function(result, value, key) {\\n if (hasOwnProperty.call(result, key)) {\\n ++result[key];\\n } else {\\n baseAssignValue(result, key, 1);\\n }\\n });\\n\\n /**\\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\\n * Iteration is stopped once `predicate` returns falsey. The predicate is\\n * invoked with three arguments: (value, index|key, collection).\\n *\\n * **Note:** This method returns `true` for\\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\\n * elements of empty collections.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\\n * else `false`.\\n * @example\\n *\\n * _.every([true, 1, null, 'yes'], Boolean);\\n * // => false\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': false }\\n * ];\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.every(users, { 'user': 'barney', 'active': false });\\n * // => false\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.every(users, ['active', false]);\\n * // => true\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.every(users, 'active');\\n * // => false\\n */\\n function every(collection, predicate, guard) {\\n var func = isArray(collection) ? arrayEvery : baseEvery;\\n if (guard && isIterateeCall(collection, predicate, guard)) {\\n predicate = undefined;\\n }\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Iterates over elements of `collection`, returning an array of all elements\\n * `predicate` returns truthy for. The predicate is invoked with three\\n * arguments: (value, index|key, collection).\\n *\\n * **Note:** Unlike `_.remove`, this method returns a new array.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n * @see _.reject\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': true },\\n * { 'user': 'fred', 'age': 40, 'active': false }\\n * ];\\n *\\n * _.filter(users, function(o) { return !o.active; });\\n * // => objects for ['fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.filter(users, { 'age': 36, 'active': true });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.filter(users, ['active', false]);\\n * // => objects for ['fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.filter(users, 'active');\\n * // => objects for ['barney']\\n */\\n function filter(collection, predicate) {\\n var func = isArray(collection) ? arrayFilter : baseFilter;\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Iterates over elements of `collection`, returning the first element\\n * `predicate` returns truthy for. The predicate is invoked with three\\n * arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @returns {*} Returns the matched element, else `undefined`.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': true },\\n * { 'user': 'fred', 'age': 40, 'active': false },\\n * { 'user': 'pebbles', 'age': 1, 'active': true }\\n * ];\\n *\\n * _.find(users, function(o) { return o.age < 40; });\\n * // => object for 'barney'\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.find(users, { 'age': 1, 'active': true });\\n * // => object for 'pebbles'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.find(users, ['active', false]);\\n * // => object for 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.find(users, 'active');\\n * // => object for 'barney'\\n */\\n var find = createFind(findIndex);\\n\\n /**\\n * This method is like `_.find` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param {number} [fromIndex=collection.length-1] The index to search from.\\n * @returns {*} Returns the matched element, else `undefined`.\\n * @example\\n *\\n * _.findLast([1, 2, 3, 4], function(n) {\\n * return n % 2 == 1;\\n * });\\n * // => 3\\n */\\n var findLast = createFind(findLastIndex);\\n\\n /**\\n * Creates a flattened array of values by running each element in `collection`\\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\\n * with three arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [n, n];\\n * }\\n *\\n * _.flatMap([1, 2], duplicate);\\n * // => [1, 1, 2, 2]\\n */\\n function flatMap(collection, iteratee) {\\n return baseFlatten(map(collection, iteratee), 1);\\n }\\n\\n /**\\n * This method is like `_.flatMap` except that it recursively flattens the\\n * mapped results.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.7.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [[[n, n]]];\\n * }\\n *\\n * _.flatMapDeep([1, 2], duplicate);\\n * // => [1, 1, 2, 2]\\n */\\n function flatMapDeep(collection, iteratee) {\\n return baseFlatten(map(collection, iteratee), INFINITY);\\n }\\n\\n /**\\n * This method is like `_.flatMap` except that it recursively flattens the\\n * mapped results up to `depth` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.7.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {number} [depth=1] The maximum recursion depth.\\n * @returns {Array} Returns the new flattened array.\\n * @example\\n *\\n * function duplicate(n) {\\n * return [[[n, n]]];\\n * }\\n *\\n * _.flatMapDepth([1, 2], duplicate, 2);\\n * // => [[1, 1], [2, 2]]\\n */\\n function flatMapDepth(collection, iteratee, depth) {\\n depth = depth === undefined ? 1 : toInteger(depth);\\n return baseFlatten(map(collection, iteratee), depth);\\n }\\n\\n /**\\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\\n * The iteratee is invoked with three arguments: (value, index|key, collection).\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * **Note:** As with other \\\"Collections\\\" methods, objects with a \\\"length\\\"\\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\\n * or `_.forOwn` for object iteration.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @alias each\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n * @see _.forEachRight\\n * @example\\n *\\n * _.forEach([1, 2], function(value) {\\n * console.log(value);\\n * });\\n * // => Logs `1` then `2`.\\n *\\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\\n */\\n function forEach(collection, iteratee) {\\n var func = isArray(collection) ? arrayEach : baseEach;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.forEach` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @alias eachRight\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array|Object} Returns `collection`.\\n * @see _.forEach\\n * @example\\n *\\n * _.forEachRight([1, 2], function(value) {\\n * console.log(value);\\n * });\\n * // => Logs `2` then `1`.\\n */\\n function forEachRight(collection, iteratee) {\\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The order of grouped values\\n * is determined by the order they occur in `collection`. The corresponding\\n * value of each key is an array of elements responsible for generating the\\n * key. The iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\\n * // => { '4': [4.2], '6': [6.1, 6.3] }\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.groupBy(['one', 'two', 'three'], 'length');\\n * // => { '3': ['one', 'two'], '5': ['three'] }\\n */\\n var groupBy = createAggregator(function(result, value, key) {\\n if (hasOwnProperty.call(result, key)) {\\n result[key].push(value);\\n } else {\\n baseAssignValue(result, key, [value]);\\n }\\n });\\n\\n /**\\n * Checks if `value` is in `collection`. If `collection` is a string, it's\\n * checked for a substring of `value`, otherwise\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\\n * the offset from the end of `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object|string} collection The collection to inspect.\\n * @param {*} value The value to search for.\\n * @param {number} [fromIndex=0] The index to search from.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\\n * @example\\n *\\n * _.includes([1, 2, 3], 1);\\n * // => true\\n *\\n * _.includes([1, 2, 3], 1, 2);\\n * // => false\\n *\\n * _.includes({ 'a': 1, 'b': 2 }, 1);\\n * // => true\\n *\\n * _.includes('abcd', 'bc');\\n * // => true\\n */\\n function includes(collection, value, fromIndex, guard) {\\n collection = isArrayLike(collection) ? collection : values(collection);\\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\\n\\n var length = collection.length;\\n if (fromIndex < 0) {\\n fromIndex = nativeMax(length + fromIndex, 0);\\n }\\n return isString(collection)\\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\\n }\\n\\n /**\\n * Invokes the method at `path` of each element in `collection`, returning\\n * an array of the results of each invoked method. Any additional arguments\\n * are provided to each invoked method. If `path` is a function, it's invoked\\n * for, and `this` bound to, each element in `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Array|Function|string} path The path of the method to invoke or\\n * the function invoked per iteration.\\n * @param {...*} [args] The arguments to invoke each method with.\\n * @returns {Array} Returns the array of results.\\n * @example\\n *\\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\\n * // => [[1, 5, 7], [1, 2, 3]]\\n *\\n * _.invokeMap([123, 456], String.prototype.split, '');\\n * // => [['1', '2', '3'], ['4', '5', '6']]\\n */\\n var invokeMap = baseRest(function(collection, path, args) {\\n var index = -1,\\n isFunc = typeof path == 'function',\\n result = isArrayLike(collection) ? Array(collection.length) : [];\\n\\n baseEach(collection, function(value) {\\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\\n });\\n return result;\\n });\\n\\n /**\\n * Creates an object composed of keys generated from the results of running\\n * each element of `collection` thru `iteratee`. The corresponding value of\\n * each key is the last element responsible for generating the key. The\\n * iteratee is invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\\n * @returns {Object} Returns the composed aggregate object.\\n * @example\\n *\\n * var array = [\\n * { 'dir': 'left', 'code': 97 },\\n * { 'dir': 'right', 'code': 100 }\\n * ];\\n *\\n * _.keyBy(array, function(o) {\\n * return String.fromCharCode(o.code);\\n * });\\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\\n *\\n * _.keyBy(array, 'dir');\\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\\n */\\n var keyBy = createAggregator(function(result, value, key) {\\n baseAssignValue(result, key, value);\\n });\\n\\n /**\\n * Creates an array of values by running each element in `collection` thru\\n * `iteratee`. The iteratee is invoked with three arguments:\\n * (value, index|key, collection).\\n *\\n * Many lodash methods are guarded to work as iteratees for methods like\\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\\n *\\n * The guarded methods are:\\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new mapped array.\\n * @example\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * _.map([4, 8], square);\\n * // => [16, 64]\\n *\\n * _.map({ 'a': 4, 'b': 8 }, square);\\n * // => [16, 64] (iteration order is not guaranteed)\\n *\\n * var users = [\\n * { 'user': 'barney' },\\n * { 'user': 'fred' }\\n * ];\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.map(users, 'user');\\n * // => ['barney', 'fred']\\n */\\n function map(collection, iteratee) {\\n var func = isArray(collection) ? arrayMap : baseMap;\\n return func(collection, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.sortBy` except that it allows specifying the sort\\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\\n * are sorted in ascending order. Otherwise, specify an order of \\\"desc\\\" for\\n * descending or \\\"asc\\\" for ascending sort order of corresponding values.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\\n * The iteratees to sort by.\\n * @param {string[]} [orders] The sort orders of `iteratees`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\\n * @returns {Array} Returns the new sorted array.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'fred', 'age': 48 },\\n * { 'user': 'barney', 'age': 34 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'barney', 'age': 36 }\\n * ];\\n *\\n * // Sort by `user` in ascending order and by `age` in descending order.\\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\\n */\\n function orderBy(collection, iteratees, orders, guard) {\\n if (collection == null) {\\n return [];\\n }\\n if (!isArray(iteratees)) {\\n iteratees = iteratees == null ? [] : [iteratees];\\n }\\n orders = guard ? undefined : orders;\\n if (!isArray(orders)) {\\n orders = orders == null ? [] : [orders];\\n }\\n return baseOrderBy(collection, iteratees, orders);\\n }\\n\\n /**\\n * Creates an array of elements split into two groups, the first of which\\n * contains elements `predicate` returns truthy for, the second of which\\n * contains elements `predicate` returns falsey for. The predicate is\\n * invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the array of grouped elements.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': true },\\n * { 'user': 'pebbles', 'age': 1, 'active': false }\\n * ];\\n *\\n * _.partition(users, function(o) { return o.active; });\\n * // => objects for [['fred'], ['barney', 'pebbles']]\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.partition(users, { 'age': 1, 'active': false });\\n * // => objects for [['pebbles'], ['barney', 'fred']]\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.partition(users, ['active', false]);\\n * // => objects for [['barney', 'pebbles'], ['fred']]\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.partition(users, 'active');\\n * // => objects for [['fred'], ['barney', 'pebbles']]\\n */\\n var partition = createAggregator(function(result, value, key) {\\n result[key ? 0 : 1].push(value);\\n }, function() { return [[], []]; });\\n\\n /**\\n * Reduces `collection` to a value which is the accumulated result of running\\n * each element in `collection` thru `iteratee`, where each successive\\n * invocation is supplied the return value of the previous. If `accumulator`\\n * is not given, the first element of `collection` is used as the initial\\n * value. The iteratee is invoked with four arguments:\\n * (accumulator, value, index|key, collection).\\n *\\n * Many lodash methods are guarded to work as iteratees for methods like\\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\\n *\\n * The guarded methods are:\\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\\n * and `sortBy`\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @returns {*} Returns the accumulated value.\\n * @see _.reduceRight\\n * @example\\n *\\n * _.reduce([1, 2], function(sum, n) {\\n * return sum + n;\\n * }, 0);\\n * // => 3\\n *\\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\\n * (result[value] || (result[value] = [])).push(key);\\n * return result;\\n * }, {});\\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\\n */\\n function reduce(collection, iteratee, accumulator) {\\n var func = isArray(collection) ? arrayReduce : baseReduce,\\n initAccum = arguments.length < 3;\\n\\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\\n }\\n\\n /**\\n * This method is like `_.reduce` except that it iterates over elements of\\n * `collection` from right to left.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The initial value.\\n * @returns {*} Returns the accumulated value.\\n * @see _.reduce\\n * @example\\n *\\n * var array = [[0, 1], [2, 3], [4, 5]];\\n *\\n * _.reduceRight(array, function(flattened, other) {\\n * return flattened.concat(other);\\n * }, []);\\n * // => [4, 5, 2, 3, 0, 1]\\n */\\n function reduceRight(collection, iteratee, accumulator) {\\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\\n initAccum = arguments.length < 3;\\n\\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\\n }\\n\\n /**\\n * The opposite of `_.filter`; this method returns the elements of `collection`\\n * that `predicate` does **not** return truthy for.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {Array} Returns the new filtered array.\\n * @see _.filter\\n * @example\\n *\\n * var users = [\\n * { 'user': 'barney', 'age': 36, 'active': false },\\n * { 'user': 'fred', 'age': 40, 'active': true }\\n * ];\\n *\\n * _.reject(users, function(o) { return !o.active; });\\n * // => objects for ['fred']\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.reject(users, { 'age': 40, 'active': true });\\n * // => objects for ['barney']\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.reject(users, ['active', false]);\\n * // => objects for ['fred']\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.reject(users, 'active');\\n * // => objects for ['barney']\\n */\\n function reject(collection, predicate) {\\n var func = isArray(collection) ? arrayFilter : baseFilter;\\n return func(collection, negate(getIteratee(predicate, 3)));\\n }\\n\\n /**\\n * Gets a random element from `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to sample.\\n * @returns {*} Returns the random element.\\n * @example\\n *\\n * _.sample([1, 2, 3, 4]);\\n * // => 2\\n */\\n function sample(collection) {\\n var func = isArray(collection) ? arraySample : baseSample;\\n return func(collection);\\n }\\n\\n /**\\n * Gets `n` random elements at unique keys from `collection` up to the\\n * size of `collection`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to sample.\\n * @param {number} [n=1] The number of elements to sample.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Array} Returns the random elements.\\n * @example\\n *\\n * _.sampleSize([1, 2, 3], 2);\\n * // => [3, 1]\\n *\\n * _.sampleSize([1, 2, 3], 4);\\n * // => [2, 3, 1]\\n */\\n function sampleSize(collection, n, guard) {\\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\\n n = 1;\\n } else {\\n n = toInteger(n);\\n }\\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\\n return func(collection, n);\\n }\\n\\n /**\\n * Creates an array of shuffled values, using a version of the\\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to shuffle.\\n * @returns {Array} Returns the new shuffled array.\\n * @example\\n *\\n * _.shuffle([1, 2, 3, 4]);\\n * // => [4, 1, 3, 2]\\n */\\n function shuffle(collection) {\\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\\n return func(collection);\\n }\\n\\n /**\\n * Gets the size of `collection` by returning its length for array-like\\n * values or the number of own enumerable string keyed properties for objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object|string} collection The collection to inspect.\\n * @returns {number} Returns the collection size.\\n * @example\\n *\\n * _.size([1, 2, 3]);\\n * // => 3\\n *\\n * _.size({ 'a': 1, 'b': 2 });\\n * // => 2\\n *\\n * _.size('pebbles');\\n * // => 7\\n */\\n function size(collection) {\\n if (collection == null) {\\n return 0;\\n }\\n if (isArrayLike(collection)) {\\n return isString(collection) ? stringSize(collection) : collection.length;\\n }\\n var tag = getTag(collection);\\n if (tag == mapTag || tag == setTag) {\\n return collection.size;\\n }\\n return baseKeys(collection).length;\\n }\\n\\n /**\\n * Checks if `predicate` returns truthy for **any** element of `collection`.\\n * Iteration is stopped once `predicate` returns truthy. The predicate is\\n * invoked with three arguments: (value, index|key, collection).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {boolean} Returns `true` if any element passes the predicate check,\\n * else `false`.\\n * @example\\n *\\n * _.some([null, 0, 'yes', false], Boolean);\\n * // => true\\n *\\n * var users = [\\n * { 'user': 'barney', 'active': true },\\n * { 'user': 'fred', 'active': false }\\n * ];\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.some(users, { 'user': 'barney', 'active': false });\\n * // => false\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.some(users, ['active', false]);\\n * // => true\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.some(users, 'active');\\n * // => true\\n */\\n function some(collection, predicate, guard) {\\n var func = isArray(collection) ? arraySome : baseSome;\\n if (guard && isIterateeCall(collection, predicate, guard)) {\\n predicate = undefined;\\n }\\n return func(collection, getIteratee(predicate, 3));\\n }\\n\\n /**\\n * Creates an array of elements, sorted in ascending order by the results of\\n * running each element in a collection thru each iteratee. This method\\n * performs a stable sort, that is, it preserves the original sort order of\\n * equal elements. The iteratees are invoked with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Collection\\n * @param {Array|Object} collection The collection to iterate over.\\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\\n * The iteratees to sort by.\\n * @returns {Array} Returns the new sorted array.\\n * @example\\n *\\n * var users = [\\n * { 'user': 'fred', 'age': 48 },\\n * { 'user': 'barney', 'age': 36 },\\n * { 'user': 'fred', 'age': 40 },\\n * { 'user': 'barney', 'age': 34 }\\n * ];\\n *\\n * _.sortBy(users, [function(o) { return o.user; }]);\\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\\n *\\n * _.sortBy(users, ['user', 'age']);\\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\\n */\\n var sortBy = baseRest(function(collection, iteratees) {\\n if (collection == null) {\\n return [];\\n }\\n var length = iteratees.length;\\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\\n iteratees = [];\\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\\n iteratees = [iteratees[0]];\\n }\\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\\n });\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Gets the timestamp of the number of milliseconds that have elapsed since\\n * the Unix epoch (1 January 1970 00:00:00 UTC).\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Date\\n * @returns {number} Returns the timestamp.\\n * @example\\n *\\n * _.defer(function(stamp) {\\n * console.log(_.now() - stamp);\\n * }, _.now());\\n * // => Logs the number of milliseconds it took for the deferred invocation.\\n */\\n var now = ctxNow || function() {\\n return root.Date.now();\\n };\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * The opposite of `_.before`; this method creates a function that invokes\\n * `func` once it's called `n` or more times.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {number} n The number of calls before `func` is invoked.\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * var saves = ['profile', 'settings'];\\n *\\n * var done = _.after(saves.length, function() {\\n * console.log('done saving!');\\n * });\\n *\\n * _.forEach(saves, function(type) {\\n * asyncSave({ 'type': type, 'complete': done });\\n * });\\n * // => Logs 'done saving!' after the two async saves have completed.\\n */\\n function after(n, func) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n n = toInteger(n);\\n return function() {\\n if (--n < 1) {\\n return func.apply(this, arguments);\\n }\\n };\\n }\\n\\n /**\\n * Creates a function that invokes `func`, with up to `n` arguments,\\n * ignoring any additional arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to cap arguments for.\\n * @param {number} [n=func.length] The arity cap.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new capped function.\\n * @example\\n *\\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\\n * // => [6, 8, 10]\\n */\\n function ary(func, n, guard) {\\n n = guard ? undefined : n;\\n n = (func && n == null) ? func.length : n;\\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\\n }\\n\\n /**\\n * Creates a function that invokes `func`, with the `this` binding and arguments\\n * of the created function, while it's called less than `n` times. Subsequent\\n * calls to the created function return the result of the last `func` invocation.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {number} n The number of calls at which `func` is no longer invoked.\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * jQuery(element).on('click', _.before(5, addContactToList));\\n * // => Allows adding up to 4 contacts to the list.\\n */\\n function before(n, func) {\\n var result;\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n n = toInteger(n);\\n return function() {\\n if (--n > 0) {\\n result = func.apply(this, arguments);\\n }\\n if (n <= 1) {\\n func = undefined;\\n }\\n return result;\\n };\\n }\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\\n * and `partials` prepended to the arguments it receives.\\n *\\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\\n * may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \\\"length\\\"\\n * property of bound functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to bind.\\n * @param {*} thisArg The `this` binding of `func`.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new bound function.\\n * @example\\n *\\n * function greet(greeting, punctuation) {\\n * return greeting + ' ' + this.user + punctuation;\\n * }\\n *\\n * var object = { 'user': 'fred' };\\n *\\n * var bound = _.bind(greet, object, 'hi');\\n * bound('!');\\n * // => 'hi fred!'\\n *\\n * // Bound with placeholders.\\n * var bound = _.bind(greet, object, _, '!');\\n * bound('hi');\\n * // => 'hi fred!'\\n */\\n var bind = baseRest(function(func, thisArg, partials) {\\n var bitmask = WRAP_BIND_FLAG;\\n if (partials.length) {\\n var holders = replaceHolders(partials, getHolder(bind));\\n bitmask |= WRAP_PARTIAL_FLAG;\\n }\\n return createWrap(func, bitmask, thisArg, partials, holders);\\n });\\n\\n /**\\n * Creates a function that invokes the method at `object[key]` with `partials`\\n * prepended to the arguments it receives.\\n *\\n * This method differs from `_.bind` by allowing bound functions to reference\\n * methods that may be redefined or don't yet exist. See\\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\\n * for more details.\\n *\\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.10.0\\n * @category Function\\n * @param {Object} object The object to invoke the method on.\\n * @param {string} key The key of the method.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new bound function.\\n * @example\\n *\\n * var object = {\\n * 'user': 'fred',\\n * 'greet': function(greeting, punctuation) {\\n * return greeting + ' ' + this.user + punctuation;\\n * }\\n * };\\n *\\n * var bound = _.bindKey(object, 'greet', 'hi');\\n * bound('!');\\n * // => 'hi fred!'\\n *\\n * object.greet = function(greeting, punctuation) {\\n * return greeting + 'ya ' + this.user + punctuation;\\n * };\\n *\\n * bound('!');\\n * // => 'hiya fred!'\\n *\\n * // Bound with placeholders.\\n * var bound = _.bindKey(object, 'greet', _, '!');\\n * bound('hi');\\n * // => 'hiya fred!'\\n */\\n var bindKey = baseRest(function(object, key, partials) {\\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\\n if (partials.length) {\\n var holders = replaceHolders(partials, getHolder(bindKey));\\n bitmask |= WRAP_PARTIAL_FLAG;\\n }\\n return createWrap(key, bitmask, object, partials, holders);\\n });\\n\\n /**\\n * Creates a function that accepts arguments of `func` and either invokes\\n * `func` returning its result, if at least `arity` number of arguments have\\n * been provided, or returns a function that accepts the remaining `func`\\n * arguments, and so on. The arity of `func` may be specified if `func.length`\\n * is not sufficient.\\n *\\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\\n * may be used as a placeholder for provided arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of curried functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Function\\n * @param {Function} func The function to curry.\\n * @param {number} [arity=func.length] The arity of `func`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new curried function.\\n * @example\\n *\\n * var abc = function(a, b, c) {\\n * return [a, b, c];\\n * };\\n *\\n * var curried = _.curry(abc);\\n *\\n * curried(1)(2)(3);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2)(3);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2, 3);\\n * // => [1, 2, 3]\\n *\\n * // Curried with placeholders.\\n * curried(1)(_, 3)(2);\\n * // => [1, 2, 3]\\n */\\n function curry(func, arity, guard) {\\n arity = guard ? undefined : arity;\\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\\n result.placeholder = curry.placeholder;\\n return result;\\n }\\n\\n /**\\n * This method is like `_.curry` except that arguments are applied to `func`\\n * in the manner of `_.partialRight` instead of `_.partial`.\\n *\\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for provided arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of curried functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to curry.\\n * @param {number} [arity=func.length] The arity of `func`.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the new curried function.\\n * @example\\n *\\n * var abc = function(a, b, c) {\\n * return [a, b, c];\\n * };\\n *\\n * var curried = _.curryRight(abc);\\n *\\n * curried(3)(2)(1);\\n * // => [1, 2, 3]\\n *\\n * curried(2, 3)(1);\\n * // => [1, 2, 3]\\n *\\n * curried(1, 2, 3);\\n * // => [1, 2, 3]\\n *\\n * // Curried with placeholders.\\n * curried(3)(1, _)(2);\\n * // => [1, 2, 3]\\n */\\n function curryRight(func, arity, guard) {\\n arity = guard ? undefined : arity;\\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\\n result.placeholder = curryRight.placeholder;\\n return result;\\n }\\n\\n /**\\n * Creates a debounced function that delays invoking `func` until after `wait`\\n * milliseconds have elapsed since the last time the debounced function was\\n * invoked. The debounced function comes with a `cancel` method to cancel\\n * delayed `func` invocations and a `flush` method to immediately invoke them.\\n * Provide `options` to indicate whether `func` should be invoked on the\\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\\n * with the last arguments provided to the debounced function. Subsequent\\n * calls to the debounced function return the result of the last `func`\\n * invocation.\\n *\\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\\n * invoked on the trailing edge of the timeout only if the debounced function\\n * is invoked more than once during the `wait` timeout.\\n *\\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\\n *\\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\\n * for details over the differences between `_.debounce` and `_.throttle`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to debounce.\\n * @param {number} [wait=0] The number of milliseconds to delay.\\n * @param {Object} [options={}] The options object.\\n * @param {boolean} [options.leading=false]\\n * Specify invoking on the leading edge of the timeout.\\n * @param {number} [options.maxWait]\\n * The maximum time `func` is allowed to be delayed before it's invoked.\\n * @param {boolean} [options.trailing=true]\\n * Specify invoking on the trailing edge of the timeout.\\n * @returns {Function} Returns the new debounced function.\\n * @example\\n *\\n * // Avoid costly calculations while the window size is in flux.\\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\\n *\\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\\n * 'leading': true,\\n * 'trailing': false\\n * }));\\n *\\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\\n * var source = new EventSource('/stream');\\n * jQuery(source).on('message', debounced);\\n *\\n * // Cancel the trailing debounced invocation.\\n * jQuery(window).on('popstate', debounced.cancel);\\n */\\n function debounce(func, wait, options) {\\n var lastArgs,\\n lastThis,\\n maxWait,\\n result,\\n timerId,\\n lastCallTime,\\n lastInvokeTime = 0,\\n leading = false,\\n maxing = false,\\n trailing = true;\\n\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n wait = toNumber(wait) || 0;\\n if (isObject(options)) {\\n leading = !!options.leading;\\n maxing = 'maxWait' in options;\\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\\n trailing = 'trailing' in options ? !!options.trailing : trailing;\\n }\\n\\n function invokeFunc(time) {\\n var args = lastArgs,\\n thisArg = lastThis;\\n\\n lastArgs = lastThis = undefined;\\n lastInvokeTime = time;\\n result = func.apply(thisArg, args);\\n return result;\\n }\\n\\n function leadingEdge(time) {\\n // Reset any `maxWait` timer.\\n lastInvokeTime = time;\\n // Start the timer for the trailing edge.\\n timerId = setTimeout(timerExpired, wait);\\n // Invoke the leading edge.\\n return leading ? invokeFunc(time) : result;\\n }\\n\\n function remainingWait(time) {\\n var timeSinceLastCall = time - lastCallTime,\\n timeSinceLastInvoke = time - lastInvokeTime,\\n result = wait - timeSinceLastCall;\\n\\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\\n }\\n\\n function shouldInvoke(time) {\\n var timeSinceLastCall = time - lastCallTime,\\n timeSinceLastInvoke = time - lastInvokeTime;\\n\\n // Either this is the first call, activity has stopped and we're at the\\n // trailing edge, the system time has gone backwards and we're treating\\n // it as the trailing edge, or we've hit the `maxWait` limit.\\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\\n }\\n\\n function timerExpired() {\\n var time = now();\\n if (shouldInvoke(time)) {\\n return trailingEdge(time);\\n }\\n // Restart the timer.\\n timerId = setTimeout(timerExpired, remainingWait(time));\\n }\\n\\n function trailingEdge(time) {\\n timerId = undefined;\\n\\n // Only invoke if we have `lastArgs` which means `func` has been\\n // debounced at least once.\\n if (trailing && lastArgs) {\\n return invokeFunc(time);\\n }\\n lastArgs = lastThis = undefined;\\n return result;\\n }\\n\\n function cancel() {\\n if (timerId !== undefined) {\\n clearTimeout(timerId);\\n }\\n lastInvokeTime = 0;\\n lastArgs = lastCallTime = lastThis = timerId = undefined;\\n }\\n\\n function flush() {\\n return timerId === undefined ? result : trailingEdge(now());\\n }\\n\\n function debounced() {\\n var time = now(),\\n isInvoking = shouldInvoke(time);\\n\\n lastArgs = arguments;\\n lastThis = this;\\n lastCallTime = time;\\n\\n if (isInvoking) {\\n if (timerId === undefined) {\\n return leadingEdge(lastCallTime);\\n }\\n if (maxing) {\\n // Handle invocations in a tight loop.\\n timerId = setTimeout(timerExpired, wait);\\n return invokeFunc(lastCallTime);\\n }\\n }\\n if (timerId === undefined) {\\n timerId = setTimeout(timerExpired, wait);\\n }\\n return result;\\n }\\n debounced.cancel = cancel;\\n debounced.flush = flush;\\n return debounced;\\n }\\n\\n /**\\n * Defers invoking the `func` until the current call stack has cleared. Any\\n * additional arguments are provided to `func` when it's invoked.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to defer.\\n * @param {...*} [args] The arguments to invoke `func` with.\\n * @returns {number} Returns the timer id.\\n * @example\\n *\\n * _.defer(function(text) {\\n * console.log(text);\\n * }, 'deferred');\\n * // => Logs 'deferred' after one millisecond.\\n */\\n var defer = baseRest(function(func, args) {\\n return baseDelay(func, 1, args);\\n });\\n\\n /**\\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\\n * provided to `func` when it's invoked.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to delay.\\n * @param {number} wait The number of milliseconds to delay invocation.\\n * @param {...*} [args] The arguments to invoke `func` with.\\n * @returns {number} Returns the timer id.\\n * @example\\n *\\n * _.delay(function(text) {\\n * console.log(text);\\n * }, 1000, 'later');\\n * // => Logs 'later' after one second.\\n */\\n var delay = baseRest(function(func, wait, args) {\\n return baseDelay(func, toNumber(wait) || 0, args);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with arguments reversed.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to flip arguments for.\\n * @returns {Function} Returns the new flipped function.\\n * @example\\n *\\n * var flipped = _.flip(function() {\\n * return _.toArray(arguments);\\n * });\\n *\\n * flipped('a', 'b', 'c', 'd');\\n * // => ['d', 'c', 'b', 'a']\\n */\\n function flip(func) {\\n return createWrap(func, WRAP_FLIP_FLAG);\\n }\\n\\n /**\\n * Creates a function that memoizes the result of `func`. If `resolver` is\\n * provided, it determines the cache key for storing the result based on the\\n * arguments provided to the memoized function. By default, the first argument\\n * provided to the memoized function is used as the map cache key. The `func`\\n * is invoked with the `this` binding of the memoized function.\\n *\\n * **Note:** The cache is exposed as the `cache` property on the memoized\\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\\n * constructor with one whose instances implement the\\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to have its output memoized.\\n * @param {Function} [resolver] The function to resolve the cache key.\\n * @returns {Function} Returns the new memoized function.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n * var other = { 'c': 3, 'd': 4 };\\n *\\n * var values = _.memoize(_.values);\\n * values(object);\\n * // => [1, 2]\\n *\\n * values(other);\\n * // => [3, 4]\\n *\\n * object.a = 2;\\n * values(object);\\n * // => [1, 2]\\n *\\n * // Modify the result cache.\\n * values.cache.set(object, ['a', 'b']);\\n * values(object);\\n * // => ['a', 'b']\\n *\\n * // Replace `_.memoize.Cache`.\\n * _.memoize.Cache = WeakMap;\\n */\\n function memoize(func, resolver) {\\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n var memoized = function() {\\n var args = arguments,\\n key = resolver ? resolver.apply(this, args) : args[0],\\n cache = memoized.cache;\\n\\n if (cache.has(key)) {\\n return cache.get(key);\\n }\\n var result = func.apply(this, args);\\n memoized.cache = cache.set(key, result) || cache;\\n return result;\\n };\\n memoized.cache = new (memoize.Cache || MapCache);\\n return memoized;\\n }\\n\\n // Expose `MapCache`.\\n memoize.Cache = MapCache;\\n\\n /**\\n * Creates a function that negates the result of the predicate `func`. The\\n * `func` predicate is invoked with the `this` binding and arguments of the\\n * created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} predicate The predicate to negate.\\n * @returns {Function} Returns the new negated function.\\n * @example\\n *\\n * function isEven(n) {\\n * return n % 2 == 0;\\n * }\\n *\\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\\n * // => [1, 3, 5]\\n */\\n function negate(predicate) {\\n if (typeof predicate != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n return function() {\\n var args = arguments;\\n switch (args.length) {\\n case 0: return !predicate.call(this);\\n case 1: return !predicate.call(this, args[0]);\\n case 2: return !predicate.call(this, args[0], args[1]);\\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\\n }\\n return !predicate.apply(this, args);\\n };\\n }\\n\\n /**\\n * Creates a function that is restricted to invoking `func` once. Repeat calls\\n * to the function return the value of the first invocation. The `func` is\\n * invoked with the `this` binding and arguments of the created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to restrict.\\n * @returns {Function} Returns the new restricted function.\\n * @example\\n *\\n * var initialize = _.once(createApplication);\\n * initialize();\\n * initialize();\\n * // => `createApplication` is invoked once\\n */\\n function once(func) {\\n return before(2, func);\\n }\\n\\n /**\\n * Creates a function that invokes `func` with its arguments transformed.\\n *\\n * @static\\n * @since 4.0.0\\n * @memberOf _\\n * @category Function\\n * @param {Function} func The function to wrap.\\n * @param {...(Function|Function[])} [transforms=[_.identity]]\\n * The argument transforms.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * function doubled(n) {\\n * return n * 2;\\n * }\\n *\\n * function square(n) {\\n * return n * n;\\n * }\\n *\\n * var func = _.overArgs(function(x, y) {\\n * return [x, y];\\n * }, [square, doubled]);\\n *\\n * func(9, 3);\\n * // => [81, 6]\\n *\\n * func(10, 5);\\n * // => [100, 10]\\n */\\n var overArgs = castRest(function(func, transforms) {\\n transforms = (transforms.length == 1 && isArray(transforms[0]))\\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\\n\\n var funcsLength = transforms.length;\\n return baseRest(function(args) {\\n var index = -1,\\n length = nativeMin(args.length, funcsLength);\\n\\n while (++index < length) {\\n args[index] = transforms[index].call(this, args[index]);\\n }\\n return apply(func, this, args);\\n });\\n });\\n\\n /**\\n * Creates a function that invokes `func` with `partials` prepended to the\\n * arguments it receives. This method is like `_.bind` except it does **not**\\n * alter the `this` binding.\\n *\\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of partially\\n * applied functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.2.0\\n * @category Function\\n * @param {Function} func The function to partially apply arguments to.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new partially applied function.\\n * @example\\n *\\n * function greet(greeting, name) {\\n * return greeting + ' ' + name;\\n * }\\n *\\n * var sayHelloTo = _.partial(greet, 'hello');\\n * sayHelloTo('fred');\\n * // => 'hello fred'\\n *\\n * // Partially applied with placeholders.\\n * var greetFred = _.partial(greet, _, 'fred');\\n * greetFred('hi');\\n * // => 'hi fred'\\n */\\n var partial = baseRest(function(func, partials) {\\n var holders = replaceHolders(partials, getHolder(partial));\\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\\n });\\n\\n /**\\n * This method is like `_.partial` except that partially applied arguments\\n * are appended to the arguments it receives.\\n *\\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\\n * builds, may be used as a placeholder for partially applied arguments.\\n *\\n * **Note:** This method doesn't set the \\\"length\\\" property of partially\\n * applied functions.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Function\\n * @param {Function} func The function to partially apply arguments to.\\n * @param {...*} [partials] The arguments to be partially applied.\\n * @returns {Function} Returns the new partially applied function.\\n * @example\\n *\\n * function greet(greeting, name) {\\n * return greeting + ' ' + name;\\n * }\\n *\\n * var greetFred = _.partialRight(greet, 'fred');\\n * greetFred('hi');\\n * // => 'hi fred'\\n *\\n * // Partially applied with placeholders.\\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\\n * sayHelloTo('fred');\\n * // => 'hello fred'\\n */\\n var partialRight = baseRest(function(func, partials) {\\n var holders = replaceHolders(partials, getHolder(partialRight));\\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with arguments arranged according\\n * to the specified `indexes` where the argument value at the first index is\\n * provided as the first argument, the argument value at the second index is\\n * provided as the second argument, and so on.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Function\\n * @param {Function} func The function to rearrange arguments for.\\n * @param {...(number|number[])} indexes The arranged argument indexes.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var rearged = _.rearg(function(a, b, c) {\\n * return [a, b, c];\\n * }, [2, 0, 1]);\\n *\\n * rearged('b', 'c', 'a')\\n * // => ['a', 'b', 'c']\\n */\\n var rearg = flatRest(function(func, indexes) {\\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\\n });\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of the\\n * created function and arguments from `start` and beyond provided as\\n * an array.\\n *\\n * **Note:** This method is based on the\\n * [rest parameter](https://mdn.io/rest_parameters).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to apply a rest parameter to.\\n * @param {number} [start=func.length-1] The start position of the rest parameter.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var say = _.rest(function(what, names) {\\n * return what + ' ' + _.initial(names).join(', ') +\\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\\n * });\\n *\\n * say('hello', 'fred', 'barney', 'pebbles');\\n * // => 'hello fred, barney, & pebbles'\\n */\\n function rest(func, start) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n start = start === undefined ? start : toInteger(start);\\n return baseRest(func, start);\\n }\\n\\n /**\\n * Creates a function that invokes `func` with the `this` binding of the\\n * create function and an array of arguments much like\\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\\n *\\n * **Note:** This method is based on the\\n * [spread operator](https://mdn.io/spread_operator).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.2.0\\n * @category Function\\n * @param {Function} func The function to spread arguments over.\\n * @param {number} [start=0] The start position of the spread.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var say = _.spread(function(who, what) {\\n * return who + ' says ' + what;\\n * });\\n *\\n * say(['fred', 'hello']);\\n * // => 'fred says hello'\\n *\\n * var numbers = Promise.all([\\n * Promise.resolve(40),\\n * Promise.resolve(36)\\n * ]);\\n *\\n * numbers.then(_.spread(function(x, y) {\\n * return x + y;\\n * }));\\n * // => a Promise of 76\\n */\\n function spread(func, start) {\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\\n return baseRest(function(args) {\\n var array = args[start],\\n otherArgs = castSlice(args, 0, start);\\n\\n if (array) {\\n arrayPush(otherArgs, array);\\n }\\n return apply(func, this, otherArgs);\\n });\\n }\\n\\n /**\\n * Creates a throttled function that only invokes `func` at most once per\\n * every `wait` milliseconds. The throttled function comes with a `cancel`\\n * method to cancel delayed `func` invocations and a `flush` method to\\n * immediately invoke them. Provide `options` to indicate whether `func`\\n * should be invoked on the leading and/or trailing edge of the `wait`\\n * timeout. The `func` is invoked with the last arguments provided to the\\n * throttled function. Subsequent calls to the throttled function return the\\n * result of the last `func` invocation.\\n *\\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\\n * invoked on the trailing edge of the timeout only if the throttled function\\n * is invoked more than once during the `wait` timeout.\\n *\\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\\n *\\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\\n * for details over the differences between `_.throttle` and `_.debounce`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {Function} func The function to throttle.\\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\\n * @param {Object} [options={}] The options object.\\n * @param {boolean} [options.leading=true]\\n * Specify invoking on the leading edge of the timeout.\\n * @param {boolean} [options.trailing=true]\\n * Specify invoking on the trailing edge of the timeout.\\n * @returns {Function} Returns the new throttled function.\\n * @example\\n *\\n * // Avoid excessively updating the position while scrolling.\\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\\n *\\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\\n * jQuery(element).on('click', throttled);\\n *\\n * // Cancel the trailing throttled invocation.\\n * jQuery(window).on('popstate', throttled.cancel);\\n */\\n function throttle(func, wait, options) {\\n var leading = true,\\n trailing = true;\\n\\n if (typeof func != 'function') {\\n throw new TypeError(FUNC_ERROR_TEXT);\\n }\\n if (isObject(options)) {\\n leading = 'leading' in options ? !!options.leading : leading;\\n trailing = 'trailing' in options ? !!options.trailing : trailing;\\n }\\n return debounce(func, wait, {\\n 'leading': leading,\\n 'maxWait': wait,\\n 'trailing': trailing\\n });\\n }\\n\\n /**\\n * Creates a function that accepts up to one argument, ignoring any\\n * additional arguments.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Function\\n * @param {Function} func The function to cap arguments for.\\n * @returns {Function} Returns the new capped function.\\n * @example\\n *\\n * _.map(['6', '8', '10'], _.unary(parseInt));\\n * // => [6, 8, 10]\\n */\\n function unary(func) {\\n return ary(func, 1);\\n }\\n\\n /**\\n * Creates a function that provides `value` to `wrapper` as its first\\n * argument. Any additional arguments provided to the function are appended\\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\\n * binding of the created function.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Function\\n * @param {*} value The value to wrap.\\n * @param {Function} [wrapper=identity] The wrapper function.\\n * @returns {Function} Returns the new function.\\n * @example\\n *\\n * var p = _.wrap(_.escape, function(func, text) {\\n * return '

' + func(text) + '

';\\n * });\\n *\\n * p('fred, barney, & pebbles');\\n * // => '

fred, barney, & pebbles

'\\n */\\n function wrap(value, wrapper) {\\n return partial(castFunction(wrapper), value);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Casts `value` as an array if it's not one.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.4.0\\n * @category Lang\\n * @param {*} value The value to inspect.\\n * @returns {Array} Returns the cast array.\\n * @example\\n *\\n * _.castArray(1);\\n * // => [1]\\n *\\n * _.castArray({ 'a': 1 });\\n * // => [{ 'a': 1 }]\\n *\\n * _.castArray('abc');\\n * // => ['abc']\\n *\\n * _.castArray(null);\\n * // => [null]\\n *\\n * _.castArray(undefined);\\n * // => [undefined]\\n *\\n * _.castArray();\\n * // => []\\n *\\n * var array = [1, 2, 3];\\n * console.log(_.castArray(array) === array);\\n * // => true\\n */\\n function castArray() {\\n if (!arguments.length) {\\n return [];\\n }\\n var value = arguments[0];\\n return isArray(value) ? value : [value];\\n }\\n\\n /**\\n * Creates a shallow clone of `value`.\\n *\\n * **Note:** This method is loosely based on the\\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\\n * arrays. The own enumerable properties of `arguments` objects are cloned\\n * as plain objects. An empty object is returned for uncloneable values such\\n * as error objects, functions, DOM nodes, and WeakMaps.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to clone.\\n * @returns {*} Returns the cloned value.\\n * @see _.cloneDeep\\n * @example\\n *\\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\\n *\\n * var shallow = _.clone(objects);\\n * console.log(shallow[0] === objects[0]);\\n * // => true\\n */\\n function clone(value) {\\n return baseClone(value, CLONE_SYMBOLS_FLAG);\\n }\\n\\n /**\\n * This method is like `_.clone` except that it accepts `customizer` which\\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\\n * cloning is handled by the method instead. The `customizer` is invoked with\\n * up to four arguments; (value [, index|key, object, stack]).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to clone.\\n * @param {Function} [customizer] The function to customize cloning.\\n * @returns {*} Returns the cloned value.\\n * @see _.cloneDeepWith\\n * @example\\n *\\n * function customizer(value) {\\n * if (_.isElement(value)) {\\n * return value.cloneNode(false);\\n * }\\n * }\\n *\\n * var el = _.cloneWith(document.body, customizer);\\n *\\n * console.log(el === document.body);\\n * // => false\\n * console.log(el.nodeName);\\n * // => 'BODY'\\n * console.log(el.childNodes.length);\\n * // => 0\\n */\\n function cloneWith(value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\\n }\\n\\n /**\\n * This method is like `_.clone` except that it recursively clones `value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Lang\\n * @param {*} value The value to recursively clone.\\n * @returns {*} Returns the deep cloned value.\\n * @see _.clone\\n * @example\\n *\\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\\n *\\n * var deep = _.cloneDeep(objects);\\n * console.log(deep[0] === objects[0]);\\n * // => false\\n */\\n function cloneDeep(value) {\\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\\n }\\n\\n /**\\n * This method is like `_.cloneWith` except that it recursively clones `value`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to recursively clone.\\n * @param {Function} [customizer] The function to customize cloning.\\n * @returns {*} Returns the deep cloned value.\\n * @see _.cloneWith\\n * @example\\n *\\n * function customizer(value) {\\n * if (_.isElement(value)) {\\n * return value.cloneNode(true);\\n * }\\n * }\\n *\\n * var el = _.cloneDeepWith(document.body, customizer);\\n *\\n * console.log(el === document.body);\\n * // => false\\n * console.log(el.nodeName);\\n * // => 'BODY'\\n * console.log(el.childNodes.length);\\n * // => 20\\n */\\n function cloneDeepWith(value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\\n }\\n\\n /**\\n * Checks if `object` conforms to `source` by invoking the predicate\\n * properties of `source` with the corresponding property values of `object`.\\n *\\n * **Note:** This method is equivalent to `_.conforms` when `source` is\\n * partially applied.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.14.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property predicates to conform to.\\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n *\\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\\n * // => true\\n *\\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\\n * // => false\\n */\\n function conformsTo(object, source) {\\n return source == null || baseConformsTo(object, source, keys(source));\\n }\\n\\n /**\\n * Performs a\\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\\n * comparison between two values to determine if they are equivalent.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1 };\\n * var other = { 'a': 1 };\\n *\\n * _.eq(object, object);\\n * // => true\\n *\\n * _.eq(object, other);\\n * // => false\\n *\\n * _.eq('a', 'a');\\n * // => true\\n *\\n * _.eq('a', Object('a'));\\n * // => false\\n *\\n * _.eq(NaN, NaN);\\n * // => true\\n */\\n function eq(value, other) {\\n return value === other || (value !== value && other !== other);\\n }\\n\\n /**\\n * Checks if `value` is greater than `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\\n * else `false`.\\n * @see _.lt\\n * @example\\n *\\n * _.gt(3, 1);\\n * // => true\\n *\\n * _.gt(3, 3);\\n * // => false\\n *\\n * _.gt(1, 3);\\n * // => false\\n */\\n var gt = createRelationalOperation(baseGt);\\n\\n /**\\n * Checks if `value` is greater than or equal to `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\\n * `other`, else `false`.\\n * @see _.lte\\n * @example\\n *\\n * _.gte(3, 1);\\n * // => true\\n *\\n * _.gte(3, 3);\\n * // => true\\n *\\n * _.gte(1, 3);\\n * // => false\\n */\\n var gte = createRelationalOperation(function(value, other) {\\n return value >= other;\\n });\\n\\n /**\\n * Checks if `value` is likely an `arguments` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\\n * else `false`.\\n * @example\\n *\\n * _.isArguments(function() { return arguments; }());\\n * // => true\\n *\\n * _.isArguments([1, 2, 3]);\\n * // => false\\n */\\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\\n !propertyIsEnumerable.call(value, 'callee');\\n };\\n\\n /**\\n * Checks if `value` is classified as an `Array` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\\n * @example\\n *\\n * _.isArray([1, 2, 3]);\\n * // => true\\n *\\n * _.isArray(document.body.children);\\n * // => false\\n *\\n * _.isArray('abc');\\n * // => false\\n *\\n * _.isArray(_.noop);\\n * // => false\\n */\\n var isArray = Array.isArray;\\n\\n /**\\n * Checks if `value` is classified as an `ArrayBuffer` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\\n * @example\\n *\\n * _.isArrayBuffer(new ArrayBuffer(2));\\n * // => true\\n *\\n * _.isArrayBuffer(new Array(2));\\n * // => false\\n */\\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\\n\\n /**\\n * Checks if `value` is array-like. A value is considered array-like if it's\\n * not a function and has a `value.length` that's an integer greater than or\\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\\n * @example\\n *\\n * _.isArrayLike([1, 2, 3]);\\n * // => true\\n *\\n * _.isArrayLike(document.body.children);\\n * // => true\\n *\\n * _.isArrayLike('abc');\\n * // => true\\n *\\n * _.isArrayLike(_.noop);\\n * // => false\\n */\\n function isArrayLike(value) {\\n return value != null && isLength(value.length) && !isFunction(value);\\n }\\n\\n /**\\n * This method is like `_.isArrayLike` except that it also checks if `value`\\n * is an object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an array-like object,\\n * else `false`.\\n * @example\\n *\\n * _.isArrayLikeObject([1, 2, 3]);\\n * // => true\\n *\\n * _.isArrayLikeObject(document.body.children);\\n * // => true\\n *\\n * _.isArrayLikeObject('abc');\\n * // => false\\n *\\n * _.isArrayLikeObject(_.noop);\\n * // => false\\n */\\n function isArrayLikeObject(value) {\\n return isObjectLike(value) && isArrayLike(value);\\n }\\n\\n /**\\n * Checks if `value` is classified as a boolean primitive or object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\\n * @example\\n *\\n * _.isBoolean(false);\\n * // => true\\n *\\n * _.isBoolean(null);\\n * // => false\\n */\\n function isBoolean(value) {\\n return value === true || value === false ||\\n (isObjectLike(value) && baseGetTag(value) == boolTag);\\n }\\n\\n /**\\n * Checks if `value` is a buffer.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\\n * @example\\n *\\n * _.isBuffer(new Buffer(2));\\n * // => true\\n *\\n * _.isBuffer(new Uint8Array(2));\\n * // => false\\n */\\n var isBuffer = nativeIsBuffer || stubFalse;\\n\\n /**\\n * Checks if `value` is classified as a `Date` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\\n * @example\\n *\\n * _.isDate(new Date);\\n * // => true\\n *\\n * _.isDate('Mon April 23 2012');\\n * // => false\\n */\\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\\n\\n /**\\n * Checks if `value` is likely a DOM element.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\\n * @example\\n *\\n * _.isElement(document.body);\\n * // => true\\n *\\n * _.isElement('');\\n * // => false\\n */\\n function isElement(value) {\\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\\n }\\n\\n /**\\n * Checks if `value` is an empty object, collection, map, or set.\\n *\\n * Objects are considered empty if they have no own enumerable string keyed\\n * properties.\\n *\\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\\n * jQuery-like collections are considered empty if they have a `length` of `0`.\\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\\n * @example\\n *\\n * _.isEmpty(null);\\n * // => true\\n *\\n * _.isEmpty(true);\\n * // => true\\n *\\n * _.isEmpty(1);\\n * // => true\\n *\\n * _.isEmpty([1, 2, 3]);\\n * // => false\\n *\\n * _.isEmpty({ 'a': 1 });\\n * // => false\\n */\\n function isEmpty(value) {\\n if (value == null) {\\n return true;\\n }\\n if (isArrayLike(value) &&\\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\\n return !value.length;\\n }\\n var tag = getTag(value);\\n if (tag == mapTag || tag == setTag) {\\n return !value.size;\\n }\\n if (isPrototype(value)) {\\n return !baseKeys(value).length;\\n }\\n for (var key in value) {\\n if (hasOwnProperty.call(value, key)) {\\n return false;\\n }\\n }\\n return true;\\n }\\n\\n /**\\n * Performs a deep comparison between two values to determine if they are\\n * equivalent.\\n *\\n * **Note:** This method supports comparing arrays, array buffers, booleans,\\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\\n * by their own, not inherited, enumerable properties. Functions and DOM\\n * nodes are compared by strict equality, i.e. `===`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1 };\\n * var other = { 'a': 1 };\\n *\\n * _.isEqual(object, other);\\n * // => true\\n *\\n * object === other;\\n * // => false\\n */\\n function isEqual(value, other) {\\n return baseIsEqual(value, other);\\n }\\n\\n /**\\n * This method is like `_.isEqual` except that it accepts `customizer` which\\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\\n * are handled by the method instead. The `customizer` is invoked with up to\\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\\n * @example\\n *\\n * function isGreeting(value) {\\n * return /^h(?:i|ello)$/.test(value);\\n * }\\n *\\n * function customizer(objValue, othValue) {\\n * if (isGreeting(objValue) && isGreeting(othValue)) {\\n * return true;\\n * }\\n * }\\n *\\n * var array = ['hello', 'goodbye'];\\n * var other = ['hi', 'goodbye'];\\n *\\n * _.isEqualWith(array, other, customizer);\\n * // => true\\n */\\n function isEqualWith(value, other, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n var result = customizer ? customizer(value, other) : undefined;\\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\\n }\\n\\n /**\\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\\n * `SyntaxError`, `TypeError`, or `URIError` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\\n * @example\\n *\\n * _.isError(new Error);\\n * // => true\\n *\\n * _.isError(Error);\\n * // => false\\n */\\n function isError(value) {\\n if (!isObjectLike(value)) {\\n return false;\\n }\\n var tag = baseGetTag(value);\\n return tag == errorTag || tag == domExcTag ||\\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\\n }\\n\\n /**\\n * Checks if `value` is a finite primitive number.\\n *\\n * **Note:** This method is based on\\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\\n * @example\\n *\\n * _.isFinite(3);\\n * // => true\\n *\\n * _.isFinite(Number.MIN_VALUE);\\n * // => true\\n *\\n * _.isFinite(Infinity);\\n * // => false\\n *\\n * _.isFinite('3');\\n * // => false\\n */\\n function isFinite(value) {\\n return typeof value == 'number' && nativeIsFinite(value);\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Function` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\\n * @example\\n *\\n * _.isFunction(_);\\n * // => true\\n *\\n * _.isFunction(/abc/);\\n * // => false\\n */\\n function isFunction(value) {\\n if (!isObject(value)) {\\n return false;\\n }\\n // The use of `Object#toString` avoids issues with the `typeof` operator\\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\\n var tag = baseGetTag(value);\\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\\n }\\n\\n /**\\n * Checks if `value` is an integer.\\n *\\n * **Note:** This method is based on\\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\\n * @example\\n *\\n * _.isInteger(3);\\n * // => true\\n *\\n * _.isInteger(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isInteger(Infinity);\\n * // => false\\n *\\n * _.isInteger('3');\\n * // => false\\n */\\n function isInteger(value) {\\n return typeof value == 'number' && value == toInteger(value);\\n }\\n\\n /**\\n * Checks if `value` is a valid array-like length.\\n *\\n * **Note:** This method is loosely based on\\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\\n * @example\\n *\\n * _.isLength(3);\\n * // => true\\n *\\n * _.isLength(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isLength(Infinity);\\n * // => false\\n *\\n * _.isLength('3');\\n * // => false\\n */\\n function isLength(value) {\\n return typeof value == 'number' &&\\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\\n }\\n\\n /**\\n * Checks if `value` is the\\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\\n * @example\\n *\\n * _.isObject({});\\n * // => true\\n *\\n * _.isObject([1, 2, 3]);\\n * // => true\\n *\\n * _.isObject(_.noop);\\n * // => true\\n *\\n * _.isObject(null);\\n * // => false\\n */\\n function isObject(value) {\\n var type = typeof value;\\n return value != null && (type == 'object' || type == 'function');\\n }\\n\\n /**\\n * Checks if `value` is object-like. A value is object-like if it's not `null`\\n * and has a `typeof` result of \\\"object\\\".\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\\n * @example\\n *\\n * _.isObjectLike({});\\n * // => true\\n *\\n * _.isObjectLike([1, 2, 3]);\\n * // => true\\n *\\n * _.isObjectLike(_.noop);\\n * // => false\\n *\\n * _.isObjectLike(null);\\n * // => false\\n */\\n function isObjectLike(value) {\\n return value != null && typeof value == 'object';\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Map` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\\n * @example\\n *\\n * _.isMap(new Map);\\n * // => true\\n *\\n * _.isMap(new WeakMap);\\n * // => false\\n */\\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\\n\\n /**\\n * Performs a partial deep comparison between `object` and `source` to\\n * determine if `object` contains equivalent property values.\\n *\\n * **Note:** This method is equivalent to `_.matches` when `source` is\\n * partially applied.\\n *\\n * Partial comparisons will match empty array and empty object `source`\\n * values against any array or object value, respectively. See `_.isEqual`\\n * for a list of supported value comparisons.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2 };\\n *\\n * _.isMatch(object, { 'b': 2 });\\n * // => true\\n *\\n * _.isMatch(object, { 'b': 1 });\\n * // => false\\n */\\n function isMatch(object, source) {\\n return object === source || baseIsMatch(object, source, getMatchData(source));\\n }\\n\\n /**\\n * This method is like `_.isMatch` except that it accepts `customizer` which\\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\\n * are handled by the method instead. The `customizer` is invoked with five\\n * arguments: (objValue, srcValue, index|key, object, source).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {Object} object The object to inspect.\\n * @param {Object} source The object of property values to match.\\n * @param {Function} [customizer] The function to customize comparisons.\\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\\n * @example\\n *\\n * function isGreeting(value) {\\n * return /^h(?:i|ello)$/.test(value);\\n * }\\n *\\n * function customizer(objValue, srcValue) {\\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\\n * return true;\\n * }\\n * }\\n *\\n * var object = { 'greeting': 'hello' };\\n * var source = { 'greeting': 'hi' };\\n *\\n * _.isMatchWith(object, source, customizer);\\n * // => true\\n */\\n function isMatchWith(object, source, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return baseIsMatch(object, source, getMatchData(source), customizer);\\n }\\n\\n /**\\n * Checks if `value` is `NaN`.\\n *\\n * **Note:** This method is based on\\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\\n * `undefined` and other non-number values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\\n * @example\\n *\\n * _.isNaN(NaN);\\n * // => true\\n *\\n * _.isNaN(new Number(NaN));\\n * // => true\\n *\\n * isNaN(undefined);\\n * // => true\\n *\\n * _.isNaN(undefined);\\n * // => false\\n */\\n function isNaN(value) {\\n // An `NaN` primitive is the only value that is not equal to itself.\\n // Perform the `toStringTag` check first to avoid errors with some\\n // ActiveX objects in IE.\\n return isNumber(value) && value != +value;\\n }\\n\\n /**\\n * Checks if `value` is a pristine native function.\\n *\\n * **Note:** This method can't reliably detect native functions in the presence\\n * of the core-js package because core-js circumvents this kind of detection.\\n * Despite multiple requests, the core-js maintainer has made it clear: any\\n * attempt to fix the detection will be obstructed. As a result, we're left\\n * with little choice but to throw an error. Unfortunately, this also affects\\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\\n * which rely on core-js.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a native function,\\n * else `false`.\\n * @example\\n *\\n * _.isNative(Array.prototype.push);\\n * // => true\\n *\\n * _.isNative(_);\\n * // => false\\n */\\n function isNative(value) {\\n if (isMaskable(value)) {\\n throw new Error(CORE_ERROR_TEXT);\\n }\\n return baseIsNative(value);\\n }\\n\\n /**\\n * Checks if `value` is `null`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\\n * @example\\n *\\n * _.isNull(null);\\n * // => true\\n *\\n * _.isNull(void 0);\\n * // => false\\n */\\n function isNull(value) {\\n return value === null;\\n }\\n\\n /**\\n * Checks if `value` is `null` or `undefined`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\\n * @example\\n *\\n * _.isNil(null);\\n * // => true\\n *\\n * _.isNil(void 0);\\n * // => true\\n *\\n * _.isNil(NaN);\\n * // => false\\n */\\n function isNil(value) {\\n return value == null;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Number` primitive or object.\\n *\\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\\n * classified as numbers, use the `_.isFinite` method.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\\n * @example\\n *\\n * _.isNumber(3);\\n * // => true\\n *\\n * _.isNumber(Number.MIN_VALUE);\\n * // => true\\n *\\n * _.isNumber(Infinity);\\n * // => true\\n *\\n * _.isNumber('3');\\n * // => false\\n */\\n function isNumber(value) {\\n return typeof value == 'number' ||\\n (isObjectLike(value) && baseGetTag(value) == numberTag);\\n }\\n\\n /**\\n * Checks if `value` is a plain object, that is, an object created by the\\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.8.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * _.isPlainObject(new Foo);\\n * // => false\\n *\\n * _.isPlainObject([1, 2, 3]);\\n * // => false\\n *\\n * _.isPlainObject({ 'x': 0, 'y': 0 });\\n * // => true\\n *\\n * _.isPlainObject(Object.create(null));\\n * // => true\\n */\\n function isPlainObject(value) {\\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\\n return false;\\n }\\n var proto = getPrototype(value);\\n if (proto === null) {\\n return true;\\n }\\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\\n funcToString.call(Ctor) == objectCtorString;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `RegExp` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.1.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\\n * @example\\n *\\n * _.isRegExp(/abc/);\\n * // => true\\n *\\n * _.isRegExp('/abc/');\\n * // => false\\n */\\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\\n\\n /**\\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\\n * double precision number which isn't the result of a rounded unsafe integer.\\n *\\n * **Note:** This method is based on\\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\\n * @example\\n *\\n * _.isSafeInteger(3);\\n * // => true\\n *\\n * _.isSafeInteger(Number.MIN_VALUE);\\n * // => false\\n *\\n * _.isSafeInteger(Infinity);\\n * // => false\\n *\\n * _.isSafeInteger('3');\\n * // => false\\n */\\n function isSafeInteger(value) {\\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Set` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\\n * @example\\n *\\n * _.isSet(new Set);\\n * // => true\\n *\\n * _.isSet(new WeakSet);\\n * // => false\\n */\\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\\n\\n /**\\n * Checks if `value` is classified as a `String` primitive or object.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\\n * @example\\n *\\n * _.isString('abc');\\n * // => true\\n *\\n * _.isString(1);\\n * // => false\\n */\\n function isString(value) {\\n return typeof value == 'string' ||\\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\\n }\\n\\n /**\\n * Checks if `value` is classified as a `Symbol` primitive or object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\\n * @example\\n *\\n * _.isSymbol(Symbol.iterator);\\n * // => true\\n *\\n * _.isSymbol('abc');\\n * // => false\\n */\\n function isSymbol(value) {\\n return typeof value == 'symbol' ||\\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\\n }\\n\\n /**\\n * Checks if `value` is classified as a typed array.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\\n * @example\\n *\\n * _.isTypedArray(new Uint8Array);\\n * // => true\\n *\\n * _.isTypedArray([]);\\n * // => false\\n */\\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\\n\\n /**\\n * Checks if `value` is `undefined`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\\n * @example\\n *\\n * _.isUndefined(void 0);\\n * // => true\\n *\\n * _.isUndefined(null);\\n * // => false\\n */\\n function isUndefined(value) {\\n return value === undefined;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `WeakMap` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\\n * @example\\n *\\n * _.isWeakMap(new WeakMap);\\n * // => true\\n *\\n * _.isWeakMap(new Map);\\n * // => false\\n */\\n function isWeakMap(value) {\\n return isObjectLike(value) && getTag(value) == weakMapTag;\\n }\\n\\n /**\\n * Checks if `value` is classified as a `WeakSet` object.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.3.0\\n * @category Lang\\n * @param {*} value The value to check.\\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\\n * @example\\n *\\n * _.isWeakSet(new WeakSet);\\n * // => true\\n *\\n * _.isWeakSet(new Set);\\n * // => false\\n */\\n function isWeakSet(value) {\\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\\n }\\n\\n /**\\n * Checks if `value` is less than `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than `other`,\\n * else `false`.\\n * @see _.gt\\n * @example\\n *\\n * _.lt(1, 3);\\n * // => true\\n *\\n * _.lt(3, 3);\\n * // => false\\n *\\n * _.lt(3, 1);\\n * // => false\\n */\\n var lt = createRelationalOperation(baseLt);\\n\\n /**\\n * Checks if `value` is less than or equal to `other`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.9.0\\n * @category Lang\\n * @param {*} value The value to compare.\\n * @param {*} other The other value to compare.\\n * @returns {boolean} Returns `true` if `value` is less than or equal to\\n * `other`, else `false`.\\n * @see _.gte\\n * @example\\n *\\n * _.lte(1, 3);\\n * // => true\\n *\\n * _.lte(3, 3);\\n * // => true\\n *\\n * _.lte(3, 1);\\n * // => false\\n */\\n var lte = createRelationalOperation(function(value, other) {\\n return value <= other;\\n });\\n\\n /**\\n * Converts `value` to an array.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {Array} Returns the converted array.\\n * @example\\n *\\n * _.toArray({ 'a': 1, 'b': 2 });\\n * // => [1, 2]\\n *\\n * _.toArray('abc');\\n * // => ['a', 'b', 'c']\\n *\\n * _.toArray(1);\\n * // => []\\n *\\n * _.toArray(null);\\n * // => []\\n */\\n function toArray(value) {\\n if (!value) {\\n return [];\\n }\\n if (isArrayLike(value)) {\\n return isString(value) ? stringToArray(value) : copyArray(value);\\n }\\n if (symIterator && value[symIterator]) {\\n return iteratorToArray(value[symIterator]());\\n }\\n var tag = getTag(value),\\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\\n\\n return func(value);\\n }\\n\\n /**\\n * Converts `value` to a finite number.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.12.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted number.\\n * @example\\n *\\n * _.toFinite(3.2);\\n * // => 3.2\\n *\\n * _.toFinite(Number.MIN_VALUE);\\n * // => 5e-324\\n *\\n * _.toFinite(Infinity);\\n * // => 1.7976931348623157e+308\\n *\\n * _.toFinite('3.2');\\n * // => 3.2\\n */\\n function toFinite(value) {\\n if (!value) {\\n return value === 0 ? value : 0;\\n }\\n value = toNumber(value);\\n if (value === INFINITY || value === -INFINITY) {\\n var sign = (value < 0 ? -1 : 1);\\n return sign * MAX_INTEGER;\\n }\\n return value === value ? value : 0;\\n }\\n\\n /**\\n * Converts `value` to an integer.\\n *\\n * **Note:** This method is loosely based on\\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toInteger(3.2);\\n * // => 3\\n *\\n * _.toInteger(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toInteger(Infinity);\\n * // => 1.7976931348623157e+308\\n *\\n * _.toInteger('3.2');\\n * // => 3\\n */\\n function toInteger(value) {\\n var result = toFinite(value),\\n remainder = result % 1;\\n\\n return result === result ? (remainder ? result - remainder : result) : 0;\\n }\\n\\n /**\\n * Converts `value` to an integer suitable for use as the length of an\\n * array-like object.\\n *\\n * **Note:** This method is based on\\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toLength(3.2);\\n * // => 3\\n *\\n * _.toLength(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toLength(Infinity);\\n * // => 4294967295\\n *\\n * _.toLength('3.2');\\n * // => 3\\n */\\n function toLength(value) {\\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\\n }\\n\\n /**\\n * Converts `value` to a number.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to process.\\n * @returns {number} Returns the number.\\n * @example\\n *\\n * _.toNumber(3.2);\\n * // => 3.2\\n *\\n * _.toNumber(Number.MIN_VALUE);\\n * // => 5e-324\\n *\\n * _.toNumber(Infinity);\\n * // => Infinity\\n *\\n * _.toNumber('3.2');\\n * // => 3.2\\n */\\n function toNumber(value) {\\n if (typeof value == 'number') {\\n return value;\\n }\\n if (isSymbol(value)) {\\n return NAN;\\n }\\n if (isObject(value)) {\\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\\n value = isObject(other) ? (other + '') : other;\\n }\\n if (typeof value != 'string') {\\n return value === 0 ? value : +value;\\n }\\n value = value.replace(reTrim, '');\\n var isBinary = reIsBinary.test(value);\\n return (isBinary || reIsOctal.test(value))\\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\\n : (reIsBadHex.test(value) ? NAN : +value);\\n }\\n\\n /**\\n * Converts `value` to a plain object flattening inherited enumerable string\\n * keyed properties of `value` to own properties of the plain object.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {Object} Returns the converted plain object.\\n * @example\\n *\\n * function Foo() {\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.assign({ 'a': 1 }, new Foo);\\n * // => { 'a': 1, 'b': 2 }\\n *\\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\\n * // => { 'a': 1, 'b': 2, 'c': 3 }\\n */\\n function toPlainObject(value) {\\n return copyObject(value, keysIn(value));\\n }\\n\\n /**\\n * Converts `value` to a safe integer. A safe integer can be compared and\\n * represented correctly.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.toSafeInteger(3.2);\\n * // => 3\\n *\\n * _.toSafeInteger(Number.MIN_VALUE);\\n * // => 0\\n *\\n * _.toSafeInteger(Infinity);\\n * // => 9007199254740991\\n *\\n * _.toSafeInteger('3.2');\\n * // => 3\\n */\\n function toSafeInteger(value) {\\n return value\\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\\n : (value === 0 ? value : 0);\\n }\\n\\n /**\\n * Converts `value` to a string. An empty string is returned for `null`\\n * and `undefined` values. The sign of `-0` is preserved.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Lang\\n * @param {*} value The value to convert.\\n * @returns {string} Returns the converted string.\\n * @example\\n *\\n * _.toString(null);\\n * // => ''\\n *\\n * _.toString(-0);\\n * // => '-0'\\n *\\n * _.toString([1, 2, 3]);\\n * // => '1,2,3'\\n */\\n function toString(value) {\\n return value == null ? '' : baseToString(value);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Assigns own enumerable string keyed properties of source objects to the\\n * destination object. Source objects are applied from left to right.\\n * Subsequent sources overwrite property assignments of previous sources.\\n *\\n * **Note:** This method mutates `object` and is loosely based on\\n * [`Object.assign`](https://mdn.io/Object/assign).\\n *\\n * @static\\n * @memberOf _\\n * @since 0.10.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.assignIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * function Bar() {\\n * this.c = 3;\\n * }\\n *\\n * Foo.prototype.b = 2;\\n * Bar.prototype.d = 4;\\n *\\n * _.assign({ 'a': 0 }, new Foo, new Bar);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n var assign = createAssigner(function(object, source) {\\n if (isPrototype(source) || isArrayLike(source)) {\\n copyObject(source, keys(source), object);\\n return;\\n }\\n for (var key in source) {\\n if (hasOwnProperty.call(source, key)) {\\n assignValue(object, key, source[key]);\\n }\\n }\\n });\\n\\n /**\\n * This method is like `_.assign` except that it iterates over own and\\n * inherited source properties.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias extend\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.assign\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * }\\n *\\n * function Bar() {\\n * this.c = 3;\\n * }\\n *\\n * Foo.prototype.b = 2;\\n * Bar.prototype.d = 4;\\n *\\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\\n */\\n var assignIn = createAssigner(function(object, source) {\\n copyObject(source, keysIn(source), object);\\n });\\n\\n /**\\n * This method is like `_.assignIn` except that it accepts `customizer`\\n * which is invoked to produce the assigned values. If `customizer` returns\\n * `undefined`, assignment is handled by the method instead. The `customizer`\\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias extendWith\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @see _.assignWith\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * return _.isUndefined(objValue) ? srcValue : objValue;\\n * }\\n *\\n * var defaults = _.partialRight(_.assignInWith, customizer);\\n *\\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\\n copyObject(source, keysIn(source), object, customizer);\\n });\\n\\n /**\\n * This method is like `_.assign` except that it accepts `customizer`\\n * which is invoked to produce the assigned values. If `customizer` returns\\n * `undefined`, assignment is handled by the method instead. The `customizer`\\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @see _.assignInWith\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * return _.isUndefined(objValue) ? srcValue : objValue;\\n * }\\n *\\n * var defaults = _.partialRight(_.assignWith, customizer);\\n *\\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\\n copyObject(source, keys(source), object, customizer);\\n });\\n\\n /**\\n * Creates an array of values corresponding to `paths` of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Array} Returns the picked values.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\\n *\\n * _.at(object, ['a[0].b.c', 'a[1]']);\\n * // => [3, 4]\\n */\\n var at = flatRest(baseAt);\\n\\n /**\\n * Creates an object that inherits from the `prototype` object. If a\\n * `properties` object is given, its own enumerable string keyed properties\\n * are assigned to the created object.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.3.0\\n * @category Object\\n * @param {Object} prototype The object to inherit from.\\n * @param {Object} [properties] The properties to assign to the object.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * function Shape() {\\n * this.x = 0;\\n * this.y = 0;\\n * }\\n *\\n * function Circle() {\\n * Shape.call(this);\\n * }\\n *\\n * Circle.prototype = _.create(Shape.prototype, {\\n * 'constructor': Circle\\n * });\\n *\\n * var circle = new Circle;\\n * circle instanceof Circle;\\n * // => true\\n *\\n * circle instanceof Shape;\\n * // => true\\n */\\n function create(prototype, properties) {\\n var result = baseCreate(prototype);\\n return properties == null ? result : baseAssign(result, properties);\\n }\\n\\n /**\\n * Assigns own and inherited enumerable string keyed properties of source\\n * objects to the destination object for all destination properties that\\n * resolve to `undefined`. Source objects are applied from left to right.\\n * Once a property is set, additional values of the same property are ignored.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.defaultsDeep\\n * @example\\n *\\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\\n * // => { 'a': 1, 'b': 2 }\\n */\\n var defaults = baseRest(function(args) {\\n args.push(undefined, customDefaultsAssignIn);\\n return apply(assignInWith, undefined, args);\\n });\\n\\n /**\\n * This method is like `_.defaults` except that it recursively assigns\\n * default properties.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.10.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @see _.defaults\\n * @example\\n *\\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\\n * // => { 'a': { 'b': 2, 'c': 3 } }\\n */\\n var defaultsDeep = baseRest(function(args) {\\n args.push(undefined, customDefaultsMerge);\\n return apply(mergeWith, undefined, args);\\n });\\n\\n /**\\n * This method is like `_.find` except that it returns the key of the first\\n * element `predicate` returns truthy for instead of the element itself.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {string|undefined} Returns the key of the matched element,\\n * else `undefined`.\\n * @example\\n *\\n * var users = {\\n * 'barney': { 'age': 36, 'active': true },\\n * 'fred': { 'age': 40, 'active': false },\\n * 'pebbles': { 'age': 1, 'active': true }\\n * };\\n *\\n * _.findKey(users, function(o) { return o.age < 40; });\\n * // => 'barney' (iteration order is not guaranteed)\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findKey(users, { 'age': 1, 'active': true });\\n * // => 'pebbles'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findKey(users, ['active', false]);\\n * // => 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findKey(users, 'active');\\n * // => 'barney'\\n */\\n function findKey(object, predicate) {\\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\\n }\\n\\n /**\\n * This method is like `_.findKey` except that it iterates over elements of\\n * a collection in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\\n * @returns {string|undefined} Returns the key of the matched element,\\n * else `undefined`.\\n * @example\\n *\\n * var users = {\\n * 'barney': { 'age': 36, 'active': true },\\n * 'fred': { 'age': 40, 'active': false },\\n * 'pebbles': { 'age': 1, 'active': true }\\n * };\\n *\\n * _.findLastKey(users, function(o) { return o.age < 40; });\\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\\n *\\n * // The `_.matches` iteratee shorthand.\\n * _.findLastKey(users, { 'age': 36, 'active': true });\\n * // => 'barney'\\n *\\n * // The `_.matchesProperty` iteratee shorthand.\\n * _.findLastKey(users, ['active', false]);\\n * // => 'fred'\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.findLastKey(users, 'active');\\n * // => 'pebbles'\\n */\\n function findLastKey(object, predicate) {\\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\\n }\\n\\n /**\\n * Iterates over own and inherited enumerable string keyed properties of an\\n * object and invokes `iteratee` for each property. The iteratee is invoked\\n * with three arguments: (value, key, object). Iteratee functions may exit\\n * iteration early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forInRight\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forIn(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\\n */\\n function forIn(object, iteratee) {\\n return object == null\\n ? object\\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\\n }\\n\\n /**\\n * This method is like `_.forIn` except that it iterates over properties of\\n * `object` in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forInRight(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\\n */\\n function forInRight(object, iteratee) {\\n return object == null\\n ? object\\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\\n }\\n\\n /**\\n * Iterates over own enumerable string keyed properties of an object and\\n * invokes `iteratee` for each property. The iteratee is invoked with three\\n * arguments: (value, key, object). Iteratee functions may exit iteration\\n * early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forOwnRight\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forOwn(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\\n */\\n function forOwn(object, iteratee) {\\n return object && baseForOwn(object, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * This method is like `_.forOwn` except that it iterates over properties of\\n * `object` in the opposite order.\\n *\\n * @static\\n * @memberOf _\\n * @since 2.0.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns `object`.\\n * @see _.forOwn\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.forOwnRight(new Foo, function(value, key) {\\n * console.log(key);\\n * });\\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\\n */\\n function forOwnRight(object, iteratee) {\\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\\n }\\n\\n /**\\n * Creates an array of function property names from own enumerable properties\\n * of `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @returns {Array} Returns the function names.\\n * @see _.functionsIn\\n * @example\\n *\\n * function Foo() {\\n * this.a = _.constant('a');\\n * this.b = _.constant('b');\\n * }\\n *\\n * Foo.prototype.c = _.constant('c');\\n *\\n * _.functions(new Foo);\\n * // => ['a', 'b']\\n */\\n function functions(object) {\\n return object == null ? [] : baseFunctions(object, keys(object));\\n }\\n\\n /**\\n * Creates an array of function property names from own and inherited\\n * enumerable properties of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to inspect.\\n * @returns {Array} Returns the function names.\\n * @see _.functions\\n * @example\\n *\\n * function Foo() {\\n * this.a = _.constant('a');\\n * this.b = _.constant('b');\\n * }\\n *\\n * Foo.prototype.c = _.constant('c');\\n *\\n * _.functionsIn(new Foo);\\n * // => ['a', 'b', 'c']\\n */\\n function functionsIn(object) {\\n return object == null ? [] : baseFunctions(object, keysIn(object));\\n }\\n\\n /**\\n * Gets the value at `path` of `object`. If the resolved value is\\n * `undefined`, the `defaultValue` is returned in its place.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.7.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to get.\\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\\n * @returns {*} Returns the resolved value.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.get(object, 'a[0].b.c');\\n * // => 3\\n *\\n * _.get(object, ['a', '0', 'b', 'c']);\\n * // => 3\\n *\\n * _.get(object, 'a.b.c', 'default');\\n * // => 'default'\\n */\\n function get(object, path, defaultValue) {\\n var result = object == null ? undefined : baseGet(object, path);\\n return result === undefined ? defaultValue : result;\\n }\\n\\n /**\\n * Checks if `path` is a direct property of `object`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n * @example\\n *\\n * var object = { 'a': { 'b': 2 } };\\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\\n *\\n * _.has(object, 'a');\\n * // => true\\n *\\n * _.has(object, 'a.b');\\n * // => true\\n *\\n * _.has(object, ['a', 'b']);\\n * // => true\\n *\\n * _.has(other, 'a');\\n * // => false\\n */\\n function has(object, path) {\\n return object != null && hasPath(object, path, baseHas);\\n }\\n\\n /**\\n * Checks if `path` is a direct or inherited property of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path to check.\\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\\n * @example\\n *\\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\\n *\\n * _.hasIn(object, 'a');\\n * // => true\\n *\\n * _.hasIn(object, 'a.b');\\n * // => true\\n *\\n * _.hasIn(object, ['a', 'b']);\\n * // => true\\n *\\n * _.hasIn(object, 'b');\\n * // => false\\n */\\n function hasIn(object, path) {\\n return object != null && hasPath(object, path, baseHasIn);\\n }\\n\\n /**\\n * Creates an object composed of the inverted keys and values of `object`.\\n * If `object` contains duplicate values, subsequent values overwrite\\n * property assignments of previous values.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.7.0\\n * @category Object\\n * @param {Object} object The object to invert.\\n * @returns {Object} Returns the new inverted object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\\n *\\n * _.invert(object);\\n * // => { '1': 'c', '2': 'b' }\\n */\\n var invert = createInverter(function(result, value, key) {\\n result[value] = key;\\n }, constant(identity));\\n\\n /**\\n * This method is like `_.invert` except that the inverted object is generated\\n * from the results of running each element of `object` thru `iteratee`. The\\n * corresponding inverted value of each inverted key is an array of keys\\n * responsible for generating the inverted value. The iteratee is invoked\\n * with one argument: (value).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.1.0\\n * @category Object\\n * @param {Object} object The object to invert.\\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\\n * @returns {Object} Returns the new inverted object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\\n *\\n * _.invertBy(object);\\n * // => { '1': ['a', 'c'], '2': ['b'] }\\n *\\n * _.invertBy(object, function(value) {\\n * return 'group' + value;\\n * });\\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\\n */\\n var invertBy = createInverter(function(result, value, key) {\\n if (hasOwnProperty.call(result, value)) {\\n result[value].push(key);\\n } else {\\n result[value] = [key];\\n }\\n }, getIteratee);\\n\\n /**\\n * Invokes the method at `path` of `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the method to invoke.\\n * @param {...*} [args] The arguments to invoke the method with.\\n * @returns {*} Returns the result of the invoked method.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\\n *\\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\\n * // => [2, 3]\\n */\\n var invoke = baseRest(baseInvoke);\\n\\n /**\\n * Creates an array of the own enumerable property names of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects. See the\\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\\n * for more details.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.keys(new Foo);\\n * // => ['a', 'b'] (iteration order is not guaranteed)\\n *\\n * _.keys('hi');\\n * // => ['0', '1']\\n */\\n function keys(object) {\\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\\n }\\n\\n /**\\n * Creates an array of the own and inherited enumerable property names of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property names.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.keysIn(new Foo);\\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\\n */\\n function keysIn(object) {\\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\\n }\\n\\n /**\\n * The opposite of `_.mapValues`; this method creates an object with the\\n * same values as `object` and keys generated by running each own enumerable\\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\\n * with three arguments: (value, key, object).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.8.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns the new mapped object.\\n * @see _.mapValues\\n * @example\\n *\\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\\n * return key + value;\\n * });\\n * // => { 'a1': 1, 'b2': 2 }\\n */\\n function mapKeys(object, iteratee) {\\n var result = {};\\n iteratee = getIteratee(iteratee, 3);\\n\\n baseForOwn(object, function(value, key, object) {\\n baseAssignValue(result, iteratee(value, key, object), value);\\n });\\n return result;\\n }\\n\\n /**\\n * Creates an object with the same keys as `object` and values generated\\n * by running each own enumerable string keyed property of `object` thru\\n * `iteratee`. The iteratee is invoked with three arguments:\\n * (value, key, object).\\n *\\n * @static\\n * @memberOf _\\n * @since 2.4.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @returns {Object} Returns the new mapped object.\\n * @see _.mapKeys\\n * @example\\n *\\n * var users = {\\n * 'fred': { 'user': 'fred', 'age': 40 },\\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\\n * };\\n *\\n * _.mapValues(users, function(o) { return o.age; });\\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\\n *\\n * // The `_.property` iteratee shorthand.\\n * _.mapValues(users, 'age');\\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\\n */\\n function mapValues(object, iteratee) {\\n var result = {};\\n iteratee = getIteratee(iteratee, 3);\\n\\n baseForOwn(object, function(value, key, object) {\\n baseAssignValue(result, key, iteratee(value, key, object));\\n });\\n return result;\\n }\\n\\n /**\\n * This method is like `_.assign` except that it recursively merges own and\\n * inherited enumerable string keyed properties of source objects into the\\n * destination object. Source properties that resolve to `undefined` are\\n * skipped if a destination value exists. Array and plain object properties\\n * are merged recursively. Other objects and value types are overridden by\\n * assignment. Source objects are applied from left to right. Subsequent\\n * sources overwrite property assignments of previous sources.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.5.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} [sources] The source objects.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {\\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\\n * };\\n *\\n * var other = {\\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\\n * };\\n *\\n * _.merge(object, other);\\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\\n */\\n var merge = createAssigner(function(object, source, srcIndex) {\\n baseMerge(object, source, srcIndex);\\n });\\n\\n /**\\n * This method is like `_.merge` except that it accepts `customizer` which\\n * is invoked to produce the merged values of the destination and source\\n * properties. If `customizer` returns `undefined`, merging is handled by the\\n * method instead. The `customizer` is invoked with six arguments:\\n * (objValue, srcValue, key, object, source, stack).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The destination object.\\n * @param {...Object} sources The source objects.\\n * @param {Function} customizer The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * function customizer(objValue, srcValue) {\\n * if (_.isArray(objValue)) {\\n * return objValue.concat(srcValue);\\n * }\\n * }\\n *\\n * var object = { 'a': [1], 'b': [2] };\\n * var other = { 'a': [3], 'b': [4] };\\n *\\n * _.mergeWith(object, other, customizer);\\n * // => { 'a': [1, 3], 'b': [2, 4] }\\n */\\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\\n baseMerge(object, source, srcIndex, customizer);\\n });\\n\\n /**\\n * The opposite of `_.pick`; this method creates an object composed of the\\n * own and inherited enumerable property paths of `object` that are not omitted.\\n *\\n * **Note:** This method is considerably slower than `_.pick`.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {...(string|string[])} [paths] The property paths to omit.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.omit(object, ['a', 'c']);\\n * // => { 'b': '2' }\\n */\\n var omit = flatRest(function(object, paths) {\\n var result = {};\\n if (object == null) {\\n return result;\\n }\\n var isDeep = false;\\n paths = arrayMap(paths, function(path) {\\n path = castPath(path, object);\\n isDeep || (isDeep = path.length > 1);\\n return path;\\n });\\n copyObject(object, getAllKeysIn(object), result);\\n if (isDeep) {\\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\\n }\\n var length = paths.length;\\n while (length--) {\\n baseUnset(result, paths[length]);\\n }\\n return result;\\n });\\n\\n /**\\n * The opposite of `_.pickBy`; this method creates an object composed of\\n * the own and inherited enumerable string keyed properties of `object` that\\n * `predicate` doesn't return truthy for. The predicate is invoked with two\\n * arguments: (value, key).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {Function} [predicate=_.identity] The function invoked per property.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.omitBy(object, _.isNumber);\\n * // => { 'b': '2' }\\n */\\n function omitBy(object, predicate) {\\n return pickBy(object, negate(getIteratee(predicate)));\\n }\\n\\n /**\\n * Creates an object composed of the picked `object` properties.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {...(string|string[])} [paths] The property paths to pick.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.pick(object, ['a', 'c']);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n var pick = flatRest(function(object, paths) {\\n return object == null ? {} : basePick(object, paths);\\n });\\n\\n /**\\n * Creates an object composed of the `object` properties `predicate` returns\\n * truthy for. The predicate is invoked with two arguments: (value, key).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The source object.\\n * @param {Function} [predicate=_.identity] The function invoked per property.\\n * @returns {Object} Returns the new object.\\n * @example\\n *\\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\\n *\\n * _.pickBy(object, _.isNumber);\\n * // => { 'a': 1, 'c': 3 }\\n */\\n function pickBy(object, predicate) {\\n if (object == null) {\\n return {};\\n }\\n var props = arrayMap(getAllKeysIn(object), function(prop) {\\n return [prop];\\n });\\n predicate = getIteratee(predicate);\\n return basePickBy(object, props, function(value, path) {\\n return predicate(value, path[0]);\\n });\\n }\\n\\n /**\\n * This method is like `_.get` except that if the resolved value is a\\n * function it's invoked with the `this` binding of its parent object and\\n * its result is returned.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @param {Array|string} path The path of the property to resolve.\\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\\n * @returns {*} Returns the resolved value.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\\n *\\n * _.result(object, 'a[0].b.c1');\\n * // => 3\\n *\\n * _.result(object, 'a[0].b.c2');\\n * // => 4\\n *\\n * _.result(object, 'a[0].b.c3', 'default');\\n * // => 'default'\\n *\\n * _.result(object, 'a[0].b.c3', _.constant('default'));\\n * // => 'default'\\n */\\n function result(object, path, defaultValue) {\\n path = castPath(path, object);\\n\\n var index = -1,\\n length = path.length;\\n\\n // Ensure the loop is entered when path is empty.\\n if (!length) {\\n length = 1;\\n object = undefined;\\n }\\n while (++index < length) {\\n var value = object == null ? undefined : object[toKey(path[index])];\\n if (value === undefined) {\\n index = length;\\n value = defaultValue;\\n }\\n object = isFunction(value) ? value.call(object) : value;\\n }\\n return object;\\n }\\n\\n /**\\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\\n * it's created. Arrays are created for missing index properties while objects\\n * are created for all other missing properties. Use `_.setWith` to customize\\n * `path` creation.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.7.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.set(object, 'a[0].b.c', 4);\\n * console.log(object.a[0].b.c);\\n * // => 4\\n *\\n * _.set(object, ['x', '0', 'y', 'z'], 5);\\n * console.log(object.x[0].y.z);\\n * // => 5\\n */\\n function set(object, path, value) {\\n return object == null ? object : baseSet(object, path, value);\\n }\\n\\n /**\\n * This method is like `_.set` except that it accepts `customizer` which is\\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\\n * path creation is handled by the method instead. The `customizer` is invoked\\n * with three arguments: (nsValue, key, nsObject).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {*} value The value to set.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {};\\n *\\n * _.setWith(object, '[0][1]', 'a', Object);\\n * // => { '0': { '1': 'a' } }\\n */\\n function setWith(object, path, value, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return object == null ? object : baseSet(object, path, value, customizer);\\n }\\n\\n /**\\n * Creates an array of own enumerable string keyed-value pairs for `object`\\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\\n * entries are returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias entries\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the key-value pairs.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.toPairs(new Foo);\\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\\n */\\n var toPairs = createToPairs(keys);\\n\\n /**\\n * Creates an array of own and inherited enumerable string keyed-value pairs\\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\\n * or set, its entries are returned.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @alias entriesIn\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the key-value pairs.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.toPairsIn(new Foo);\\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\\n */\\n var toPairsIn = createToPairs(keysIn);\\n\\n /**\\n * An alternative to `_.reduce`; this method transforms `object` to a new\\n * `accumulator` object which is the result of running each of its own\\n * enumerable string keyed properties thru `iteratee`, with each invocation\\n * potentially mutating the `accumulator` object. If `accumulator` is not\\n * provided, a new object with the same `[[Prototype]]` will be used. The\\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\\n * Iteratee functions may exit iteration early by explicitly returning `false`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.3.0\\n * @category Object\\n * @param {Object} object The object to iterate over.\\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\\n * @param {*} [accumulator] The custom accumulator value.\\n * @returns {*} Returns the accumulated value.\\n * @example\\n *\\n * _.transform([2, 3, 4], function(result, n) {\\n * result.push(n *= n);\\n * return n % 2 == 0;\\n * }, []);\\n * // => [4, 9]\\n *\\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\\n * (result[value] || (result[value] = [])).push(key);\\n * }, {});\\n * // => { '1': ['a', 'c'], '2': ['b'] }\\n */\\n function transform(object, iteratee, accumulator) {\\n var isArr = isArray(object),\\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\\n\\n iteratee = getIteratee(iteratee, 4);\\n if (accumulator == null) {\\n var Ctor = object && object.constructor;\\n if (isArrLike) {\\n accumulator = isArr ? new Ctor : [];\\n }\\n else if (isObject(object)) {\\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\\n }\\n else {\\n accumulator = {};\\n }\\n }\\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\\n return iteratee(accumulator, value, index, object);\\n });\\n return accumulator;\\n }\\n\\n /**\\n * Removes the property at `path` of `object`.\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to unset.\\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\\n * _.unset(object, 'a[0].b.c');\\n * // => true\\n *\\n * console.log(object);\\n * // => { 'a': [{ 'b': {} }] };\\n *\\n * _.unset(object, ['a', '0', 'b', 'c']);\\n * // => true\\n *\\n * console.log(object);\\n * // => { 'a': [{ 'b': {} }] };\\n */\\n function unset(object, path) {\\n return object == null ? true : baseUnset(object, path);\\n }\\n\\n /**\\n * This method is like `_.set` except that accepts `updater` to produce the\\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\\n * is invoked with one argument: (value).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {Function} updater The function to produce the updated value.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\\n *\\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\\n * console.log(object.a[0].b.c);\\n * // => 9\\n *\\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\\n * console.log(object.x[0].y.z);\\n * // => 0\\n */\\n function update(object, path, updater) {\\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\\n }\\n\\n /**\\n * This method is like `_.update` except that it accepts `customizer` which is\\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\\n * path creation is handled by the method instead. The `customizer` is invoked\\n * with three arguments: (nsValue, key, nsObject).\\n *\\n * **Note:** This method mutates `object`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.6.0\\n * @category Object\\n * @param {Object} object The object to modify.\\n * @param {Array|string} path The path of the property to set.\\n * @param {Function} updater The function to produce the updated value.\\n * @param {Function} [customizer] The function to customize assigned values.\\n * @returns {Object} Returns `object`.\\n * @example\\n *\\n * var object = {};\\n *\\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\\n * // => { '0': { '1': 'a' } }\\n */\\n function updateWith(object, path, updater, customizer) {\\n customizer = typeof customizer == 'function' ? customizer : undefined;\\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\\n }\\n\\n /**\\n * Creates an array of the own enumerable string keyed property values of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property values.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.values(new Foo);\\n * // => [1, 2] (iteration order is not guaranteed)\\n *\\n * _.values('hi');\\n * // => ['h', 'i']\\n */\\n function values(object) {\\n return object == null ? [] : baseValues(object, keys(object));\\n }\\n\\n /**\\n * Creates an array of the own and inherited enumerable string keyed property\\n * values of `object`.\\n *\\n * **Note:** Non-object values are coerced to objects.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category Object\\n * @param {Object} object The object to query.\\n * @returns {Array} Returns the array of property values.\\n * @example\\n *\\n * function Foo() {\\n * this.a = 1;\\n * this.b = 2;\\n * }\\n *\\n * Foo.prototype.c = 3;\\n *\\n * _.valuesIn(new Foo);\\n * // => [1, 2, 3] (iteration order is not guaranteed)\\n */\\n function valuesIn(object) {\\n return object == null ? [] : baseValues(object, keysIn(object));\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category Number\\n * @param {number} number The number to clamp.\\n * @param {number} [lower] The lower bound.\\n * @param {number} upper The upper bound.\\n * @returns {number} Returns the clamped number.\\n * @example\\n *\\n * _.clamp(-10, -5, 5);\\n * // => -5\\n *\\n * _.clamp(10, -5, 5);\\n * // => 5\\n */\\n function clamp(number, lower, upper) {\\n if (upper === undefined) {\\n upper = lower;\\n lower = undefined;\\n }\\n if (upper !== undefined) {\\n upper = toNumber(upper);\\n upper = upper === upper ? upper : 0;\\n }\\n if (lower !== undefined) {\\n lower = toNumber(lower);\\n lower = lower === lower ? lower : 0;\\n }\\n return baseClamp(toNumber(number), lower, upper);\\n }\\n\\n /**\\n * Checks if `n` is between `start` and up to, but not including, `end`. If\\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\\n * If `start` is greater than `end` the params are swapped to support\\n * negative ranges.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.3.0\\n * @category Number\\n * @param {number} number The number to check.\\n * @param {number} [start=0] The start of the range.\\n * @param {number} end The end of the range.\\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\\n * @see _.range, _.rangeRight\\n * @example\\n *\\n * _.inRange(3, 2, 4);\\n * // => true\\n *\\n * _.inRange(4, 8);\\n * // => true\\n *\\n * _.inRange(4, 2);\\n * // => false\\n *\\n * _.inRange(2, 2);\\n * // => false\\n *\\n * _.inRange(1.2, 2);\\n * // => true\\n *\\n * _.inRange(5.2, 4);\\n * // => false\\n *\\n * _.inRange(-3, -2, -6);\\n * // => true\\n */\\n function inRange(number, start, end) {\\n start = toFinite(start);\\n if (end === undefined) {\\n end = start;\\n start = 0;\\n } else {\\n end = toFinite(end);\\n }\\n number = toNumber(number);\\n return baseInRange(number, start, end);\\n }\\n\\n /**\\n * Produces a random number between the inclusive `lower` and `upper` bounds.\\n * If only one argument is provided a number between `0` and the given number\\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\\n * floats, a floating-point number is returned instead of an integer.\\n *\\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\\n * floating-point values which can produce unexpected results.\\n *\\n * @static\\n * @memberOf _\\n * @since 0.7.0\\n * @category Number\\n * @param {number} [lower=0] The lower bound.\\n * @param {number} [upper=1] The upper bound.\\n * @param {boolean} [floating] Specify returning a floating-point number.\\n * @returns {number} Returns the random number.\\n * @example\\n *\\n * _.random(0, 5);\\n * // => an integer between 0 and 5\\n *\\n * _.random(5);\\n * // => also an integer between 0 and 5\\n *\\n * _.random(5, true);\\n * // => a floating-point number between 0 and 5\\n *\\n * _.random(1.2, 5.2);\\n * // => a floating-point number between 1.2 and 5.2\\n */\\n function random(lower, upper, floating) {\\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\\n upper = floating = undefined;\\n }\\n if (floating === undefined) {\\n if (typeof upper == 'boolean') {\\n floating = upper;\\n upper = undefined;\\n }\\n else if (typeof lower == 'boolean') {\\n floating = lower;\\n lower = undefined;\\n }\\n }\\n if (lower === undefined && upper === undefined) {\\n lower = 0;\\n upper = 1;\\n }\\n else {\\n lower = toFinite(lower);\\n if (upper === undefined) {\\n upper = lower;\\n lower = 0;\\n } else {\\n upper = toFinite(upper);\\n }\\n }\\n if (lower > upper) {\\n var temp = lower;\\n lower = upper;\\n upper = temp;\\n }\\n if (floating || lower % 1 || upper % 1) {\\n var rand = nativeRandom();\\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\\n }\\n return baseRandom(lower, upper);\\n }\\n\\n /*------------------------------------------------------------------------*/\\n\\n /**\\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the camel cased string.\\n * @example\\n *\\n * _.camelCase('Foo Bar');\\n * // => 'fooBar'\\n *\\n * _.camelCase('--foo-bar--');\\n * // => 'fooBar'\\n *\\n * _.camelCase('__FOO_BAR__');\\n * // => 'fooBar'\\n */\\n var camelCase = createCompounder(function(result, word, index) {\\n word = word.toLowerCase();\\n return result + (index ? capitalize(word) : word);\\n });\\n\\n /**\\n * Converts the first character of `string` to upper case and the remaining\\n * to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to capitalize.\\n * @returns {string} Returns the capitalized string.\\n * @example\\n *\\n * _.capitalize('FRED');\\n * // => 'Fred'\\n */\\n function capitalize(string) {\\n return upperFirst(toString(string).toLowerCase());\\n }\\n\\n /**\\n * Deburrs `string` by converting\\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\\n * letters to basic Latin letters and removing\\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to deburr.\\n * @returns {string} Returns the deburred string.\\n * @example\\n *\\n * _.deburr('déjà vu');\\n * // => 'deja vu'\\n */\\n function deburr(string) {\\n string = toString(string);\\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\\n }\\n\\n /**\\n * Checks if `string` ends with the given target string.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to inspect.\\n * @param {string} [target] The string to search for.\\n * @param {number} [position=string.length] The position to search up to.\\n * @returns {boolean} Returns `true` if `string` ends with `target`,\\n * else `false`.\\n * @example\\n *\\n * _.endsWith('abc', 'c');\\n * // => true\\n *\\n * _.endsWith('abc', 'b');\\n * // => false\\n *\\n * _.endsWith('abc', 'b', 2);\\n * // => true\\n */\\n function endsWith(string, target, position) {\\n string = toString(string);\\n target = baseToString(target);\\n\\n var length = string.length;\\n position = position === undefined\\n ? length\\n : baseClamp(toInteger(position), 0, length);\\n\\n var end = position;\\n position -= target.length;\\n return position >= 0 && string.slice(position, end) == target;\\n }\\n\\n /**\\n * Converts the characters \\\"&\\\", \\\"<\\\", \\\">\\\", '\\\"', and \\\"'\\\" in `string` to their\\n * corresponding HTML entities.\\n *\\n * **Note:** No other characters are escaped. To escape additional\\n * characters use a third-party library like [_he_](https://mths.be/he).\\n *\\n * Though the \\\">\\\" character is escaped for symmetry, characters like\\n * \\\">\\\" and \\\"/\\\" don't need escaping in HTML and have no special meaning\\n * unless they're part of a tag or unquoted attribute value. See\\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\\n * (under \\\"semi-related fun fact\\\") for more details.\\n *\\n * When working with HTML you should always\\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\\n * XSS vectors.\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category String\\n * @param {string} [string=''] The string to escape.\\n * @returns {string} Returns the escaped string.\\n * @example\\n *\\n * _.escape('fred, barney, & pebbles');\\n * // => 'fred, barney, & pebbles'\\n */\\n function escape(string) {\\n string = toString(string);\\n return (string && reHasUnescapedHtml.test(string))\\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\\n : string;\\n }\\n\\n /**\\n * Escapes the `RegExp` special characters \\\"^\\\", \\\"$\\\", \\\"\\\\\\\", \\\".\\\", \\\"*\\\", \\\"+\\\",\\n * \\\"?\\\", \\\"(\\\", \\\")\\\", \\\"[\\\", \\\"]\\\", \\\"{\\\", \\\"}\\\", and \\\"|\\\" in `string`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to escape.\\n * @returns {string} Returns the escaped string.\\n * @example\\n *\\n * _.escapeRegExp('[lodash](https://lodash.com/)');\\n * // => '\\\\[lodash\\\\]\\\\(https://lodash\\\\.com/\\\\)'\\n */\\n function escapeRegExp(string) {\\n string = toString(string);\\n return (string && reHasRegExpChar.test(string))\\n ? string.replace(reRegExpChar, '\\\\\\\\$&')\\n : string;\\n }\\n\\n /**\\n * Converts `string` to\\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the kebab cased string.\\n * @example\\n *\\n * _.kebabCase('Foo Bar');\\n * // => 'foo-bar'\\n *\\n * _.kebabCase('fooBar');\\n * // => 'foo-bar'\\n *\\n * _.kebabCase('__FOO_BAR__');\\n * // => 'foo-bar'\\n */\\n var kebabCase = createCompounder(function(result, word, index) {\\n return result + (index ? '-' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Converts `string`, as space separated words, to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the lower cased string.\\n * @example\\n *\\n * _.lowerCase('--Foo-Bar--');\\n * // => 'foo bar'\\n *\\n * _.lowerCase('fooBar');\\n * // => 'foo bar'\\n *\\n * _.lowerCase('__FOO_BAR__');\\n * // => 'foo bar'\\n */\\n var lowerCase = createCompounder(function(result, word, index) {\\n return result + (index ? ' ' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Converts the first character of `string` to lower case.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the converted string.\\n * @example\\n *\\n * _.lowerFirst('Fred');\\n * // => 'fred'\\n *\\n * _.lowerFirst('FRED');\\n * // => 'fRED'\\n */\\n var lowerFirst = createCaseFirst('toLowerCase');\\n\\n /**\\n * Pads `string` on the left and right sides if it's shorter than `length`.\\n * Padding characters are truncated if they can't be evenly divided by `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.pad('abc', 8);\\n * // => ' abc '\\n *\\n * _.pad('abc', 8, '_-');\\n * // => '_-abc_-_'\\n *\\n * _.pad('abc', 3);\\n * // => 'abc'\\n */\\n function pad(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n if (!length || strLength >= length) {\\n return string;\\n }\\n var mid = (length - strLength) / 2;\\n return (\\n createPadding(nativeFloor(mid), chars) +\\n string +\\n createPadding(nativeCeil(mid), chars)\\n );\\n }\\n\\n /**\\n * Pads `string` on the right side if it's shorter than `length`. Padding\\n * characters are truncated if they exceed `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.padEnd('abc', 6);\\n * // => 'abc '\\n *\\n * _.padEnd('abc', 6, '_-');\\n * // => 'abc_-_'\\n *\\n * _.padEnd('abc', 3);\\n * // => 'abc'\\n */\\n function padEnd(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n return (length && strLength < length)\\n ? (string + createPadding(length - strLength, chars))\\n : string;\\n }\\n\\n /**\\n * Pads `string` on the left side if it's shorter than `length`. Padding\\n * characters are truncated if they exceed `length`.\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to pad.\\n * @param {number} [length=0] The padding length.\\n * @param {string} [chars=' '] The string used as padding.\\n * @returns {string} Returns the padded string.\\n * @example\\n *\\n * _.padStart('abc', 6);\\n * // => ' abc'\\n *\\n * _.padStart('abc', 6, '_-');\\n * // => '_-_abc'\\n *\\n * _.padStart('abc', 3);\\n * // => 'abc'\\n */\\n function padStart(string, length, chars) {\\n string = toString(string);\\n length = toInteger(length);\\n\\n var strLength = length ? stringSize(string) : 0;\\n return (length && strLength < length)\\n ? (createPadding(length - strLength, chars) + string)\\n : string;\\n }\\n\\n /**\\n * Converts `string` to an integer of the specified radix. If `radix` is\\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\\n * hexadecimal, in which case a `radix` of `16` is used.\\n *\\n * **Note:** This method aligns with the\\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\\n *\\n * @static\\n * @memberOf _\\n * @since 1.1.0\\n * @category String\\n * @param {string} string The string to convert.\\n * @param {number} [radix=10] The radix to interpret `value` by.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {number} Returns the converted integer.\\n * @example\\n *\\n * _.parseInt('08');\\n * // => 8\\n *\\n * _.map(['6', '08', '10'], _.parseInt);\\n * // => [6, 8, 10]\\n */\\n function parseInt(string, radix, guard) {\\n if (guard || radix == null) {\\n radix = 0;\\n } else if (radix) {\\n radix = +radix;\\n }\\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\\n }\\n\\n /**\\n * Repeats the given string `n` times.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to repeat.\\n * @param {number} [n=1] The number of times to repeat the string.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {string} Returns the repeated string.\\n * @example\\n *\\n * _.repeat('*', 3);\\n * // => '***'\\n *\\n * _.repeat('abc', 2);\\n * // => 'abcabc'\\n *\\n * _.repeat('abc', 0);\\n * // => ''\\n */\\n function repeat(string, n, guard) {\\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\\n n = 1;\\n } else {\\n n = toInteger(n);\\n }\\n return baseRepeat(toString(string), n);\\n }\\n\\n /**\\n * Replaces matches for `pattern` in `string` with `replacement`.\\n *\\n * **Note:** This method is based on\\n * [`String#replace`](https://mdn.io/String/replace).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to modify.\\n * @param {RegExp|string} pattern The pattern to replace.\\n * @param {Function|string} replacement The match replacement.\\n * @returns {string} Returns the modified string.\\n * @example\\n *\\n * _.replace('Hi Fred', 'Fred', 'Barney');\\n * // => 'Hi Barney'\\n */\\n function replace() {\\n var args = arguments,\\n string = toString(args[0]);\\n\\n return args.length < 3 ? string : string.replace(args[1], args[2]);\\n }\\n\\n /**\\n * Converts `string` to\\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the snake cased string.\\n * @example\\n *\\n * _.snakeCase('Foo Bar');\\n * // => 'foo_bar'\\n *\\n * _.snakeCase('fooBar');\\n * // => 'foo_bar'\\n *\\n * _.snakeCase('--FOO-BAR--');\\n * // => 'foo_bar'\\n */\\n var snakeCase = createCompounder(function(result, word, index) {\\n return result + (index ? '_' : '') + word.toLowerCase();\\n });\\n\\n /**\\n * Splits `string` by `separator`.\\n *\\n * **Note:** This method is based on\\n * [`String#split`](https://mdn.io/String/split).\\n *\\n * @static\\n * @memberOf _\\n * @since 4.0.0\\n * @category String\\n * @param {string} [string=''] The string to split.\\n * @param {RegExp|string} separator The separator pattern to split by.\\n * @param {number} [limit] The length to truncate results to.\\n * @returns {Array} Returns the string segments.\\n * @example\\n *\\n * _.split('a-b-c', '-', 2);\\n * // => ['a', 'b']\\n */\\n function split(string, separator, limit) {\\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\\n separator = limit = undefined;\\n }\\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\\n if (!limit) {\\n return [];\\n }\\n string = toString(string);\\n if (string && (\\n typeof separator == 'string' ||\\n (separator != null && !isRegExp(separator))\\n )) {\\n separator = baseToString(separator);\\n if (!separator && hasUnicode(string)) {\\n return castSlice(stringToArray(string), 0, limit);\\n }\\n }\\n return string.split(separator, limit);\\n }\\n\\n /**\\n * Converts `string` to\\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\\n *\\n * @static\\n * @memberOf _\\n * @since 3.1.0\\n * @category String\\n * @param {string} [string=''] The string to convert.\\n * @returns {string} Returns the start cased string.\\n * @example\\n *\\n * _.startCase('--foo-bar--');\\n * // => 'Foo Bar'\\n *\\n * _.startCase('fooBar');\\n * // => 'Foo Bar'\\n *\\n * _.startCase('__FOO_BAR__');\\n * // => 'FOO BAR'\\n */\\n var startCase = createCompounder(function(result, word, index) {\\n return result + (index ? ' ' : '') + upperFirst(word);\\n });\\n\\n /**\\n * Checks if `string` starts with the given target string.\\n *\\n * @static\\n * @memberOf _\\n * @since 3.0.0\\n * @category String\\n * @param {string} [string=''] The string to inspect.\\n * @param {string} [target] The string to search for.\\n * @param {number} [position=0] The position to search from.\\n * @returns {boolean} Returns `true` if `string` starts with `target`,\\n * else `false`.\\n * @example\\n *\\n * _.startsWith('abc', 'a');\\n * // => true\\n *\\n * _.startsWith('abc', 'b');\\n * // => false\\n *\\n * _.startsWith('abc', 'b', 1);\\n * // => true\\n */\\n function startsWith(string, target, position) {\\n string = toString(string);\\n position = position == null\\n ? 0\\n : baseClamp(toInteger(position), 0, string.length);\\n\\n target = baseToString(target);\\n return string.slice(position, position + target.length) == target;\\n }\\n\\n /**\\n * Creates a compiled template function that can interpolate data properties\\n * in \\\"interpolate\\\" delimiters, HTML-escape interpolated data properties in\\n * \\\"escape\\\" delimiters, and execute JavaScript in \\\"evaluate\\\" delimiters. Data\\n * properties may be accessed as free variables in the template. If a setting\\n * object is given, it takes precedence over `_.templateSettings` values.\\n *\\n * **Note:** In the development build `_.template` utilizes\\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\\n * for easier debugging.\\n *\\n * For more information on precompiling templates see\\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\\n *\\n * For more information on Chrome extension sandboxes see\\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\\n *\\n * @static\\n * @since 0.1.0\\n * @memberOf _\\n * @category String\\n * @param {string} [string=''] The template string.\\n * @param {Object} [options={}] The options object.\\n * @param {RegExp} [options.escape=_.templateSettings.escape]\\n * The HTML \\\"escape\\\" delimiter.\\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\\n * The \\\"evaluate\\\" delimiter.\\n * @param {Object} [options.imports=_.templateSettings.imports]\\n * An object to import into the template as free variables.\\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\\n * The \\\"interpolate\\\" delimiter.\\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\\n * The sourceURL of the compiled template.\\n * @param {string} [options.variable='obj']\\n * The data object variable name.\\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\\n * @returns {Function} Returns the compiled template function.\\n * @example\\n *\\n * // Use the \\\"interpolate\\\" delimiter to create a compiled template.\\n * var compiled = _.template('hello <%= user %>!');\\n * compiled({ 'user': 'fred' });\\n * // => 'hello fred!'\\n *\\n * // Use the HTML \\\"escape\\\" delimiter to escape data property values.\\n * var compiled = _.template('<%- value %>');\\n * compiled({ 'value': '\\\\r\\\\n\\\\r\\\\n\\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 78 */\\n/***/ function(module, exports) {\\n\\n\\t/*\\r\\n\\t\\tMIT License http://www.opensource.org/licenses/mit-license.php\\r\\n\\t\\tAuthor Tobias Koppers @sokra\\r\\n\\t*/\\r\\n\\t// css base code, injected by the css-loader\\r\\n\\tmodule.exports = function() {\\r\\n\\t\\tvar list = [];\\r\\n\\t\\r\\n\\t\\t// return the list of modules as css string\\r\\n\\t\\tlist.toString = function toString() {\\r\\n\\t\\t\\tvar result = [];\\r\\n\\t\\t\\tfor(var i = 0; i < this.length; i++) {\\r\\n\\t\\t\\t\\tvar item = this[i];\\r\\n\\t\\t\\t\\tif(item[2]) {\\r\\n\\t\\t\\t\\t\\tresult.push(\\\"@media \\\" + item[2] + \\\"{\\\" + item[1] + \\\"}\\\");\\r\\n\\t\\t\\t\\t} else {\\r\\n\\t\\t\\t\\t\\tresult.push(item[1]);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\treturn result.join(\\\"\\\");\\r\\n\\t\\t};\\r\\n\\t\\r\\n\\t\\t// import a list of modules into the list\\r\\n\\t\\tlist.i = function(modules, mediaQuery) {\\r\\n\\t\\t\\tif(typeof modules === \\\"string\\\")\\r\\n\\t\\t\\t\\tmodules = [[null, modules, \\\"\\\"]];\\r\\n\\t\\t\\tvar alreadyImportedModules = {};\\r\\n\\t\\t\\tfor(var i = 0; i < this.length; i++) {\\r\\n\\t\\t\\t\\tvar id = this[i][0];\\r\\n\\t\\t\\t\\tif(typeof id === \\\"number\\\")\\r\\n\\t\\t\\t\\t\\talreadyImportedModules[id] = true;\\r\\n\\t\\t\\t}\\r\\n\\t\\t\\tfor(i = 0; i < modules.length; i++) {\\r\\n\\t\\t\\t\\tvar item = modules[i];\\r\\n\\t\\t\\t\\t// skip already imported module\\r\\n\\t\\t\\t\\t// this implementation is not 100% perfect for weird media query combinations\\r\\n\\t\\t\\t\\t// when a module is imported multiple times with different media queries.\\r\\n\\t\\t\\t\\t// I hope this will never occur (Hey this way we have smaller bundles)\\r\\n\\t\\t\\t\\tif(typeof item[0] !== \\\"number\\\" || !alreadyImportedModules[item[0]]) {\\r\\n\\t\\t\\t\\t\\tif(mediaQuery && !item[2]) {\\r\\n\\t\\t\\t\\t\\t\\titem[2] = mediaQuery;\\r\\n\\t\\t\\t\\t\\t} else if(mediaQuery) {\\r\\n\\t\\t\\t\\t\\t\\titem[2] = \\\"(\\\" + item[2] + \\\") and (\\\" + mediaQuery + \\\")\\\";\\r\\n\\t\\t\\t\\t\\t}\\r\\n\\t\\t\\t\\t\\tlist.push(item);\\r\\n\\t\\t\\t\\t}\\r\\n\\t\\t\\t}\\r\\n\\t\\t};\\r\\n\\t\\treturn list;\\r\\n\\t};\\r\\n\\n\\n/***/ },\\n/* 79 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t/*\\n\\t\\tMIT License http://www.opensource.org/licenses/mit-license.php\\n\\t\\tAuthor Tobias Koppers @sokra\\n\\t*/\\n\\tvar stylesInDom = {},\\n\\t\\tmemoize = function(fn) {\\n\\t\\t\\tvar memo;\\n\\t\\t\\treturn function () {\\n\\t\\t\\t\\tif (typeof memo === \\\"undefined\\\") memo = fn.apply(this, arguments);\\n\\t\\t\\t\\treturn memo;\\n\\t\\t\\t};\\n\\t\\t},\\n\\t\\tisOldIE = memoize(function() {\\n\\t\\t\\treturn /msie [6-9]\\\\b/.test(window.navigator.userAgent.toLowerCase());\\n\\t\\t}),\\n\\t\\tgetHeadElement = memoize(function () {\\n\\t\\t\\treturn document.head || document.getElementsByTagName(\\\"head\\\")[0];\\n\\t\\t}),\\n\\t\\tsingletonElement = null,\\n\\t\\tsingletonCounter = 0,\\n\\t\\tstyleElementsInsertedAtTop = [];\\n\\t\\n\\tmodule.exports = function(list, options) {\\n\\t\\tif(false) {\\n\\t\\t\\tif(typeof document !== \\\"object\\\") throw new Error(\\\"The style-loader cannot be used in a non-browser environment\\\");\\n\\t\\t}\\n\\t\\n\\t\\toptions = options || {};\\n\\t\\t// Force single-tag solution on IE6-9, which has a hard limit on the # of \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 85 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t header: { type: String },\\n\\t placement: { type: String, default: 'right' },\\n\\t show: { type: Boolean, required: true },\\n\\t width: { type: Number, default: 320 }\\n\\t },\\n\\t watch: {\\n\\t show: function show(val, old) {\\n\\t var _this = this;\\n\\t\\n\\t this.$emit('input', val);\\n\\t this.$emit(this.show ? 'open' : 'close');\\n\\t var body = document.body;\\n\\t var scrollBarWidth = (0, _utils.getScrollBarWidth)();\\n\\t if (val) {\\n\\t if (!this._backdrop) {\\n\\t this._backdrop = document.createElement('div');\\n\\t }\\n\\t this._backdrop.className = 'aside-backdrop';\\n\\t body.appendChild(this._backdrop);\\n\\t body.classList.add('modal-open');\\n\\t if (scrollBarWidth !== 0) {\\n\\t body.style.paddingRight = scrollBarWidth + 'px';\\n\\t }\\n\\t // request property that requires layout to force a layout\\n\\t var x = this._backdrop.clientHeight;\\n\\t this._backdrop.classList.add('in');\\n\\t (0, _NodeList2.default)(this._backdrop).on('click', function () {\\n\\t return _this.trigger_close();\\n\\t });\\n\\t } else {\\n\\t (0, _NodeList2.default)(this._backdrop).on('transitionend', function () {\\n\\t (0, _NodeList2.default)(_this._backdrop).off();\\n\\t try {\\n\\t body.classList.remove('modal-open');\\n\\t body.style.paddingRight = '0';\\n\\t body.removeChild(_this._backdrop);\\n\\t _this._backdrop = null;\\n\\t } catch (e) {}\\n\\t });\\n\\t this._backdrop.className = 'aside-backdrop';\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t trigger: function trigger() {\\n\\t var _this2 = this;\\n\\t\\n\\t return {\\n\\t close: function close() {\\n\\t return _this2.trigger_close();\\n\\t },\\n\\t open: function open() {\\n\\t return _this2.trigger_open();\\n\\t }\\n\\t };\\n\\t },\\n\\t trigger_close: function trigger_close() {\\n\\t this.$emit('close');\\n\\t },\\n\\t trigger_open: function trigger_open() {\\n\\t this.$emit('open');\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this3 = this;\\n\\t\\n\\t this.$emit('trigger', function () {\\n\\t return _this3.trigger;\\n\\t });\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 86 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": 'slide' + _vm.placement\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t staticClass: \\\"aside\\\",\\n\\t class: _vm.placement,\\n\\t style: ({\\n\\t width: _vm.width + 'px'\\n\\t })\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-dialog\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-content\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"aside-header\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.trigger_close\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]), _vm._v(\\\" \\\"), _vm._c('h4', {\\n\\t staticClass: \\\"aside-title\\\"\\n\\t }, [_vm._t(\\\"header\\\", [_vm._v(_vm._s(_vm.header))])], 2)]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"aside-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])])]) : _vm._e()])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-3a4bde27\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 87 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(88)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(89)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\ButtonGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-125eb0c8\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-125eb0c8\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] ButtonGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 88 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t buttons: { default: true },\\n\\t justified: { type: Boolean, default: false },\\n\\t type: { type: String, default: 'default' },\\n\\t value: { default: null },\\n\\t vertical: { type: Boolean, default: false }\\n\\t },\\n\\t data: function data() {\\n\\t this._btnGroup = true;\\n\\t return {\\n\\t val: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t val: function val(_val) {\\n\\t this.$emit('input', _val);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 89 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: {\\n\\t 'btn-group': _vm.buttons, 'btn-group-justified': _vm.justified, 'btn-group-vertical': _vm.vertical\\n\\t },\\n\\t attrs: {\\n\\t \\\"data-toggle\\\": _vm.buttons && 'buttons'\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-125eb0c8\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 90 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(91)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(93)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(94)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Carousel.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-322dee41\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-322dee41\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-322dee41\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Carousel.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 91 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 93 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t// let coerce = {\\n\\t// interval: 'number'\\n\\t// }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t indicators: {\\n\\t type: Boolean,\\n\\t default: true\\n\\t },\\n\\t controls: {\\n\\t type: Boolean,\\n\\t default: true\\n\\t },\\n\\t interval: {\\n\\t type: Number,\\n\\t default: 5000\\n\\t }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t indicator_list: [],\\n\\t index: 0,\\n\\t isAnimating: false\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t index: function index(newVal, oldVal) {\\n\\t this.slide(newVal > oldVal ? 'left' : 'right', newVal, oldVal);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t indicatorClick: function indicatorClick(index) {\\n\\t if (this.isAnimating || this.index === index) return false;\\n\\t this.isAnimating = true;\\n\\t this.index = index;\\n\\t },\\n\\t slide: function slide(direction, next, prev) {\\n\\t var _this = this;\\n\\t\\n\\t if (!this.$el) {\\n\\t return;\\n\\t }\\n\\t var $slider = (0, _NodeList2.default)('.item', this.$el);\\n\\t if (!$slider.length) {\\n\\t return;\\n\\t }\\n\\t var selected = $slider[next] || $slider[0];\\n\\t (0, _NodeList2.default)(selected).addClass(direction === 'left' ? 'next' : 'prev');\\n\\t // request property that requires layout to force a layout\\n\\t var x = selected.clientHeight;\\n\\t (0, _NodeList2.default)([$slider[prev], selected]).addClass(direction).on('transitionend', function () {\\n\\t $slider.off('transitionend').className = 'item';\\n\\t (0, _NodeList2.default)(selected).addClass('active');\\n\\t _this.isAnimating = false;\\n\\t });\\n\\t },\\n\\t next: function next() {\\n\\t if (!this.$el || this.isAnimating) {\\n\\t return false;\\n\\t }\\n\\t this.isAnimating = true;\\n\\t this.index + 1 < (0, _NodeList2.default)('.item', this.$el).length ? this.index += 1 : this.index = 0;\\n\\t },\\n\\t prev: function prev() {\\n\\t if (!this.$el || this.isAnimating) {\\n\\t return false;\\n\\t }\\n\\t this.isAnimating = true;\\n\\t this.index === 0 ? this.index = (0, _NodeList2.default)('.item', this.$el).length - 1 : this.index -= 1;\\n\\t },\\n\\t toggleInterval: function toggleInterval(val) {\\n\\t if (val === undefined) {\\n\\t val = this._intervalID;\\n\\t }\\n\\t if (this._intervalID) {\\n\\t clearInterval(this._intervalID);\\n\\t delete this._intervalID;\\n\\t }\\n\\t if (val && this.interval > 0) {\\n\\t this._intervalID = setInterval(this.next, this.interval);\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this2 = this;\\n\\t\\n\\t this.toggleInterval(true);\\n\\t (0, _NodeList2.default)(this.$el).on('mouseenter', function () {\\n\\t return _this2.toggleInterval(false);\\n\\t }).on('mouseleave', function () {\\n\\t return _this2.toggleInterval(true);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t this.toggleInterval(false);\\n\\t (0, _NodeList2.default)(this.$el).off('mouseenter mouseleave');\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 94 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"carousel slide\\\",\\n\\t attrs: {\\n\\t \\\"data-ride\\\": \\\"carousel\\\"\\n\\t }\\n\\t }, [_vm._c('ol', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.indicators),\\n\\t expression: \\\"indicators\\\"\\n\\t }],\\n\\t staticClass: \\\"carousel-indicators\\\"\\n\\t }, _vm._l((_vm.indicator_list), function(indicator, i) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t active: i === _vm.index\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.indicatorClick(i)\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span')])\\n\\t })), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"carousel-inner\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"listbox\\\"\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.controls),\\n\\t expression: \\\"controls\\\"\\n\\t }],\\n\\t staticClass: \\\"carousel-controls hidden-xs\\\"\\n\\t }, [_vm._c('a', {\\n\\t staticClass: \\\"left carousel-control\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.prev\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"glyphicon glyphicon-chevron-left\\\",\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t })]), _vm._v(\\\" \\\"), _vm._c('a', {\\n\\t staticClass: \\\"right carousel-control\\\",\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.next\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"glyphicon glyphicon-chevron-right\\\",\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t })])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-322dee41\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 95 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(96)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(98)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(99)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Checkbox.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-6922bf24\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-6922bf24\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-6922bf24\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Checkbox.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 96 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 98 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t button: { type: Boolean, default: false },\\n\\t disabled: { type: Boolean, default: false },\\n\\t falseValue: { default: false },\\n\\t name: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t trueValue: { default: true },\\n\\t type: { type: String, default: null },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t checked: this.value === this.trueValue\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t isButton: function isButton() {\\n\\t return this.button || this._inGroup && this.$parent.buttons;\\n\\t },\\n\\t isFalse: function isFalse() {\\n\\t return this.value === this.falseValue;\\n\\t },\\n\\t isTrue: function isTrue() {\\n\\t return this.value === this.trueValue;\\n\\t },\\n\\t parentValue: function parentValue() {\\n\\t return this._ingroup && this.$parent.val;\\n\\t },\\n\\t typeColor: function typeColor() {\\n\\t return this.type || this.$parent && this.$parent.type || 'default';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t checked: function checked(val, old) {\\n\\t var value = val ? this.trueValue : this.falseValue;\\n\\t this.$emit('checked', val);\\n\\t this.$emit('input', value);\\n\\t this.eval();\\n\\t },\\n\\t parentValue: function parentValue(val) {\\n\\t var checked = val === this.trueValue;\\n\\t if (this.checked !== checked) {\\n\\t this.checked = checked;\\n\\t }\\n\\t },\\n\\t value: function value(val, old) {\\n\\t var checked = val === this.trueValue;\\n\\t if (this.checked !== checked) {\\n\\t this.checked = checked;\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t var parent = this.$parent;\\n\\t if (parent && parent._btnGroup && !parent._radioGroup) {\\n\\t this._inGroup = true;\\n\\t parent._checkboxGroup = true;\\n\\t if (!(parent.val instanceof Array)) {\\n\\t parent.val = [];\\n\\t }\\n\\t this.eval();\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (!this.$parent._checkboxGroup || typeof this.value === 'boolean') {\\n\\t return;\\n\\t }\\n\\t if (this.$parent.val.length) {\\n\\t // this.checked = ~this.$parent.val.indexOf(this.value)\\n\\t this.$emit('checked', ~this.$parent.val.indexOf(this.value));\\n\\t } else if (this.checked) {\\n\\t this.$parent.val.push(this.value);\\n\\t }\\n\\t },\\n\\t\\n\\t methods: {\\n\\t eval: function _eval() {\\n\\t if (this._inGroup) {\\n\\t var value = this.checked ? this.isTrue : this.isFalse;\\n\\t var index = this.$parent.val.indexOf(value);\\n\\t if (this.checked && !~index) this.$parent.val.push(value);\\n\\t if (!this.checked && ~index) this.$parent.val.splice(index, 1);\\n\\t }\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (this.disabled || this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.checked = !this.checked;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 99 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.isButton ? 'a' : 'label', {\\n\\t tag: \\\"a\\\",\\n\\t class: [_vm.isButton ? 'btn btn-' + _vm.typeColor : 'open checkbox ' + _vm.typeColor, {\\n\\t active: _vm.checked,\\n\\t disabled: _vm.disabled,\\n\\t readonly: _vm.readonly\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggle\\n\\t }\\n\\t }, [(_vm.name) ? _vm._c('input', {\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"hidden\\\",\\n\\t \\\"name\\\": _vm.name\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.checked ? _vm.trueValue : _vm.falseValue\\n\\t }\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), (!_vm.isButton) ? _vm._c('span', {\\n\\t staticClass: \\\"icon dropdown-toggle\\\",\\n\\t class: [_vm.checked ? 'btn-' + _vm.typeColor : '', {\\n\\t bg: _vm.typeColor === 'default'\\n\\t }]\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), (!_vm.isButton && _vm.checked && _vm.typeColor === 'default') ? _vm._c('span', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-6922bf24\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 100 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(101)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(103)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(104)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Datepicker.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-477b8e5d\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-477b8e5d\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Datepicker.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 101 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 103 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\t// import $ from './utils/NodeList.js'\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t value: { type: String },\\n\\t format: { default: 'MM/dd/yyyy' },\\n\\t disabledDaysOfWeek: { type: Array, default: function _default() {\\n\\t return [];\\n\\t }\\n\\t },\\n\\t width: { type: String /*, default: '200px'*/ },\\n\\t clearButton: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t placeholder: { type: String },\\n\\t iconsFont: { type: String, default: 'glyphicon' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t currDate: new Date(),\\n\\t dateRange: [],\\n\\t decadeRange: [],\\n\\t displayDayView: false,\\n\\t displayMonthView: false,\\n\\t displayYearView: false\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t currDate: function currDate() {\\n\\t this.getDateRange();\\n\\t },\\n\\t format: function format() {\\n\\t this.$emit('input', this.stringify(this.currDate));\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t preBtnClasses: function preBtnClasses() {\\n\\t return 'datepicker-preBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-left';\\n\\t },\\n\\t nextBtnClasses: function nextBtnClasses() {\\n\\t return 'datepicker-nextBtn ' + this.iconsFont + ' ' + this.iconsFont + '-chevron-right';\\n\\t },\\n\\t disabledDaysArray: function disabledDaysArray() {\\n\\t return this.disabledDaysOfWeek.map(function (d) {\\n\\t return parseInt(d, 10);\\n\\t });\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t close: function close() {\\n\\t this.displayDayView = this.displayMonthView = this.displayYearView = false;\\n\\t },\\n\\t inputClick: function inputClick() {\\n\\t this.currDate = this.parse(this.value) || this.parse(new Date());\\n\\t if (this.displayMonthView || this.displayYearView) {\\n\\t this.displayDayView = false;\\n\\t } else {\\n\\t this.displayDayView = !this.displayDayView;\\n\\t }\\n\\t },\\n\\t preNextDecadeClick: function preNextDecadeClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var months = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t this.currDate = new Date(year - 10, months, date);\\n\\t } else {\\n\\t this.currDate = new Date(year + 10, months, date);\\n\\t }\\n\\t },\\n\\t preNextMonthClick: function preNextMonthClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var month = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t var preMonth = this.getYearMonth(year, month - 1);\\n\\t this.currDate = new Date(preMonth.year, preMonth.month, date);\\n\\t } else {\\n\\t var nextMonth = this.getYearMonth(year, month + 1);\\n\\t this.currDate = new Date(nextMonth.year, nextMonth.month, date);\\n\\t }\\n\\t },\\n\\t preNextYearClick: function preNextYearClick(flag) {\\n\\t var year = this.currDate.getFullYear();\\n\\t var months = this.currDate.getMonth();\\n\\t var date = this.currDate.getDate();\\n\\t\\n\\t if (flag === 0) {\\n\\t this.currDate = new Date(year - 1, months, date);\\n\\t } else {\\n\\t this.currDate = new Date(year + 1, months, date);\\n\\t }\\n\\t },\\n\\t yearSelect: function yearSelect(year) {\\n\\t this.displayYearView = false;\\n\\t this.displayMonthView = true;\\n\\t this.currDate = new Date(year, this.currDate.getMonth(), this.currDate.getDate());\\n\\t },\\n\\t daySelect: function daySelect(day) {\\n\\t if (day.sclass === 'datepicker-item-disable') {\\n\\t return false;\\n\\t } else {\\n\\t this.currDate = day.date;\\n\\t this.$emit('input', this.stringify(this.currDate));\\n\\t this.displayDayView = false;\\n\\t }\\n\\t },\\n\\t switchMonthView: function switchMonthView() {\\n\\t this.displayDayView = false;\\n\\t this.displayMonthView = true;\\n\\t },\\n\\t switchDecadeView: function switchDecadeView() {\\n\\t this.displayMonthView = false;\\n\\t this.displayYearView = true;\\n\\t },\\n\\t monthSelect: function monthSelect(index) {\\n\\t this.displayMonthView = false;\\n\\t this.displayDayView = true;\\n\\t this.currDate = new Date(this.currDate.getFullYear(), index, this.currDate.getDate());\\n\\t },\\n\\t getYearMonth: function getYearMonth(year, month) {\\n\\t if (month > 11) {\\n\\t year++;\\n\\t month = 0;\\n\\t } else if (month < 0) {\\n\\t year--;\\n\\t month = 11;\\n\\t }\\n\\t return { year: year, month: month };\\n\\t },\\n\\t stringifyDecadeHeader: function stringifyDecadeHeader(date) {\\n\\t var yearStr = date.getFullYear().toString();\\n\\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0;\\n\\t var lastYearOfDecade = parseInt(firstYearOfDecade, 10) + 10;\\n\\t return firstYearOfDecade + '-' + lastYearOfDecade;\\n\\t },\\n\\t stringifyDayHeader: function stringifyDayHeader(date) {\\n\\t return this.text.months[date.getMonth()] + ' ' + date.getFullYear();\\n\\t },\\n\\t parseMonth: function parseMonth(date) {\\n\\t return this.text.months[date.getMonth()];\\n\\t },\\n\\t stringifyYearHeader: function stringifyYearHeader(date) {\\n\\t return date.getFullYear();\\n\\t },\\n\\t stringify: function stringify(date) {\\n\\t var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.format;\\n\\t\\n\\t if (!date) date = this.parse();\\n\\t if (!date) return '';\\n\\t var year = date.getFullYear();\\n\\t var month = date.getMonth() + 1;\\n\\t var day = date.getDate();\\n\\t var monthName = this.parseMonth(date);\\n\\t\\n\\t return format.replace(/yyyy/g, year).replace(/MMMM/g, monthName).replace(/MMM/g, monthName.substring(0, 3)).replace(/MM/g, ('0' + month).slice(-2)).replace(/dd/g, ('0' + day).slice(-2)).replace(/yy/g, year).replace(/M(?!a)/g, month).replace(/d/g, day);\\n\\t },\\n\\t parse: function parse() {\\n\\t var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.value;\\n\\t\\n\\t var date = void 0;\\n\\t if (str.length === 10 && (this.format === 'dd-MM-yyyy' || this.format === 'dd/MM/yyyy')) {\\n\\t date = new Date(str.substring(6, 10), str.substring(3, 5) - 1, str.substring(0, 2));\\n\\t } else {\\n\\t date = new Date(str);\\n\\t }\\n\\t return isNaN(date.getFullYear()) ? new Date() : date;\\n\\t },\\n\\t getDayCount: function getDayCount(year, month) {\\n\\t var dict = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\\n\\t if (month === 1) {\\n\\t if (year % 400 === 0 || year % 4 === 0 && year % 100 !== 0) {\\n\\t return 29;\\n\\t }\\n\\t }\\n\\t return dict[month];\\n\\t },\\n\\t getDateRange: function getDateRange() {\\n\\t this.dateRange = [];\\n\\t this.decadeRange = [];\\n\\t var time = {\\n\\t year: this.currDate.getFullYear(),\\n\\t month: this.currDate.getMonth(),\\n\\t day: this.currDate.getDate()\\n\\t };\\n\\t var yearStr = time.year.toString();\\n\\t var firstYearOfDecade = yearStr.substring(0, yearStr.length - 1) + 0 - 1;\\n\\t for (var i = 0; i < 12; i++) {\\n\\t this.decadeRange.push({\\n\\t text: firstYearOfDecade + i\\n\\t });\\n\\t }\\n\\t\\n\\t var currMonthFirstDay = new Date(time.year, time.month, 1);\\n\\t var firstDayWeek = currMonthFirstDay.getDay() + 1;\\n\\t if (firstDayWeek === 0) {\\n\\t firstDayWeek = 7;\\n\\t }\\n\\t var dayCount = this.getDayCount(time.year, time.month);\\n\\t if (firstDayWeek > 1) {\\n\\t var preMonth = this.getYearMonth(time.year, time.month - 1);\\n\\t var prevMonthDayCount = this.getDayCount(preMonth.year, preMonth.month);\\n\\t for (var _i = 1; _i < firstDayWeek; _i++) {\\n\\t var dayText = prevMonthDayCount - firstDayWeek + _i + 1;\\n\\t var date = new Date(preMonth.year, preMonth.month, dayText);\\n\\t var sclass = 'datepicker-item-gray';\\n\\t if (this.disabledDaysArray.indexOf(date.getDay()) > -1) {\\n\\t sclass = 'datepicker-item-disable';\\n\\t }\\n\\t this.dateRange.push({\\n\\t text: dayText,\\n\\t date: date,\\n\\t sclass: 'datepicker-item-gray'\\n\\t });\\n\\t }\\n\\t }\\n\\t\\n\\t for (var _i2 = 1; _i2 <= dayCount; _i2++) {\\n\\t var _date = new Date(time.year, time.month, _i2);\\n\\t var _sclass = '';\\n\\t if (this.disabledDaysArray.indexOf(_date.getDay()) > -1) {\\n\\t _sclass = 'datepicker-item-disable';\\n\\t }\\n\\t if (_i2 == time.day && _date.getFullYear() == time.year && _date.getMonth() == time.month) {\\n\\t _sclass = 'datepicker-dateRange-item-active';\\n\\t }\\n\\t this.dateRange.push({\\n\\t text: _i2,\\n\\t date: _date,\\n\\t sclass: _sclass\\n\\t });\\n\\t }\\n\\t\\n\\t if (this.dateRange.length < 42) {\\n\\t var nextMonthNeed = 42 - this.dateRange.length;\\n\\t var nextMonth = this.getYearMonth(time.year, time.month + 1);\\n\\t\\n\\t for (var _i3 = 1; _i3 <= nextMonthNeed; _i3++) {\\n\\t var _date2 = new Date(nextMonth.year, nextMonth.month, _i3);\\n\\t var _sclass2 = 'datepicker-item-gray';\\n\\t if (this.disabledDaysArray.indexOf(_date2.getDay()) > -1) {\\n\\t _sclass2 = 'datepicker-item-disable';\\n\\t }\\n\\t this.dateRange.push({\\n\\t text: _i3,\\n\\t date: _date2,\\n\\t sclass: _sclass2\\n\\t });\\n\\t }\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t var el = this.$el;\\n\\t this._blur = function (e) {\\n\\t if (!el.contains(e.target)) _this.close();\\n\\t };\\n\\t this.$emit('child-created', this);\\n\\t this.currDate = this.parse(this.value) || this.parse(new Date());\\n\\t window.addEventListener('click', this._blur);\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t window.removeEventListener('click', this._blur);\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 104 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"datepicker\\\"\\n\\t }, [_vm._c('input', {\\n\\t staticClass: \\\"form-control datepicker-input\\\",\\n\\t class: {\\n\\t 'with-reset-button': _vm.clearButton\\n\\t },\\n\\t style: ({\\n\\t width: _vm.width\\n\\t }),\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"text\\\",\\n\\t \\\"placeholder\\\": _vm.placeholder\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.value\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.inputClick,\\n\\t \\\"input\\\": function($event) {\\n\\t _vm.$emit('input', $event.target.value)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.value) ? _vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.$emit('input', '')\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayDayView),\\n\\t expression: \\\"displayDayView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextMonthClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextMonthClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', {\\n\\t on: {\\n\\t \\\"click\\\": _vm.switchMonthView\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.stringifyDayHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-weekRange\\\"\\n\\t }, _vm._l((_vm.text.daysOfWeek), function(w) {\\n\\t return _vm._c('span', [_vm._v(_vm._s(w))])\\n\\t })), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-dateRange\\\"\\n\\t }, _vm._l((_vm.dateRange), function(d) {\\n\\t return _vm._c('span', {\\n\\t class: d.sclass,\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.daySelect(d)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(d.text))])\\n\\t }))])])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayMonthView),\\n\\t expression: \\\"displayMonthView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextYearClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextYearClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', {\\n\\t on: {\\n\\t \\\"click\\\": _vm.switchDecadeView\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.stringifyYearHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-monthRange\\\"\\n\\t }, [_vm._l((_vm.text.months), function(m, index) {\\n\\t return [_vm._c('span', {\\n\\t class: {\\n\\t 'datepicker-dateRange-item-active':\\n\\t (_vm.text.months[_vm.parse(_vm.value).getMonth()] === m) &&\\n\\t _vm.currDate.getFullYear() === _vm.parse(_vm.value).getFullYear()\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.monthSelect(index)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(m.substr(0, 3)))])]\\n\\t })], 2)])])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.displayYearView),\\n\\t expression: \\\"displayYearView\\\"\\n\\t }],\\n\\t staticClass: \\\"datepicker-popup\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-inner\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-body\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"datepicker-ctrl\\\"\\n\\t }, [_vm._c('span', {\\n\\t class: _vm.preBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextDecadeClick(0)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t class: _vm.nextBtnClasses,\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.preNextDecadeClick(1)\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('p', [_vm._v(_vm._s(_vm.stringifyDecadeHeader(_vm.currDate)))])]), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"datepicker-monthRange decadeRange\\\"\\n\\t }, [_vm._l((_vm.decadeRange), function(decade) {\\n\\t return [_vm._c('span', {\\n\\t class: {\\n\\t 'datepicker-dateRange-item-active': _vm.parse(this.value).getFullYear() === decade.text\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.stopPropagation();\\n\\t _vm.yearSelect(decade.text)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(decade.text))])]\\n\\t })], 2)])])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-477b8e5d\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 105 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(106)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(107)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Dropdown.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-39be1072\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-39be1072\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Dropdown.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 106 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tvar _ClickOutside = __webpack_require__(66);\\n\\t\\n\\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t directives: {\\n\\t ClickOutside: _ClickOutside2.default\\n\\t },\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t size: { type: String, default: null },\\n\\t text: { type: String, default: null },\\n\\t type: { type: String, default: 'default' },\\n\\t value: { type: Boolean, default: false }\\n\\t },\\n\\t data: function data() {\\n\\t var show = this.value;\\n\\t return { show: show };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t show: function show(val) {\\n\\t this.$emit('input', val);\\n\\t },\\n\\t value: function value(val) {\\n\\t this.show = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t buttonSize: function buttonSize() {\\n\\t return ~['lg', 'sm', 'xs'].indexOf(this.size) ? 'btn-' + this.size : '';\\n\\t },\\n\\t inInput: function inInput() {\\n\\t return this.$parent._input;\\n\\t },\\n\\t isLi: function isLi() {\\n\\t return this.$parent._isTabs || this.$parent._navbar || this.$parent.menu;\\n\\t },\\n\\t menu: function menu() {\\n\\t return !this.$parent || this.$parent.navbar;\\n\\t },\\n\\t slots: function slots() {\\n\\t return this._slotContents;\\n\\t },\\n\\t submenu: function submenu() {\\n\\t return this.$parent && (this.$parent.menu || this.$parent.submenu);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t blur: function blur() {\\n\\t this.show = false;\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (!this.disabled) {\\n\\t this.show = !this.show;\\n\\t }\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t (0, _NodeList2.default)('ul', this.$el).on('click', 'li>a', function (e) {\\n\\t _this.show = false;\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t (0, _NodeList2.default)('ul', this.$el).off();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 107 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.isLi ? 'li' : 'div', {\\n\\t directives: [{\\n\\t name: \\\"click-outside\\\",\\n\\t rawName: \\\"v-click-outside\\\",\\n\\t value: (_vm.blur),\\n\\t expression: \\\"blur\\\"\\n\\t }],\\n\\t tag: \\\"div\\\",\\n\\t class: [{\\n\\t open: _vm.show,\\n\\t disabled: _vm.disabled,\\n\\t dropdown: _vm.isLi,\\n\\t 'input-group-btn': _vm.inInput,\\n\\t 'btn-group': !_vm.isLi && !_vm.inInput\\n\\t }]\\n\\t }, [_vm._t(\\\"before\\\"), _vm._v(\\\" \\\"), (_vm.isLi) ? _vm._c('a', {\\n\\t class: ['dropdown-toggle', _vm.buttonSize, {\\n\\t disabled: _vm.disabled\\n\\t }],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.show = false\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"button\\\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"caret\\\"\\n\\t })], 2) : _vm._c('button', {\\n\\t class: ['btn btn-' + _vm.type, _vm.buttonSize, 'dropdown-toggle'],\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\",\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.show = false\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"button\\\", [_vm._v(_vm._s(_vm.text))]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"caret\\\"\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._t(\\\"dropdown-menu\\\", [_vm._c('ul', {\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-39be1072\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 108 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(109)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(110)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\FormGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-79eb400a\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-79eb400a\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] FormGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 109 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t// let coerce = {\\n\\t// enterSubmit: 'boolean',\\n\\t// icon: 'boolean'\\n\\t// }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t enterSubmit: {\\n\\t type: Boolean,\\n\\t default: false\\n\\t },\\n\\t icon: {\\n\\t type: Boolean,\\n\\t default: false\\n\\t },\\n\\t lang: {\\n\\t type: String,\\n\\t default: navigator.language\\n\\t }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t children: [],\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t validate: function validate() {\\n\\t var valid = true;\\n\\t this.children.some(function (el) {\\n\\t var v = el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\\n\\t if (!v) valid = false;\\n\\t return !valid;\\n\\t });\\n\\t this.valid = valid;\\n\\t return valid === true;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._formGroup = true;\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formGroup) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formGroup) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.validate();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\n/***/ },\\n/* 110 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-79eb400a\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 111 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(112)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(113)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\FormValidator.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-b9f57c46\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-b9f57c46\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] FormValidator.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 112 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t enterSubmit: { type: Boolean, default: false },\\n\\t icon: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t value: null\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t children: [],\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit('input', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t validate: function validate() {\\n\\t var invalid = !this.children.every(function (el) {\\n\\t return el.validate ? el.validate() : el.valid !== undefined ? el.valid : el.required && !~['', null, undefined].indexOf(el.value);\\n\\t });\\n\\t this.valid = !invalid;\\n\\t return !invalid;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._formValidator = true;\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t this.validate();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\n/***/ },\\n/* 113 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-b9f57c46\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 114 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(115)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(117)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(118)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Input.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-652ad7b9\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-652ad7b9\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-652ad7b9\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Input.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 115 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 117 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\tvar DELAY = 300;\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t clearButton: { type: Boolean, default: false },\\n\\t cols: { type: Number, default: null },\\n\\t datalist: { type: Array, default: null },\\n\\t disabled: { type: Boolean, default: false },\\n\\t enterSubmit: { type: Boolean, default: false },\\n\\t error: { type: String, default: null },\\n\\t help: { type: String, default: null },\\n\\t hideHelp: { type: Boolean, default: true },\\n\\t icon: { type: Boolean, default: false },\\n\\t label: { type: String, default: null },\\n\\t lang: { type: String, default: navigator.language },\\n\\t mask: null,\\n\\t maskDelay: { type: Number, default: 100 },\\n\\t match: { type: String, default: null },\\n\\t max: { type: String, default: null },\\n\\t maxlength: { type: Number, default: null },\\n\\t min: { type: String, default: null },\\n\\t minlength: { type: Number, default: 0 },\\n\\t name: { type: String, default: null },\\n\\t pattern: { default: null },\\n\\t placeholder: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t required: { type: Boolean, default: false },\\n\\t rows: { type: Number, default: 3 },\\n\\t step: { type: Number, default: null },\\n\\t type: { type: String, default: 'text' },\\n\\t url: { type: String, default: null },\\n\\t urlMap: { type: Function, default: null },\\n\\t validationDelay: { type: Number, default: 250 },\\n\\t value: { default: null }\\n\\t },\\n\\t data: function data() {\\n\\t var val = this.value;\\n\\t return {\\n\\t options: this.datalist,\\n\\t val: val,\\n\\t valid: null,\\n\\t timeout: null\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t canValidate: function canValidate() {\\n\\t return !this.disabled && !this.readonly && (this.required || this.regex || this.nativeValidate || this.match !== null);\\n\\t },\\n\\t errorText: function errorText() {\\n\\t var value = this.value;\\n\\t var error = [this.error];\\n\\t if (!value && this.required) error.push('(' + this.text.required.toLowerCase() + ')');\\n\\t if (value && value.length < this.minlength) error.push('(' + this.text.minLength.toLowerCase() + ': ' + this.minlength + ')');\\n\\t return error.join(' ');\\n\\t },\\n\\t id_datalist: function id_datalist() {\\n\\t if (this.type !== 'textarea' && this.datalist instanceof Array) {\\n\\t if (!this._id_datalist) {\\n\\t if (!this.$root.id_datalist) {\\n\\t this.$root.id_datalist = 0;\\n\\t }\\n\\t this._id_datalist = 'input-datalist' + this.$root.id_datalist++;\\n\\t }\\n\\t return this._id_datalist;\\n\\t }\\n\\t return null;\\n\\t },\\n\\t input: function input() {\\n\\t return this.$refs.input;\\n\\t },\\n\\t nativeValidate: function nativeValidate() {\\n\\t return (this.input || {}).checkValidity && (~['url', 'email'].indexOf(this.type.toLowerCase()) || this.min || this.max);\\n\\t },\\n\\t regex: function regex() {\\n\\t return _utils.coerce.pattern(this.pattern);\\n\\t },\\n\\t showError: function showError() {\\n\\t return this.error && this.valid === false;\\n\\t },\\n\\t showHelp: function showHelp() {\\n\\t return this.help && (!this.showError || !this.hideHelp);\\n\\t },\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t title: function title() {\\n\\t return this.errorText || this.help || '';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t datalist: function datalist(val, old) {\\n\\t if (val !== old && val instanceof Array) {\\n\\t this.options = val;\\n\\t }\\n\\t },\\n\\t match: function match(val) {\\n\\t this.eval();\\n\\t },\\n\\t options: function options(val, old) {\\n\\t if (val !== old) this.$emit('options', val);\\n\\t },\\n\\t url: function url(val) {\\n\\t this._url();\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t var _this = this;\\n\\t\\n\\t this.$emit('input', _val);\\n\\t if (_val !== old) {\\n\\t if (this.mask instanceof Function) {\\n\\t _val = this.mask(_val || '');\\n\\t if (this.val !== _val) {\\n\\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\\n\\t this._timeout.mask = setTimeout(function () {\\n\\t _this.val = _val;\\n\\t }, isNaN(this.maskDelay) ? 0 : this.maskDelay);\\n\\t }\\n\\t }\\n\\t this.eval();\\n\\t }\\n\\t },\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (this._parent) this._parent.validate();\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.val !== val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t attr: function attr(value) {\\n\\t return ~['', null, undefined].indexOf(value) || value instanceof Function ? null : value;\\n\\t },\\n\\t emit: function emit(e) {\\n\\t this.$emit(e.type, e.type == 'input' ? e.target.value : e);\\n\\t if (e.type === 'blur' && this.canValidate) {\\n\\t this.valid = this.validate();\\n\\t }\\n\\t },\\n\\t eval: function _eval() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\\n\\t if (!this.canValidate) {\\n\\t this.valid = true;\\n\\t } else {\\n\\t this._timeout.eval = setTimeout(function () {\\n\\t _this2.valid = _this2.validate();\\n\\t _this2._timeout.eval = null;\\n\\t }, this.validationDelay);\\n\\t }\\n\\t },\\n\\t focus: function focus() {\\n\\t this.input.focus();\\n\\t },\\n\\t submit: function submit() {\\n\\t if (this.$parent._formValidator) {\\n\\t return this.$parent.validate();\\n\\t }\\n\\t if (this.input.form) {\\n\\t var invalids = (0, _NodeList2.default)('.form-group.validate:not(.has-success)', this.input.form);\\n\\t if (invalids.length) {\\n\\t invalids.find('input,textarea,select')[0].focus();\\n\\t } else {\\n\\t this.input.form.submit();\\n\\t }\\n\\t }\\n\\t },\\n\\t validate: function validate() {\\n\\t if (!this.canValidate) {\\n\\t return true;\\n\\t }\\n\\t var value = (this.val || '').trim();\\n\\t if (!value) {\\n\\t return !this.required;\\n\\t }\\n\\t if (this.match !== null) {\\n\\t return this.match === value;\\n\\t }\\n\\t if (value.length < this.minlength) {\\n\\t return false;\\n\\t }\\n\\t if (this.nativeValidate && !this.input.checkValidity()) {\\n\\t return false;\\n\\t }\\n\\t if (this.regex) {\\n\\t if (!(this.regex instanceof Function ? this.regex(this.value) : this.regex.test(this.value))) {\\n\\t return false;\\n\\t }\\n\\t }\\n\\t return true;\\n\\t },\\n\\t reset: function reset() {\\n\\t this.value = '';\\n\\t this.valid = null;\\n\\t if (this._timeout.mask) clearTimeout(this._timeout.mask);\\n\\t if (this._timeout.eval) clearTimeout(this._timeout.eval);\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._input = true;\\n\\t this._timeout = {};\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t this._url = (0, _utils.delayer)(function () {\\n\\t var _this3 = this;\\n\\t\\n\\t if (!this.url || !this.$http || this._loading) {\\n\\t return;\\n\\t }\\n\\t this._loading = true;\\n\\t this.$http.get(this.url).then(function (response) {\\n\\t var data = response.data instanceof Array ? response.data : [];\\n\\t try {\\n\\t data = JSON.parse(data);\\n\\t } catch (e) {}\\n\\t if (_this3.urlMap) {\\n\\t data = data.map(_this3.urlMap);\\n\\t }\\n\\t _this3.options = data;\\n\\t _this3.loading = false;\\n\\t }, function (response) {\\n\\t _this3.loading = false;\\n\\t });\\n\\t }, DELAY);\\n\\t if (this.url) this._url();\\n\\t },\\n\\t mounted: function mounted() {\\n\\t // $(this.input).on('focus', e => { this.$emit('focus', e) }).on('blur', e => {\\n\\t // if (this.canValidate) { this.valid = this.validate() }\\n\\t // this.$emit('blur', e)\\n\\t // })\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t // $(this.input).off()\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 118 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"form-group\\\",\\n\\t class: {\\n\\t validate: _vm.canValidate, 'has-feedback': _vm.icon, 'has-error': _vm.canValidate && _vm.valid === false, 'has-success': _vm.canValidate && _vm.valid\\n\\t }\\n\\t }, [_vm._t(\\\"label\\\", [(_vm.label) ? _vm._c('label', {\\n\\t staticClass: \\\"control-label\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.label))]) : _vm._e()]), _vm._v(\\\" \\\"), (_vm.$slots.before || _vm.$slots.after) ? _vm._c('div', {\\n\\t staticClass: \\\"input-group\\\"\\n\\t }, [_vm._t(\\\"before\\\"), _vm._v(\\\" \\\"), _vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t tag: \\\"textarea\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"cols\\\": _vm.cols,\\n\\t \\\"disabled\\\": _vm.disabled,\\n\\t \\\"list\\\": _vm.id_datalist,\\n\\t \\\"max\\\": _vm.attr(_vm.max),\\n\\t \\\"maxlength\\\": _vm.maxlength,\\n\\t \\\"min\\\": _vm.attr(_vm.min),\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"placeholder\\\": _vm.placeholder,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"rows\\\": _vm.rows,\\n\\t \\\"step\\\": _vm.step,\\n\\t \\\"title\\\": _vm.attr(_vm.title),\\n\\t \\\"type\\\": _vm.type == 'textarea' ? null : _vm.type\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": _vm.emit,\\n\\t \\\"focus\\\": _vm.emit,\\n\\t \\\"input\\\": [function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }, _vm.emit],\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.value) ? _vm._c('div', {\\n\\t class: {\\n\\t icon: _vm.icon\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.value = ''\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.icon) ? _vm._c('div', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }, [(_vm.icon && _vm.valid !== null) ? _vm._c('span', {\\n\\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t }) : _vm._e()]) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"after\\\")], 2) : [_vm._c(_vm.type == 'textarea' ? _vm.type : 'input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t tag: \\\"textarea\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"cols\\\": _vm.cols,\\n\\t \\\"disabled\\\": _vm.disabled,\\n\\t \\\"list\\\": _vm.id_datalist,\\n\\t \\\"max\\\": _vm.attr(_vm.max),\\n\\t \\\"maxlength\\\": _vm.maxlength,\\n\\t \\\"min\\\": _vm.attr(_vm.min),\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"placeholder\\\": _vm.placeholder,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"rows\\\": _vm.rows,\\n\\t \\\"step\\\": _vm.step,\\n\\t \\\"title\\\": _vm.attr(_vm.title),\\n\\t \\\"type\\\": _vm.type == 'textarea' ? null : _vm.type\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": _vm.emit,\\n\\t \\\"focus\\\": _vm.emit,\\n\\t \\\"input\\\": [function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }, _vm.emit],\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.type != 'textarea' && _vm.enterSubmit && _vm.submit()\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.val) ? _vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.val = ''\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.icon && _vm.valid !== null) ? _vm._c('span', {\\n\\t class: ['form-control-feedback glyphicon', 'glyphicon-' + (_vm.valid ? 'ok' : 'remove')],\\n\\t attrs: {\\n\\t \\\"aria-hidden\\\": \\\"true\\\"\\n\\t }\\n\\t }) : _vm._e()], _vm._v(\\\" \\\"), (_vm.id_datalist) ? _vm._c('datalist', {\\n\\t attrs: {\\n\\t \\\"id\\\": _vm.id_datalist\\n\\t }\\n\\t }, _vm._l((_vm.options), function(opc) {\\n\\t return _vm._c('option', {\\n\\t domProps: {\\n\\t \\\"value\\\": opc\\n\\t }\\n\\t })\\n\\t })) : _vm._e(), _vm._v(\\\" \\\"), (_vm.showHelp) ? _vm._c('div', {\\n\\t staticClass: \\\"help-block\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.help))]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.showError) ? _vm._c('div', {\\n\\t staticClass: \\\"help-block with-errors\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.focus\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.errorText))]) : _vm._e()], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-652ad7b9\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 119 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(120)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(122)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(127)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Modal.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-fe7d5dc8\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-fe7d5dc8\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Modal.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 120 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 122 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _isInteger = __webpack_require__(123);\\n\\t\\n\\tvar _isInteger2 = _interopRequireDefault(_isInteger);\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t backdrop: { type: Boolean, default: true },\\n\\t callback: { type: Function, default: null },\\n\\t cancelText: { type: String, default: 'Close' },\\n\\t effect: { type: String, default: null },\\n\\t large: { type: Boolean, default: false },\\n\\t okText: { type: String, default: 'Save changes' },\\n\\t small: { type: Boolean, default: false },\\n\\t title: { type: String, default: '' },\\n\\t value: { type: Boolean, required: true },\\n\\t width: { default: null }\\n\\t },\\n\\t computed: {\\n\\t optionalWidth: function optionalWidth() {\\n\\t if (this.width === null) {\\n\\t return null;\\n\\t } else if ((0, _isInteger2.default)(this.width)) {\\n\\t return this.width + 'px';\\n\\t }\\n\\t return this.width;\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t value: function value(val) {\\n\\t this.transitionstart();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t backClose: function backClose(e) {\\n\\t if (this.backdrop && e.target === this.$el) {\\n\\t this.close();\\n\\t }\\n\\t },\\n\\t close: function close() {\\n\\t this.$emit('cancel');\\n\\t this.$emit('input', false);\\n\\t },\\n\\t ok: function ok() {\\n\\t if (this.callback instanceof Function) this.callback();\\n\\t this.$emit('ok');\\n\\t this.$emit('input', true);\\n\\t },\\n\\t transitionstart: function transitionstart() {\\n\\t var el = this.$el;\\n\\t var body = document.body;\\n\\t var scrollBarWidth = (0, _utils.getScrollBarWidth)();\\n\\t if (this.value) {\\n\\t el.querySelector('.modal-content').focus();\\n\\t el.style.display = 'block';\\n\\t setTimeout(function () {\\n\\t return el.classList.add('in');\\n\\t }, 0);\\n\\t body.classList.add('modal-open');\\n\\t if (scrollBarWidth !== 0) {\\n\\t body.style.paddingRight = scrollBarWidth + 'px';\\n\\t }\\n\\t } else {\\n\\t el.classList.remove('in');\\n\\t }\\n\\t },\\n\\t transitionend: function transitionend() {\\n\\t if (!this.value) {\\n\\t this.$el.style.display = 'none';\\n\\t var body = document.body;\\n\\t body.style.paddingRight = null;\\n\\t body.classList.remove('modal-open');\\n\\t }\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 123 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports = { \\\"default\\\": __webpack_require__(124), __esModule: true };\\n\\n/***/ },\\n/* 124 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(125);\\n\\tmodule.exports = __webpack_require__(7).Number.isInteger;\\n\\n/***/ },\\n/* 125 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 20.1.2.3 Number.isInteger(number)\\n\\tvar $export = __webpack_require__(5);\\n\\t\\n\\t$export($export.S, 'Number', {isInteger: __webpack_require__(126)});\\n\\n/***/ },\\n/* 126 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 20.1.2.3 Number.isInteger(number)\\n\\tvar isObject = __webpack_require__(13)\\n\\t , floor = Math.floor;\\n\\tmodule.exports = function isInteger(it){\\n\\t return !isObject(it) && isFinite(it) && floor(it) === it;\\n\\t};\\n\\n/***/ },\\n/* 127 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['modal', _vm.effect],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"dialog\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.backClose,\\n\\t \\\"transitionend\\\": _vm.transitionend\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t class: {\\n\\t 'modal-dialog': true, 'modal-lg': _vm.large, 'modal-sm': _vm.small\\n\\t },\\n\\t style: ({\\n\\t width: _vm.optionalWidth\\n\\t }),\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"document\\\"\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"modal-content\\\"\\n\\t }, [_vm._t(\\\"modal-header\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-header\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"close\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.close\\n\\t }\\n\\t }, [_vm._c('span', [_vm._v(\\\"×\\\")])]), _vm._v(\\\" \\\"), _vm._c('h4', {\\n\\t staticClass: \\\"modal-title\\\"\\n\\t }, [_vm._t(\\\"title\\\", [_vm._v(_vm._s(_vm.title))])], 2)])]), _vm._v(\\\" \\\"), _vm._t(\\\"modal-body\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)]), _vm._v(\\\" \\\"), _vm._t(\\\"modal-footer\\\", [_vm._c('div', {\\n\\t staticClass: \\\"modal-footer\\\"\\n\\t }, [_vm._c('button', {\\n\\t staticClass: \\\"btn btn-default\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.close\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.cancelText))]), _vm._v(\\\" \\\"), _vm._c('button', {\\n\\t staticClass: \\\"btn btn-primary\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.ok\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.okText))])])])], 2)])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-fe7d5dc8\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 128 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(129)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(130)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Navbar.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-38f0619e\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-38f0619e\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Navbar.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 129 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t type: { type: String, default: 'default' },\\n\\t placement: { type: String, default: '' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t id: 'bs-example-navbar-collapse-1',\\n\\t collapsed: true,\\n\\t styles: {}\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t slots: function slots() {\\n\\t return this._slotContents;\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggleCollapse: function toggleCollapse(e) {\\n\\t e && e.preventDefault();\\n\\t this.collapsed = !this.collapsed;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._navbar = true;\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this = this;\\n\\t\\n\\t try {\\n\\t (function () {\\n\\t var $dropdown = (0, _NodeList2.default)('.dropdown>[data-toggle=\\\"dropdown\\\"]', _this.$el).parent();\\n\\t if ($dropdown) {\\n\\t $dropdown.on('click', '.dropdown-toggle', function (e) {\\n\\t e.preventDefault();\\n\\t $dropdown.each(function (content) {\\n\\t if (content.contains(e.target)) content.classList.toggle('open');\\n\\t });\\n\\t }).on('click', '.dropdown-menu>li>a', function (e) {\\n\\t $dropdown.each(function (content) {\\n\\t if (content.contains(e.target)) content.classList.remove('open');\\n\\t });\\n\\t }).onBlur(function (e) {\\n\\t $dropdown.each(function (content) {\\n\\t if (!content.contains(e.target)) content.classList.remove('open');\\n\\t });\\n\\t });\\n\\t }\\n\\t })();\\n\\t } catch (ex) {\\n\\t console.log('error finding dropdown');\\n\\t }\\n\\t\\n\\t (0, _NodeList2.default)(this.$el).on('click touchstart', 'li:not(.dropdown)>a', function (e) {\\n\\t setTimeout(function () {\\n\\t _this.collapsed = true;\\n\\t }, 200);\\n\\t }).onBlur(function (e) {\\n\\t if (!_this.$el.contains(e.target)) {\\n\\t _this.collapsed = true;\\n\\t }\\n\\t });\\n\\t var height = this.$el.offsetHeight;\\n\\t if (this.placement === 'top') {\\n\\t document.body.style.paddingTop = height + 'px';\\n\\t }\\n\\t if (this.placement === 'bottom') {\\n\\t document.body.style.paddingBottom = height + 'px';\\n\\t }\\n\\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\\\"collapse\\\"]', this.$el).on('click', function (e) {\\n\\t return _this.toggleCollapse(e);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t (0, _NodeList2.default)('.dropdown', this.$el).off('click').offBlur();\\n\\t if (this.$slots.collapse) (0, _NodeList2.default)('[data-toggle=\\\"collapse\\\"]', this.$el).off('click');\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 130 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('nav', {\\n\\t class: ['navbar', 'navbar-' + _vm.type, _vm.placement === 'static' ? 'navbar-static-top' : 'navbar-fixed-' + _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"container-fluid\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"navbar-header\\\"\\n\\t }, [(!_vm.$slots.collapse) ? _vm._c('button', {\\n\\t staticClass: \\\"navbar-toggle collapsed\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"button\\\",\\n\\t \\\"aria-expanded\\\": \\\"false\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggleCollapse\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"sr-only\\\"\\n\\t }, [_vm._v(\\\"Toggle navigation\\\")]), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon-bar\\\"\\n\\t })]) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"collapse\\\"), _vm._v(\\\" \\\"), _vm._t(\\\"brand\\\")], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t class: ['navbar-collapse', {\\n\\t collapse: _vm.collapsed\\n\\t }]\\n\\t }, [_vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2), _vm._v(\\\" \\\"), (_vm.$slots.left) ? _vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav navbar-left\\\"\\n\\t }, [_vm._t(\\\"left\\\")], 2) : _vm._e(), _vm._v(\\\" \\\"), (_vm.$slots.right) ? _vm._c('ul', {\\n\\t staticClass: \\\"nav navbar-nav navbar-right\\\"\\n\\t }, [_vm._t(\\\"right\\\")], 2) : _vm._e()])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-38f0619e\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 131 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(132)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(133)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Option.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-42088116\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-42088116\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Option.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 132 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: { value: null },\\n\\t data: function data() {\\n\\t return { loading: true };\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this.$parent._select) {\\n\\t if (!this.$parent.options) {\\n\\t this.$parent.options = [];\\n\\t }\\n\\t var el = {};\\n\\t el[this.$parent.optionsLabel] = this.$el.innerHTML;\\n\\t el[this.$parent.optionsValue] = this.value;\\n\\t this.$parent.options.push(el);\\n\\t this.loading = false;\\n\\t } else {\\n\\t console.warn('options only work inside a select component');\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 133 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return (_vm.loading) ? _vm._c('li', [_vm._t(\\\"default\\\")], 2) : _vm._e()\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-42088116\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 134 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(135)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(137)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(138)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Panel.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-b1e0461a\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-b1e0461a\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Panel.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 135 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 137 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t header: { type: String },\\n\\t isOpen: { type: Boolean, default: null },\\n\\t type: { type: String, default: null }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t open: this.isOpen\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t isOpen: function isOpen(val) {\\n\\t this.open = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t inAccordion: function inAccordion() {\\n\\t return this.$parent && this.$parent._isAccordion;\\n\\t },\\n\\t panelType: function panelType() {\\n\\t return 'panel-' + (this.type || this.$parent && this.$parent.type || 'default');\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggle: function toggle() {\\n\\t this.open = !this.open;\\n\\t if (this.inAccordion) {\\n\\t this.$parent.openChild(this);\\n\\t }\\n\\t },\\n\\t enter: function enter(el) {\\n\\t el.style.height = 'auto';\\n\\t var endWidth = getComputedStyle(el).height;\\n\\t el.style.height = '0px';\\n\\t el.offsetHeight; // force repaint\\n\\t el.style.height = endWidth;\\n\\t },\\n\\t afterEnter: function afterEnter(el) {\\n\\t el.style.height = 'auto';\\n\\t },\\n\\t beforeLeave: function beforeLeave(el) {\\n\\t el.style.height = getComputedStyle(el).height;\\n\\t el.offsetHeight; // force repaint\\n\\t el.style.height = '0px';\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t if (this.isOpen === null) {\\n\\t this.open = !this.inAccordion;\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 138 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['panel', _vm.panelType]\\n\\t }, [_vm._c('div', {\\n\\t class: ['panel-heading', {\\n\\t 'accordion-toggle': _vm.inAccordion\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.inAccordion && _vm.toggle()\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"header\\\", [_vm._c('h4', {\\n\\t staticClass: \\\"panel-title\\\"\\n\\t }, [_vm._v(_vm._s(_vm.header))])])], 2), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"collapse\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"enter\\\": _vm.enter,\\n\\t \\\"after-enter\\\": _vm.afterEnter,\\n\\t \\\"before-leave\\\": _vm.beforeLeave\\n\\t }\\n\\t }, [(_vm.open) ? _vm._c('div', {\\n\\t staticClass: \\\"panel-collapse\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"panel-body\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)]) : _vm._e()])], 1)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-b1e0461a\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 139 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(140)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(142)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(144)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Popover.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-2465bf54\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-2465bf54\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Popover.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 140 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 142 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _popoverMixins = __webpack_require__(143);\\n\\t\\n\\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t mixins: [_popoverMixins2.default],\\n\\t props: {\\n\\t trigger: { type: String, default: 'click' }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 143 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _NodeList = __webpack_require__(1);\\n\\t\\n\\tvar _NodeList2 = _interopRequireDefault(_NodeList);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t content: { type: String },\\n\\t effect: { type: String, default: 'fade' },\\n\\t header: { type: Boolean, default: true },\\n\\t placement: { type: String, default: 'top' },\\n\\t title: { type: String },\\n\\t trigger: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t top: 0,\\n\\t left: 0,\\n\\t show: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t events: function events() {\\n\\t return { contextmenu: ['contextmenu'], hover: ['mouseleave', 'mouseenter'], focus: ['blur', 'focus'] }[this.trigger] || ['click'];\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t beforeEnter: function beforeEnter() {\\n\\t var _this = this;\\n\\t\\n\\t this.position();\\n\\t setTimeout(function () {\\n\\t return _this.position();\\n\\t }, 30);\\n\\t },\\n\\t position: function position() {\\n\\t var _this2 = this;\\n\\t\\n\\t this.$nextTick(function () {\\n\\t var popover = _this2.$refs.popover;\\n\\t var trigger = _this2.$refs.trigger.children[0];\\n\\t switch (_this2.placement) {\\n\\t case 'top':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\\n\\t _this2.top = trigger.offsetTop - popover.offsetHeight;\\n\\t break;\\n\\t case 'left':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\\n\\t break;\\n\\t case 'right':\\n\\t _this2.left = trigger.offsetLeft + trigger.offsetWidth;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight / 2 - popover.offsetHeight / 2;\\n\\t break;\\n\\t case 'bottom':\\n\\t _this2.left = trigger.offsetLeft - popover.offsetWidth / 2 + trigger.offsetWidth / 2;\\n\\t _this2.top = trigger.offsetTop + trigger.offsetHeight;\\n\\t break;\\n\\t default:\\n\\t console.warn('Wrong placement prop');\\n\\t }\\n\\t popover.style.top = _this2.top + 'px';\\n\\t popover.style.left = _this2.left + 'px';\\n\\t });\\n\\t },\\n\\t toggle: function toggle(e) {\\n\\t if (e && this.trigger === 'contextmenu') e.preventDefault();\\n\\t this.show = !this.show;\\n\\t if (this.show) this.beforeEnter();\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t var _this3 = this;\\n\\t\\n\\t var trigger = this.$refs.trigger.children[0];\\n\\t if (!trigger) return console.error('Could not find trigger v-el in your component that uses popoverMixin.');\\n\\t\\n\\t if (this.trigger === 'focus' && !~trigger.tabIndex) {\\n\\t trigger = (0, _NodeList2.default)('a,input,select,textarea,button', trigger);\\n\\t if (!trigger.length) {\\n\\t return;\\n\\t }\\n\\t }\\n\\t this.events.forEach(function (event) {\\n\\t (0, _NodeList2.default)(trigger).on(event, _this3.toggle);\\n\\t });\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._trigger) (0, _NodeList2.default)(this._trigger).off();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 144 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', {\\n\\t ref: \\\"trigger\\\"\\n\\t }, [_vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.effect\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t ref: \\\"popover\\\",\\n\\t class: ['popover', _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"arrow\\\"\\n\\t }), _vm._v(\\\" \\\"), (_vm.title) ? _vm._c('h3', {\\n\\t staticClass: \\\"popover-title\\\"\\n\\t }, [_vm._t(\\\"title\\\", [_vm._v(_vm._s(_vm.title))])], 2) : _vm._e(), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"popover-content\\\"\\n\\t }, [_vm._t(\\\"content\\\", [_vm._c('span', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.content)\\n\\t }\\n\\t })])], 2)]) : _vm._e()])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-2465bf54\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 145 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(146)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(147)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Progressbar.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-68aa3375\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-68aa3375\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Progressbar.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 146 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t animated: { type: Boolean, default: false },\\n\\t label: { default: false },\\n\\t now: { required: true },\\n\\t striped: { type: Boolean, default: false },\\n\\t type: { type: String }\\n\\t },\\n\\t computed: {\\n\\t labelBool: function labelBool() {\\n\\t return _utils.coerce.boolean(this.label);\\n\\t },\\n\\t nowNum: function nowNum() {\\n\\t return _utils.coerce.number(this.now);\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 147 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: ['progress-bar', 'progress-bar-' + _vm.type, {\\n\\t active: _vm.animated,\\n\\t 'progress-bar-striped': _vm.striped\\n\\t }],\\n\\t style: ({\\n\\t width: _vm.nowNum + '%'\\n\\t }),\\n\\t domProps: {\\n\\t \\\"textContent\\\": _vm._s(_vm.labelBool ? _vm.nowNum + '%' : null)\\n\\t }\\n\\t })\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-68aa3375\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 148 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(149)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(151)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(152)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Radio.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-74cfd92c\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-74cfd92c\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Radio.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 149 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 151 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t button: { type: Boolean, default: false },\\n\\t checkedValue: { default: true },\\n\\t disabled: { type: Boolean, default: false },\\n\\t name: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: false },\\n\\t type: { type: String, default: null },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t check: this.value\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t return this.check === this.checkedValue;\\n\\t },\\n\\t parentValue: function parentValue() {\\n\\t return this._inGroup ? this.$parent.val === this.value : null;\\n\\t },\\n\\t buttonStyle: function buttonStyle() {\\n\\t return this.button || this._inGroup && this.$parent.buttons;\\n\\t },\\n\\t typeColor: function typeColor() {\\n\\t return this.type || this.$parent && this.$parent.type || 'default';\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t check: function check(val) {\\n\\t if (this.checkedValue === val) {\\n\\t this.$emit('input', val);\\n\\t this.$emit('checked', true);\\n\\t if (this._inGroup) {\\n\\t this.$parent.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t parentValue: function parentValue(val) {\\n\\t if (this.check !== val && this.checkedValue === val) {\\n\\t this.check = val;\\n\\t }\\n\\t },\\n\\t value: function value(val) {\\n\\t this.check = this.checkedValue === val ? val : null;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t var parent = this.$parent;\\n\\t if (parent && parent._btnGroup && !parent._checkboxGroup) {\\n\\t this._inGroup = true;\\n\\t parent._radioGroup = true;\\n\\t }\\n\\t if (this.$parent._radioGroup) {\\n\\t if (this.$parent.val) {\\n\\t this.check = this.$parent.val === this.checkedValue;\\n\\t } else if (this.check) {\\n\\t this.$parent.val = this.checkedValue;\\n\\t }\\n\\t }\\n\\t },\\n\\t\\n\\t methods: {\\n\\t focus: function focus() {\\n\\t this.$refs.input.focus();\\n\\t },\\n\\t toggle: function toggle() {\\n\\t if (this.disabled) {\\n\\t return;\\n\\t }\\n\\t this.focus();\\n\\t if (this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.check = this.checkedValue;\\n\\t if (this._inGroup) {\\n\\t this.$parent.val = this.checkedValue;\\n\\t }\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 152 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c(_vm.buttonStyle ? 'label' : 'div', {\\n\\t tag: \\\"div\\\",\\n\\t class: [(_vm.buttonStyle ? 'btn btn-' + _vm.typeColor : 'radio ' + _vm.typeColor), {\\n\\t active: _vm.active,\\n\\t disabled: _vm.disabled,\\n\\t readonly: _vm.readonly\\n\\t }],\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }\\n\\t }\\n\\t }, [(_vm.buttonStyle) ? [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (!_vm.readonly),\\n\\t expression: \\\"!readonly\\\"\\n\\t }, {\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.check),\\n\\t expression: \\\"check\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"radio\\\",\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.checkedValue,\\n\\t \\\"checked\\\": _vm._q(_vm.check, _vm.checkedValue)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.check = _vm.checkedValue\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")] : _vm._c('label', {\\n\\t staticClass: \\\"open\\\"\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.check),\\n\\t expression: \\\"check\\\"\\n\\t }],\\n\\t ref: \\\"input\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"radio\\\",\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.checkedValue,\\n\\t \\\"checked\\\": _vm._q(_vm.check, _vm.checkedValue)\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.check = _vm.checkedValue\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t staticClass: \\\"icon dropdown-toggle\\\",\\n\\t class: [_vm.active ? 'btn-' + _vm.typeColor : '', {\\n\\t bg: _vm.typeColor === 'default'\\n\\t }]\\n\\t }), _vm._v(\\\" \\\"), (_vm.active && _vm.typeColor === 'default') ? _vm._c('span', {\\n\\t staticClass: \\\"icon\\\"\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\")], 2)], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-74cfd92c\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 153 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(154)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(156)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(157)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Select.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t__vue_options__._scopeId = \\\"data-v-e514dbc6\\\"\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-e514dbc6\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-e514dbc6\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Select.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 154 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 156 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _ClickOutside = __webpack_require__(66);\\n\\t\\n\\tvar _ClickOutside2 = _interopRequireDefault(_ClickOutside);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\tvar timeout = {};\\n\\texports.default = {\\n\\t directives: {\\n\\t ClickOutside: _ClickOutside2.default\\n\\t },\\n\\t props: {\\n\\t clearButton: { type: Boolean, default: false },\\n\\t closeOnSelect: { type: Boolean, default: false },\\n\\t disabled: { type: Boolean, default: false },\\n\\t lang: { type: String, default: navigator.language },\\n\\t limit: { type: Number, default: 1024 },\\n\\t minSearch: { type: Number, default: 0 },\\n\\t multiple: { type: Boolean, default: false },\\n\\t name: { type: String, default: null },\\n\\t options: { type: Array, default: function _default() {\\n\\t return [];\\n\\t }\\n\\t },\\n\\t optionsLabel: { type: String, default: 'label' },\\n\\t optionsValue: { type: String, default: 'value' },\\n\\t parent: { default: true },\\n\\t placeholder: { type: String, default: null },\\n\\t readonly: { type: Boolean, default: null },\\n\\t required: { type: Boolean, default: null },\\n\\t search: { type: Boolean, default: false },\\n\\t searchText: { type: String, default: null },\\n\\t url: { type: String, default: null },\\n\\t value: null\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t list: [],\\n\\t loading: null,\\n\\t searchValue: null,\\n\\t show: false,\\n\\t notify: false,\\n\\t val: null,\\n\\t valid: null\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t canSearch: function canSearch() {\\n\\t return this.minSearch ? this.list.length >= this.minSearch : this.search;\\n\\t },\\n\\t classes: function classes() {\\n\\t return [{ open: this.show, disabled: this.disabled }, this.class, this.isLi ? 'dropdown' : this.inInput ? 'input-group-btn' : 'btn-group'];\\n\\t },\\n\\t filteredOptions: function filteredOptions() {\\n\\t var _this = this;\\n\\t\\n\\t var search = (this.searchValue || '').toLowerCase();\\n\\t return !search ? this.list : this.list.filter(function (el) {\\n\\t return ~el[_this.optionsLabel].toLowerCase().search(search);\\n\\t });\\n\\t },\\n\\t hasParent: function hasParent() {\\n\\t return this.parent instanceof Array ? this.parent.length : this.parent;\\n\\t },\\n\\t inInput: function inInput() {\\n\\t return this.$parent._input;\\n\\t },\\n\\t isLi: function isLi() {\\n\\t return this.$parent._navbar || this.$parent.menu || this.$parent._tabset;\\n\\t },\\n\\t limitText: function limitText() {\\n\\t return this.text.limit.replace('{{limit}}', this.limit);\\n\\t },\\n\\t selected: function selected() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this.list.length === 0) {\\n\\t return '';\\n\\t }\\n\\t var sel = this.values.map(function (val) {\\n\\t return (_this2.list.find(function (o) {\\n\\t return o[_this2.optionsValue] === val;\\n\\t }) || {})[_this2.optionsLabel];\\n\\t }).filter(function (val) {\\n\\t return val !== undefined;\\n\\t });\\n\\t this.$emit('selected', sel);\\n\\t return sel.join(', ');\\n\\t },\\n\\t showPlaceholder: function showPlaceholder() {\\n\\t return this.values.length === 0 || !this.hasParent ? this.placeholder || this.text.notSelected : null;\\n\\t },\\n\\t text: function text() {\\n\\t return (0, _utils.translations)(this.lang);\\n\\t },\\n\\t values: function values() {\\n\\t return this.val instanceof Array ? this.val : ~[null, undefined].indexOf(this.val) ? [] : [this.val];\\n\\t },\\n\\t valOptions: function valOptions() {\\n\\t var _this3 = this;\\n\\t\\n\\t return this.list.map(function (el) {\\n\\t return el[_this3.optionsValue];\\n\\t });\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t options: function options(_options) {\\n\\t if (_options instanceof Array) this.setOptions(_options);\\n\\t },\\n\\t show: function show(val) {\\n\\t if (val) {\\n\\t this.$refs.search ? this.$refs.search.focus() : this.$refs.btn.focus();\\n\\t // onBlur(this.$refs.select, e => { this.show = false })\\n\\t } else {\\n\\t // offBlur(this.$refs.select)\\n\\t }\\n\\t },\\n\\t url: function url() {\\n\\t this.urlChanged();\\n\\t },\\n\\t valid: function valid(val, old) {\\n\\t this.$emit('isvalid', val);\\n\\t this.$emit(!val ? 'invalid' : 'valid');\\n\\t if (val !== old && this._parent) this._parent.validate();\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this.val = val;\\n\\t }\\n\\t },\\n\\t val: function val(_val, old) {\\n\\t var _this4 = this;\\n\\t\\n\\t if (_val === undefined) {\\n\\t this.val = _val = null;\\n\\t }\\n\\t if (_val !== old) {\\n\\t this.$emit('change', _val);\\n\\t this.$emit('input', _val);\\n\\t }\\n\\t if (_val instanceof Array && _val.length > this.limit) {\\n\\t this.val = _val.slice(0, this.limit);\\n\\t this.notify = true;\\n\\t if (timeout.limit) clearTimeout(timeout.limit);\\n\\t timeout.limit = setTimeout(function () {\\n\\t timeout.limit = false;\\n\\t _this4.notify = false;\\n\\t }, 1500);\\n\\t }\\n\\t this.valid = this.validate();\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t close: function close() {\\n\\t this.show = false;\\n\\t },\\n\\t checkData: function checkData() {\\n\\t if (this.multiple) {\\n\\t if (this.limit < 1) {\\n\\t this.limit = 1;\\n\\t }\\n\\t if (!(this.val instanceof Array)) {\\n\\t this.val = this.val === null || this.val === undefined ? [] : [this.val];\\n\\t }\\n\\t var values = this.valOptions;\\n\\t this.val = this.val.filter(function (el) {\\n\\t return ~values.indexOf(el);\\n\\t });\\n\\t if (this.values.length > this.limit) {\\n\\t this.val = this.val.slice(0, this.limit);\\n\\t }\\n\\t } else {\\n\\t if (!~this.valOptions.indexOf(this.val)) {\\n\\t this.val = null;\\n\\t }\\n\\t }\\n\\t },\\n\\t clear: function clear() {\\n\\t if (this.disabled || this.readonly) {\\n\\t return;\\n\\t }\\n\\t this.val = this.val instanceof Array ? [] : null;\\n\\t this.toggle();\\n\\t },\\n\\t clearSearch: function clearSearch() {\\n\\t this.searchValue = '';\\n\\t this.$refs.search.focus();\\n\\t },\\n\\t isSelected: function isSelected(v) {\\n\\t return this.values.indexOf(v) > -1;\\n\\t },\\n\\t select: function select(v) {\\n\\t if (this.val instanceof Array) {\\n\\t var newVal = this.val.slice(0);\\n\\t if (~newVal.indexOf(v)) {\\n\\t newVal.splice(newVal.indexOf(v), 1);\\n\\t } else {\\n\\t newVal.push(v);\\n\\t }\\n\\t this.val = newVal;\\n\\t if (this.closeOnSelect) {\\n\\t this.toggle();\\n\\t }\\n\\t } else {\\n\\t this.val = v;\\n\\t this.toggle();\\n\\t }\\n\\t },\\n\\t setOptions: function setOptions(options) {\\n\\t var _this5 = this;\\n\\t\\n\\t this.list = options.map(function (el) {\\n\\t if (el instanceof Object) {\\n\\t return el;\\n\\t }\\n\\t var obj = {};\\n\\t obj[_this5.optionsLabel] = el;\\n\\t obj[_this5.optionsValue] = el;\\n\\t return obj;\\n\\t });\\n\\t this.$emit('options', this.list);\\n\\t },\\n\\t toggle: function toggle() {\\n\\t this.show = !this.show;\\n\\t if (!this.show) this.$refs.btn.focus();\\n\\t },\\n\\t urlChanged: function urlChanged() {\\n\\t var _this6 = this;\\n\\t\\n\\t if (!this.url || !this.$http) {\\n\\t return;\\n\\t }\\n\\t this.loading = true;\\n\\t this.$http.get(this.url).then(function (response) {\\n\\t var data = response.data instanceof Array ? response.data : [];\\n\\t try {\\n\\t data = JSON.parse(data);\\n\\t } catch (e) {}\\n\\t _this6.setOptions(data);\\n\\t _this6.loading = false;\\n\\t _this6.checkData();\\n\\t }, function (response) {\\n\\t _this6.loading = false;\\n\\t });\\n\\t },\\n\\t validate: function validate() {\\n\\t return !this.required ? true : this.val instanceof Array ? this.val.length > 0 : this.val !== null;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this.setOptions(this.options);\\n\\t this.val = this.value;\\n\\t this._select = true;\\n\\t if (this.val === undefined || !this.parent) {\\n\\t this.val = null;\\n\\t }\\n\\t if (!this.multiple && this.val instanceof Array) {\\n\\t this.val = this.val[0];\\n\\t }\\n\\t this.checkData();\\n\\t if (this.url) this.urlChanged();\\n\\t var parent = this.$parent;\\n\\t while (parent && !parent._formValidator) {\\n\\t parent = parent.$parent;\\n\\t }\\n\\t if (parent && parent._formValidator) {\\n\\t parent.children.push(this);\\n\\t this._parent = parent;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this._parent) this._parent.children.push(this);\\n\\t this.setOptions(this.options);\\n\\t this.val = this.value;\\n\\t this.checkData();\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._parent) {\\n\\t var index = this._parent.children.indexOf(this);\\n\\t this._parent.children.splice(index, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 157 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"click-outside\\\",\\n\\t rawName: \\\"v-click-outside\\\",\\n\\t value: (_vm.close),\\n\\t expression: \\\"close\\\"\\n\\t }],\\n\\t ref: \\\"select\\\",\\n\\t class: _vm.classes\\n\\t }, [_vm._c('div', {\\n\\t ref: \\\"btn\\\",\\n\\t staticClass: \\\"form-control dropdown-toggle\\\",\\n\\t attrs: {\\n\\t \\\"tabindex\\\": \\\"1\\\",\\n\\t \\\"disabled\\\": _vm.disabled || !_vm.hasParent,\\n\\t \\\"readonly\\\": _vm.readonly\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": function($event) {\\n\\t _vm.canSearch ? null : _vm.close()\\n\\t },\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.toggle()\\n\\t },\\n\\t \\\"keydown\\\": [function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.close($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"space\\\", 32)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t $event.stopPropagation();\\n\\t $event.preventDefault();\\n\\t _vm.toggle($event)\\n\\t }]\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t staticClass: \\\"btn-content\\\",\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.loading ? _vm.text.loading : _vm.showPlaceholder || _vm.selected)\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), (_vm.clearButton && _vm.values.length) ? _vm._c('span', {\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t _vm.clear()\\n\\t }\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")]) : _vm._e()]), _vm._v(\\\" \\\"), _vm._c('select', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t ref: \\\"sel\\\",\\n\\t staticClass: \\\"secret\\\",\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.name,\\n\\t \\\"multiple\\\": _vm.multiple,\\n\\t \\\"required\\\": _vm.required,\\n\\t \\\"readonly\\\": _vm.readonly,\\n\\t \\\"disabled\\\": _vm.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"change\\\": function($event) {\\n\\t _vm.val = Array.prototype.filter.call($event.target.options, function(o) {\\n\\t return o.selected\\n\\t }).map(function(o) {\\n\\t var val = \\\"_value\\\" in o ? o._value : o.value;\\n\\t return val\\n\\t })[0]\\n\\t }\\n\\t }\\n\\t }, [(_vm.required) ? _vm._c('option', {\\n\\t attrs: {\\n\\t \\\"value\\\": \\\"\\\"\\n\\t }\\n\\t }) : _vm._e(), _vm._v(\\\" \\\"), _vm._l((_vm.list), function(option) {\\n\\t return _vm._c('option', {\\n\\t domProps: {\\n\\t \\\"value\\\": option[_vm.optionsValue]\\n\\t }\\n\\t }, [_vm._v(_vm._s(option[_vm.optionsLabel]))])\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._c('ul', {\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, [(_vm.list.length) ? [(_vm.canSearch) ? _vm._c('li', {\\n\\t staticClass: \\\"bs-searchbox\\\"\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.searchValue),\\n\\t expression: \\\"searchValue\\\"\\n\\t }],\\n\\t ref: \\\"search\\\",\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"text\\\",\\n\\t \\\"placeholder\\\": _vm.searchText || _vm.text.search,\\n\\t \\\"autocomplete\\\": \\\"off\\\"\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.searchValue)\\n\\t },\\n\\t on: {\\n\\t \\\"keyup\\\": function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.close($event)\\n\\t },\\n\\t \\\"input\\\": function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.searchValue = $event.target.value\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.searchValue),\\n\\t expression: \\\"searchValue\\\"\\n\\t }],\\n\\t staticClass: \\\"close\\\",\\n\\t on: {\\n\\t \\\"click\\\": _vm.clearSearch\\n\\t }\\n\\t }, [_vm._v(\\\"×\\\")])]) : _vm._e(), _vm._v(\\\" \\\"), (_vm.required && !_vm.clearButton) ? _vm._c('li', [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.clear() && _vm.close()\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(_vm.placeholder || _vm.text.notSelected))])]) : _vm._e(), _vm._v(\\\" \\\"), _vm._l((_vm.filteredOptions), function(option) {\\n\\t return _vm._c('li', {\\n\\t attrs: {\\n\\t \\\"id\\\": option[_vm.optionsValue]\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(option[_vm.optionsValue])\\n\\t }\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(option[_vm.optionsLabel])\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('span', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.isSelected(option[_vm.optionsValue])),\\n\\t expression: \\\"isSelected(option[optionsValue])\\\"\\n\\t }],\\n\\t staticClass: \\\"glyphicon glyphicon-ok check-mark\\\"\\n\\t })])])\\n\\t })] : _vm._e(), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), (_vm.notify && !_vm.closeOnSelect) ? _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"fadein\\\"\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"notify in\\\"\\n\\t }, [_vm._v(_vm._s(_vm.limitText))])]) : _vm._e()], 2), _vm._v(\\\" \\\"), (_vm.notify && _vm.closeOnSelect) ? _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": \\\"fadein\\\"\\n\\t }\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"notify out\\\"\\n\\t }, [_vm._c('div', [_vm._v(_vm._s(_vm.limitText))])])]) : _vm._e()], 1)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-e514dbc6\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 158 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(159)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(160)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Slider.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-32185b82\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-32185b82\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Slider.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 159 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t computed: {\\n\\t index: function index() {\\n\\t return this.$parent.$children.indexOf(this);\\n\\t },\\n\\t show: function show() {\\n\\t return this.$parent.index === this.index;\\n\\t }\\n\\t },\\n\\t mounted: function mounted() {\\n\\t if (this.$parent.indicator_list) {\\n\\t this.$parent.indicator_list.push(this.index);\\n\\t }\\n\\t\\n\\t if (this.index === 0) {\\n\\t this.$el.classList.add('active');\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 160 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t staticClass: \\\"item\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-32185b82\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 161 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(162)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(164)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(165)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Spinner.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-8b298e70\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-8b298e70\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Spinner.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 162 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 164 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar MIN_WAIT = 500; // in ms\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t fixed: { type: Boolean, default: false },\\n\\t global: { type: Boolean, default: false },\\n\\t size: { type: String, default: 'md' },\\n\\t text: { type: String, default: '' },\\n\\t value: { default: false }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t active: this.value,\\n\\t locked: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t spinnerSize: function spinnerSize() {\\n\\t return 'spinner-' + (this.size ? this.size : 'sm');\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t active: function active(val, old) {\\n\\t if (val !== old) this.$emit('input', val);\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this[val ? 'show' : 'hide']();\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t hide: function hide() {\\n\\t var delay = 0;\\n\\t this.active = false;\\n\\t },\\n\\t show: function show(options) {\\n\\t if (options) {\\n\\t if (options.text) {\\n\\t this.text = options.text;\\n\\t }\\n\\t if (options.size) {\\n\\t this.size = options.size;\\n\\t }\\n\\t if (options.fixed) {\\n\\t this.fixed = options.fixed;\\n\\t }\\n\\t }\\n\\t // block scrolling when spinner is on\\n\\t this._body.style.overflowY = 'hidden';\\n\\t // activate spinner\\n\\t this._started = new Date();\\n\\t this.active = true;\\n\\t this.locked = true;\\n\\t this._unlock();\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._body = document.body;\\n\\t this._bodyOverflow = document.body.style.overflowY;\\n\\t this._unlock = (0, _utils.delayer)(function () {\\n\\t this.locked = false;\\n\\t this._body.style.overflowY = this._bodyOverflow;\\n\\t }, MIN_WAIT);\\n\\t if (this.global) {\\n\\t if (!this.$root._globalSpinner) {\\n\\t this.$root._globalSpinner = true;\\n\\t var self = this;\\n\\t this._global = {\\n\\t hide: function hide() {\\n\\t self.hide();\\n\\t },\\n\\t show: function show() {\\n\\t self.show();\\n\\t }\\n\\t };\\n\\t this.$root.$on('spinner::show', this._global.show);\\n\\t this.$root.$on('spinner::hide', this._global.hide);\\n\\t }\\n\\t }\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t if (this._global) {\\n\\t this.$root.$off('spinner::show', this._global.show);\\n\\t this.$root.$off('spinner::hide', this._global.hide);\\n\\t delete this.$root._globalSpinner;\\n\\t }\\n\\t clearTimeout(this._spinnerAnimation);\\n\\t this._body.style.overflowY = this._bodyOverflow;\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 165 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t directives: [{\\n\\t name: \\\"show\\\",\\n\\t rawName: \\\"v-show\\\",\\n\\t value: (_vm.active || _vm.locked),\\n\\t expression: \\\"active||locked\\\"\\n\\t }],\\n\\t class: ['spinner spinner-gritcode', _vm.spinnerSize, {\\n\\t 'spinner-fixed': _vm.fixed\\n\\t }]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"spinner-wrapper\\\"\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"spinner-circle\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"spinner-text\\\"\\n\\t }, [_vm._v(_vm._s(_vm.text))])])])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-8b298e70\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 166 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(167)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(168)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tab.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-0985e878\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-0985e878\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tab.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 167 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t header: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t fadein: false\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t var _this = this;\\n\\t\\n\\t var active = !this._tabs || this._tabs.show === this;\\n\\t this.fadein = false;\\n\\t if (active) {\\n\\t setTimeout(function () {\\n\\t _this.fadein = true;\\n\\t }, 0);\\n\\t }\\n\\t return active;\\n\\t },\\n\\t index: function index() {\\n\\t return this._tabs.tabs.indexOf(this);\\n\\t },\\n\\t transition: function transition() {\\n\\t return this._tabs ? this._tabs.effect : null;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTab = true;\\n\\t var tabs = this;\\n\\t while (!this._tabs && tabs.$parent) {\\n\\t if (tabs._isTabGroup) {\\n\\t tabs.tabs.push(this);\\n\\t this._tabGroup = tabs;\\n\\t }\\n\\t if (tabs._isTabs) {\\n\\t tabs.tabs.push(this);\\n\\t this._tabs = tabs;\\n\\t if (!this._tabGroup) tabs.headers.push(this);\\n\\t }\\n\\t tabs = tabs.$parent;\\n\\t }\\n\\t if (!this._tabs) throw Error('tab depend on tabs.');\\n\\t },\\n\\t beforeDestroy: function beforeDestroy() {\\n\\t var _this2 = this;\\n\\t\\n\\t if (this._tabGroup) {\\n\\t this._tabGroup.tabs = this._tabGroup.tabs.filter(function (el) {\\n\\t return el !== _this2;\\n\\t });\\n\\t }\\n\\t if (this._tabs) {\\n\\t this._tabs.tabs = this._tabs.tabs.filter(function (el) {\\n\\t return el !== _this2;\\n\\t });\\n\\t }\\n\\t if (this._tabs) {\\n\\t if (this._tabs.active === this.index) {\\n\\t this._tabs.index = 0;\\n\\t }\\n\\t if (this._ingroup) {\\n\\t var id = this.$parent.tabs.indexOf(this);\\n\\t if (~id) this.$parent.tabs.splice(id, 1);\\n\\t }\\n\\t }\\n\\t if (this._tabs) {\\n\\t var _id = this._tabs.tabs.indexOf(this);\\n\\t if (~_id) this._tabs.tabs.splice(_id, 1);\\n\\t }\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 168 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t ref: \\\"panel\\\",\\n\\t class: ['tab-pane', {\\n\\t 'active fade': _vm.active,\\n\\t 'in': _vm.fadein\\n\\t }],\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"tabpanel\\\"\\n\\t }\\n\\t }, [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-0985e878\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 169 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(170)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(172)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(173)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\TabGroup.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-55faf3cb\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-55faf3cb\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] TabGroup.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 170 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 172 */\\n/***/ function(module, exports) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { type: Boolean, default: false },\\n\\t header: { type: String }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t show: false,\\n\\t tabs: []\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t active: function active() {\\n\\t return ~this.tabs.indexOf(this._tabs.show);\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t blur: function blur() {\\n\\t this.show = false;\\n\\t },\\n\\t toggle: function toggle() {\\n\\t this.show = !this.show;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTabGroup = true;\\n\\t if (this.$parent) {\\n\\t if (this.$parent._isTabGroup) throw Error('Can\\\\'t nest tab-groups.');\\n\\t if (!this.$parent._isTabs) throw Error('tab-group depend on tabs.');\\n\\t }\\n\\t this._tabs = this.$parent;\\n\\t this._tabs.headers.push(this);\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 173 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', [_vm._t(\\\"default\\\")], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-55faf3cb\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 174 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(175)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(177)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(178)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tabs.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-70100ddf\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-70100ddf\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tabs.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 175 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 177 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tvar _Dropdown = __webpack_require__(105);\\n\\t\\n\\tvar _Dropdown2 = _interopRequireDefault(_Dropdown);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t components: {\\n\\t dropdown: _Dropdown2.default\\n\\t },\\n\\t props: {\\n\\t // effect: {type: String, default: 'fadein'},\\n\\t justified: false,\\n\\t navStyle: { type: String, default: null },\\n\\t value: { type: Number, default: 0 }\\n\\t },\\n\\t data: function data() {\\n\\t var index = this.value || 0;\\n\\t return {\\n\\t index: index,\\n\\t headers: [],\\n\\t tabs: []\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t index: function index(val) {\\n\\t this.$emit('active', val);\\n\\t this.$emit('input', val);\\n\\t },\\n\\t value: function value(val) {\\n\\t this.index = val;\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t navStyleClass: function navStyleClass() {\\n\\t return ['nav', ~['pills', 'stacked'].indexOf(this.navStyle) ? 'nav-' + this.navStyle : 'nav-tabs', {\\n\\t 'nav-justified': _utils.coerce.boolean(this.justified),\\n\\t 'nav-pills': this.navStyle === 'stacked'\\n\\t }];\\n\\t },\\n\\t show: function show() {\\n\\t return this.tabs[this.index] || this.tabs[0];\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t select: function select(tab) {\\n\\t if (!tab.disabled) {\\n\\t this.index = this.tabs.indexOf(tab);\\n\\t }\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this._isTabs = true;\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 178 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t attrs: {\\n\\t \\\"tabs\\\": \\\"\\\"\\n\\t }\\n\\t }, [_vm._c('ul', {\\n\\t class: _vm.navStyleClass,\\n\\t attrs: {\\n\\t \\\"role\\\": \\\"tablist\\\"\\n\\t }\\n\\t }, [_vm._l((_vm.headers), function(header) {\\n\\t return [(header._isTab) ? _vm._c('li', {\\n\\t class: {\\n\\t active: header.active, disabled: header.disabled\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(header)\\n\\t }\\n\\t }\\n\\t }, [_vm._t(\\\"header\\\", [_vm._c('a', {\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"#\\\"\\n\\t },\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(header.header)\\n\\t }\\n\\t })])], 2) : _vm._e(), _vm._v(\\\" \\\"), (header._isTabGroup) ? _vm._c('dropdown', {\\n\\t class: {\\n\\t active: header.active\\n\\t },\\n\\t attrs: {\\n\\t \\\"text\\\": header.header,\\n\\t \\\"disabled\\\": header.disabled\\n\\t }\\n\\t }, _vm._l((header.tabs), function(tab) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t disabled: tab.disabled\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"#\\\"\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.select(tab)\\n\\t }\\n\\t }\\n\\t }, [_vm._v(_vm._s(tab.header))])])\\n\\t })) : _vm._e()]\\n\\t })], 2), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"tab-content\\\"\\n\\t }, [_vm._t(\\\"default\\\")], 2)])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-70100ddf\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 179 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(180)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(181)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\ToggleButton.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-f034a5f2\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-f034a5f2\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] ToggleButton.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 180 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t disabled: { default: null },\\n\\t falseType: { default: null },\\n\\t name: null,\\n\\t readonly: { default: null },\\n\\t trueType: { default: 'primary' },\\n\\t value: false\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t active: _utils.coerce.boolean(this.value),\\n\\t types: {\\n\\t danger: 'btn-danger',\\n\\t info: 'btn-info',\\n\\t primary: 'btn-primary',\\n\\t success: 'btn-success',\\n\\t warning: 'btn-warning'\\n\\t }\\n\\t };\\n\\t },\\n\\t\\n\\t watch: {\\n\\t active: function active(val, old) {\\n\\t if (val !== old) {\\n\\t this.$emit('changed', val);\\n\\t this.$emit(val ? 'enabled' : 'disabled');\\n\\t this.$emit('input', val);\\n\\t }\\n\\t },\\n\\t value: function value(val, old) {\\n\\t if (val !== old) {\\n\\t this.active = _utils.coerce.boolean(this.value);\\n\\t }\\n\\t }\\n\\t },\\n\\t computed: {\\n\\t boolDisabled: function boolDisabled() {\\n\\t return _utils.coerce.boolean(this.disabled);\\n\\t },\\n\\t boolReadonly: function boolReadonly() {\\n\\t return _utils.coerce.boolean(this.readonly);\\n\\t },\\n\\t type: function type() {\\n\\t return this.types[this.value ? this.trueType : this.falseType] || 'btn-default';\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t toggle: function toggle() {\\n\\t if (this.boolDisabled || this.boolReadonly) {\\n\\t return;\\n\\t }\\n\\t this.active = !this.active;\\n\\t }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 181 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('a', {\\n\\t class: ['btn', _vm.type, {\\n\\t readonly: _vm.boolReadonly\\n\\t }],\\n\\t attrs: {\\n\\t \\\"href\\\": \\\"javascript:void(0)\\\",\\n\\t \\\"disabled\\\": _vm.boolDisabled\\n\\t },\\n\\t on: {\\n\\t \\\"click\\\": _vm.toggle\\n\\t }\\n\\t }, [_vm._c('span', {\\n\\t class: ['glyphicon', 'glyphicon-' + (_vm.value ? 'ok' : 'remove')]\\n\\t }), _vm._v(\\\" \\\"), _vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), (_vm.name) ? _vm._c('input', {\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"hidden\\\",\\n\\t \\\"name\\\": _vm.name\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm.active ? 1 : 0\\n\\t }\\n\\t }) : _vm._e()], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-f034a5f2\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 182 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(183)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(185)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(186)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Tooltip.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-48fb51b2\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-48fb51b2\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Tooltip.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 183 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\\r\\\\n\\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 185 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _popoverMixins = __webpack_require__(143);\\n\\t\\n\\tvar _popoverMixins2 = _interopRequireDefault(_popoverMixins);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = {\\n\\t mixins: [_popoverMixins2.default],\\n\\t props: {\\n\\t effect: { type: String, default: 'scale' },\\n\\t trigger: { type: String, default: 'hover' }\\n\\t }\\n\\t}; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\n/***/ },\\n/* 186 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('span', {\\n\\t ref: \\\"trigger\\\"\\n\\t }, [_vm._t(\\\"default\\\"), _vm._v(\\\" \\\"), _vm._c('transition', {\\n\\t attrs: {\\n\\t \\\"name\\\": _vm.effect\\n\\t }\\n\\t }, [(_vm.show) ? _vm._c('div', {\\n\\t ref: \\\"popover\\\",\\n\\t class: ['tooltip', _vm.placement]\\n\\t }, [_vm._c('div', {\\n\\t staticClass: \\\"tooltip-arrow\\\"\\n\\t }), _vm._v(\\\" \\\"), _vm._c('div', {\\n\\t staticClass: \\\"tooltip-inner\\\"\\n\\t }, [_vm._t(\\\"content\\\", [_vm._c('div', {\\n\\t domProps: {\\n\\t \\\"innerHTML\\\": _vm._s(_vm.content)\\n\\t }\\n\\t })])], 2)]) : _vm._e()])], 2)\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-48fb51b2\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ },\\n/* 187 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar __vue_exports__, __vue_options__\\n\\tvar __vue_styles__ = {}\\n\\t\\n\\t/* styles */\\n\\t__webpack_require__(188)\\n\\t\\n\\t/* script */\\n\\t__vue_exports__ = __webpack_require__(190)\\n\\t\\n\\t/* template */\\n\\tvar __vue_template__ = __webpack_require__(206)\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__ || {}\\n\\tif (\\n\\t typeof __vue_exports__.default === \\\"object\\\" ||\\n\\t typeof __vue_exports__.default === \\\"function\\\"\\n\\t) {\\n\\tif (Object.keys(__vue_exports__).some(function (key) { return key !== \\\"default\\\" && key !== \\\"__esModule\\\" })) {console.error(\\\"named exports are not supported in *.vue files.\\\")}\\n\\t__vue_options__ = __vue_exports__ = __vue_exports__.default\\n\\t}\\n\\tif (typeof __vue_options__ === \\\"function\\\") {\\n\\t __vue_options__ = __vue_options__.options\\n\\t}\\n\\t__vue_options__.__file = \\\"C:\\\\\\\\laragon\\\\\\\\www\\\\\\\\vue-strap\\\\\\\\src\\\\\\\\Typeahead.vue\\\"\\n\\t__vue_options__.render = __vue_template__.render\\n\\t__vue_options__.staticRenderFns = __vue_template__.staticRenderFns\\n\\t\\n\\t/* hot reload */\\n\\tif (false) {(function () {\\n\\t var hotAPI = require(\\\"vue-hot-reload-api\\\")\\n\\t hotAPI.install(require(\\\"vue\\\"), false)\\n\\t if (!hotAPI.compatible) return\\n\\t module.hot.accept()\\n\\t if (!module.hot.data) {\\n\\t hotAPI.createRecord(\\\"data-v-5b5f5e94\\\", __vue_options__)\\n\\t } else {\\n\\t hotAPI.reload(\\\"data-v-5b5f5e94\\\", __vue_options__)\\n\\t }\\n\\t})()}\\n\\tif (__vue_options__.functional) {console.error(\\\"[vue-loader] Typeahead.vue: functional components are not supported and should be defined in plain js files using render functions.\\\")}\\n\\t\\n\\tmodule.exports = __vue_exports__\\n\\n\\n/***/ },\\n/* 188 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// style-loader: Adds some css to the DOM by adding a \\\"],\\\"sourceRoot\\\":\\\"webpack://\\\"}]);\\n\\t\\n\\t// exports\\n\\n\\n/***/ },\\n/* 190 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t\\n\\tObject.defineProperty(exports, \\\"__esModule\\\", {\\n\\t value: true\\n\\t});\\n\\t\\n\\tvar _typeof2 = __webpack_require__(191);\\n\\t\\n\\tvar _typeof3 = _interopRequireDefault(_typeof2);\\n\\t\\n\\tvar _utils = __webpack_require__(65);\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\tvar DELAY = 300; //\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t//\\n\\t\\n\\texports.default = {\\n\\t props: {\\n\\t async: { type: String },\\n\\t data: { type: Array },\\n\\t delay: { type: Number, default: DELAY },\\n\\t asyncKey: { type: String, default: null },\\n\\t limit: { type: Number, default: 8 },\\n\\t matchCase: { type: Boolean, default: false },\\n\\t matchStart: { type: Boolean, default: false },\\n\\t onHit: {\\n\\t type: Function,\\n\\t default: function _default(item) {\\n\\t this.reset();\\n\\t this.value = item;\\n\\t }\\n\\t },\\n\\t placeholder: { type: String },\\n\\t template: { type: String },\\n\\t value: { type: String, default: '' }\\n\\t },\\n\\t data: function data() {\\n\\t return {\\n\\t showDropdown: false,\\n\\t noResults: true,\\n\\t current: 0,\\n\\t items: [],\\n\\t val: ''\\n\\t };\\n\\t },\\n\\t\\n\\t computed: {\\n\\t templateHtml: function templateHtml() {\\n\\t return typeof this.template === 'string' ? '' + this.template + '' : null;\\n\\t },\\n\\t tmpl: function tmpl() {\\n\\t return this._tmpl;\\n\\t }\\n\\t },\\n\\t watch: {\\n\\t val: function val(_val, old) {\\n\\t this.$emit('input', _val);\\n\\t if (_val !== old) this._update();\\n\\t },\\n\\t value: function value(val) {\\n\\t if (this.val !== val) {\\n\\t this.val = val;\\n\\t }\\n\\t }\\n\\t },\\n\\t methods: {\\n\\t setItems: function setItems(data) {\\n\\t var _this = this;\\n\\t\\n\\t if (this.async) {\\n\\t this.items = this.asyncKey ? data[this.asyncKey] : data;\\n\\t this.items = this.items.slice(0, this.limit);\\n\\t } else {\\n\\t this.items = (data || []).filter(function (value) {\\n\\t if ((typeof value === 'undefined' ? 'undefined' : (0, _typeof3.default)(value)) === 'object') {\\n\\t return true;\\n\\t }\\n\\t value = _this.matchCase ? value : value.toLowerCase();\\n\\t var query = _this.matchCase ? _this.val : _this.val.toLowerCase();\\n\\t return _this.matchStart ? value.indexOf(query) === 0 : value.indexOf(query) !== -1;\\n\\t }).slice(0, this.limit);\\n\\t }\\n\\t this.showDropdown = this.items.length > 0;\\n\\t },\\n\\t reset: function reset() {\\n\\t this.items = [];\\n\\t this.val = '';\\n\\t this.loading = false;\\n\\t this.showDropdown = false;\\n\\t },\\n\\t setActive: function setActive(index) {\\n\\t this.current = index;\\n\\t },\\n\\t isActive: function isActive(index) {\\n\\t return this.current === index;\\n\\t },\\n\\t hit: function hit(e) {\\n\\t e.preventDefault();\\n\\t this.onHit(this.items[this.current], this);\\n\\t },\\n\\t up: function up() {\\n\\t if (this.current > 0) this.current--;\\n\\t },\\n\\t down: function down() {\\n\\t if (this.current < this.items.length - 1) this.current++;\\n\\t }\\n\\t },\\n\\t created: function created() {\\n\\t this.val = this.value;\\n\\t this._tmpl = {\\n\\t template: this.templateHtml || '',\\n\\t props: {\\n\\t item: { default: null }\\n\\t }\\n\\t };\\n\\t this._update = (0, _utils.delayer)(function () {\\n\\t var _this2 = this;\\n\\t\\n\\t if (!this.val) {\\n\\t this.reset();\\n\\t return false;\\n\\t }\\n\\t if (this.async) {\\n\\t (0, _utils.getJSON)(this.async + this.val).then(function (data) {\\n\\t _this2.setItems(data);\\n\\t });\\n\\t } else if (this.data) {\\n\\t this.setItems(this.data);\\n\\t }\\n\\t }, 'delay', DELAY);\\n\\t this._update();\\n\\t }\\n\\t};\\n\\n/***/ },\\n/* 191 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t\\\"use strict\\\";\\n\\t\\n\\texports.__esModule = true;\\n\\t\\n\\tvar _iterator = __webpack_require__(20);\\n\\t\\n\\tvar _iterator2 = _interopRequireDefault(_iterator);\\n\\t\\n\\tvar _symbol = __webpack_require__(192);\\n\\t\\n\\tvar _symbol2 = _interopRequireDefault(_symbol);\\n\\t\\n\\tvar _typeof = typeof _symbol2.default === \\\"function\\\" && typeof _iterator2.default === \\\"symbol\\\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === \\\"function\\\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \\\"symbol\\\" : typeof obj; };\\n\\t\\n\\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\\n\\t\\n\\texports.default = typeof _symbol2.default === \\\"function\\\" && _typeof(_iterator2.default) === \\\"symbol\\\" ? function (obj) {\\n\\t return typeof obj === \\\"undefined\\\" ? \\\"undefined\\\" : _typeof(obj);\\n\\t} : function (obj) {\\n\\t return obj && typeof _symbol2.default === \\\"function\\\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \\\"symbol\\\" : typeof obj === \\\"undefined\\\" ? \\\"undefined\\\" : _typeof(obj);\\n\\t};\\n\\n/***/ },\\n/* 192 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports = { \\\"default\\\": __webpack_require__(193), __esModule: true };\\n\\n/***/ },\\n/* 193 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(194);\\n\\t__webpack_require__(203);\\n\\t__webpack_require__(204);\\n\\t__webpack_require__(205);\\n\\tmodule.exports = __webpack_require__(7).Symbol;\\n\\n/***/ },\\n/* 194 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t'use strict';\\n\\t// ECMAScript 6 symbols shim\\n\\tvar global = __webpack_require__(6)\\n\\t , has = __webpack_require__(29)\\n\\t , DESCRIPTORS = __webpack_require__(15)\\n\\t , $export = __webpack_require__(5)\\n\\t , redefine = __webpack_require__(28)\\n\\t , META = __webpack_require__(195).KEY\\n\\t , $fails = __webpack_require__(16)\\n\\t , shared = __webpack_require__(43)\\n\\t , setToStringTag = __webpack_require__(47)\\n\\t , uid = __webpack_require__(44)\\n\\t , wks = __webpack_require__(48)\\n\\t , wksExt = __webpack_require__(55)\\n\\t , wksDefine = __webpack_require__(196)\\n\\t , keyOf = __webpack_require__(197)\\n\\t , enumKeys = __webpack_require__(198)\\n\\t , isArray = __webpack_require__(201)\\n\\t , anObject = __webpack_require__(12)\\n\\t , toIObject = __webpack_require__(36)\\n\\t , toPrimitive = __webpack_require__(18)\\n\\t , createDesc = __webpack_require__(19)\\n\\t , _create = __webpack_require__(32)\\n\\t , gOPNExt = __webpack_require__(60)\\n\\t , $GOPD = __webpack_require__(202)\\n\\t , $DP = __webpack_require__(11)\\n\\t , $keys = __webpack_require__(34)\\n\\t , gOPD = $GOPD.f\\n\\t , dP = $DP.f\\n\\t , gOPN = gOPNExt.f\\n\\t , $Symbol = global.Symbol\\n\\t , $JSON = global.JSON\\n\\t , _stringify = $JSON && $JSON.stringify\\n\\t , PROTOTYPE = 'prototype'\\n\\t , HIDDEN = wks('_hidden')\\n\\t , TO_PRIMITIVE = wks('toPrimitive')\\n\\t , isEnum = {}.propertyIsEnumerable\\n\\t , SymbolRegistry = shared('symbol-registry')\\n\\t , AllSymbols = shared('symbols')\\n\\t , OPSymbols = shared('op-symbols')\\n\\t , ObjectProto = Object[PROTOTYPE]\\n\\t , USE_NATIVE = typeof $Symbol == 'function'\\n\\t , QObject = global.QObject;\\n\\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\\n\\tvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\\n\\t\\n\\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\\n\\tvar setSymbolDesc = DESCRIPTORS && $fails(function(){\\n\\t return _create(dP({}, 'a', {\\n\\t get: function(){ return dP(this, 'a', {value: 7}).a; }\\n\\t })).a != 7;\\n\\t}) ? function(it, key, D){\\n\\t var protoDesc = gOPD(ObjectProto, key);\\n\\t if(protoDesc)delete ObjectProto[key];\\n\\t dP(it, key, D);\\n\\t if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);\\n\\t} : dP;\\n\\t\\n\\tvar wrap = function(tag){\\n\\t var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\\n\\t sym._k = tag;\\n\\t return sym;\\n\\t};\\n\\t\\n\\tvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){\\n\\t return typeof it == 'symbol';\\n\\t} : function(it){\\n\\t return it instanceof $Symbol;\\n\\t};\\n\\t\\n\\tvar $defineProperty = function defineProperty(it, key, D){\\n\\t if(it === ObjectProto)$defineProperty(OPSymbols, key, D);\\n\\t anObject(it);\\n\\t key = toPrimitive(key, true);\\n\\t anObject(D);\\n\\t if(has(AllSymbols, key)){\\n\\t if(!D.enumerable){\\n\\t if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));\\n\\t it[HIDDEN][key] = true;\\n\\t } else {\\n\\t if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;\\n\\t D = _create(D, {enumerable: createDesc(0, false)});\\n\\t } return setSymbolDesc(it, key, D);\\n\\t } return dP(it, key, D);\\n\\t};\\n\\tvar $defineProperties = function defineProperties(it, P){\\n\\t anObject(it);\\n\\t var keys = enumKeys(P = toIObject(P))\\n\\t , i = 0\\n\\t , l = keys.length\\n\\t , key;\\n\\t while(l > i)$defineProperty(it, key = keys[i++], P[key]);\\n\\t return it;\\n\\t};\\n\\tvar $create = function create(it, P){\\n\\t return P === undefined ? _create(it) : $defineProperties(_create(it), P);\\n\\t};\\n\\tvar $propertyIsEnumerable = function propertyIsEnumerable(key){\\n\\t var E = isEnum.call(this, key = toPrimitive(key, true));\\n\\t if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;\\n\\t return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\\n\\t};\\n\\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){\\n\\t it = toIObject(it);\\n\\t key = toPrimitive(key, true);\\n\\t if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;\\n\\t var D = gOPD(it, key);\\n\\t if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;\\n\\t return D;\\n\\t};\\n\\tvar $getOwnPropertyNames = function getOwnPropertyNames(it){\\n\\t var names = gOPN(toIObject(it))\\n\\t , result = []\\n\\t , i = 0\\n\\t , key;\\n\\t while(names.length > i){\\n\\t if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);\\n\\t } return result;\\n\\t};\\n\\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(it){\\n\\t var IS_OP = it === ObjectProto\\n\\t , names = gOPN(IS_OP ? OPSymbols : toIObject(it))\\n\\t , result = []\\n\\t , i = 0\\n\\t , key;\\n\\t while(names.length > i){\\n\\t if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);\\n\\t } return result;\\n\\t};\\n\\t\\n\\t// 19.4.1.1 Symbol([description])\\n\\tif(!USE_NATIVE){\\n\\t $Symbol = function Symbol(){\\n\\t if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');\\n\\t var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\\n\\t var $set = function(value){\\n\\t if(this === ObjectProto)$set.call(OPSymbols, value);\\n\\t if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;\\n\\t setSymbolDesc(this, tag, createDesc(1, value));\\n\\t };\\n\\t if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});\\n\\t return wrap(tag);\\n\\t };\\n\\t redefine($Symbol[PROTOTYPE], 'toString', function toString(){\\n\\t return this._k;\\n\\t });\\n\\t\\n\\t $GOPD.f = $getOwnPropertyDescriptor;\\n\\t $DP.f = $defineProperty;\\n\\t __webpack_require__(61).f = gOPNExt.f = $getOwnPropertyNames;\\n\\t __webpack_require__(200).f = $propertyIsEnumerable;\\n\\t __webpack_require__(199).f = $getOwnPropertySymbols;\\n\\t\\n\\t if(DESCRIPTORS && !__webpack_require__(27)){\\n\\t redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\\n\\t }\\n\\t\\n\\t wksExt.f = function(name){\\n\\t return wrap(wks(name));\\n\\t }\\n\\t}\\n\\t\\n\\t$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});\\n\\t\\n\\tfor(var symbols = (\\n\\t // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\\n\\t 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\\n\\t).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);\\n\\t\\n\\tfor(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);\\n\\t\\n\\t$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\\n\\t // 19.4.2.1 Symbol.for(key)\\n\\t 'for': function(key){\\n\\t return has(SymbolRegistry, key += '')\\n\\t ? SymbolRegistry[key]\\n\\t : SymbolRegistry[key] = $Symbol(key);\\n\\t },\\n\\t // 19.4.2.5 Symbol.keyFor(sym)\\n\\t keyFor: function keyFor(key){\\n\\t if(isSymbol(key))return keyOf(SymbolRegistry, key);\\n\\t throw TypeError(key + ' is not a symbol!');\\n\\t },\\n\\t useSetter: function(){ setter = true; },\\n\\t useSimple: function(){ setter = false; }\\n\\t});\\n\\t\\n\\t$export($export.S + $export.F * !USE_NATIVE, 'Object', {\\n\\t // 19.1.2.2 Object.create(O [, Properties])\\n\\t create: $create,\\n\\t // 19.1.2.4 Object.defineProperty(O, P, Attributes)\\n\\t defineProperty: $defineProperty,\\n\\t // 19.1.2.3 Object.defineProperties(O, Properties)\\n\\t defineProperties: $defineProperties,\\n\\t // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\\n\\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\\n\\t // 19.1.2.7 Object.getOwnPropertyNames(O)\\n\\t getOwnPropertyNames: $getOwnPropertyNames,\\n\\t // 19.1.2.8 Object.getOwnPropertySymbols(O)\\n\\t getOwnPropertySymbols: $getOwnPropertySymbols\\n\\t});\\n\\t\\n\\t// 24.3.2 JSON.stringify(value [, replacer [, space]])\\n\\t$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){\\n\\t var S = $Symbol();\\n\\t // MS Edge converts symbol values to JSON as {}\\n\\t // WebKit converts symbol values to JSON as null\\n\\t // V8 throws on boxed symbols\\n\\t return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';\\n\\t})), 'JSON', {\\n\\t stringify: function stringify(it){\\n\\t if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined\\n\\t var args = [it]\\n\\t , i = 1\\n\\t , replacer, $replacer;\\n\\t while(arguments.length > i)args.push(arguments[i++]);\\n\\t replacer = args[1];\\n\\t if(typeof replacer == 'function')$replacer = replacer;\\n\\t if($replacer || !isArray(replacer))replacer = function(key, value){\\n\\t if($replacer)value = $replacer.call(this, key, value);\\n\\t if(!isSymbol(value))return value;\\n\\t };\\n\\t args[1] = replacer;\\n\\t return _stringify.apply($JSON, args);\\n\\t }\\n\\t});\\n\\t\\n\\t// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\\n\\t$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(10)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\\n\\t// 19.4.3.5 Symbol.prototype[@@toStringTag]\\n\\tsetToStringTag($Symbol, 'Symbol');\\n\\t// 20.2.1.9 Math[@@toStringTag]\\n\\tsetToStringTag(Math, 'Math', true);\\n\\t// 24.3.3 JSON[@@toStringTag]\\n\\tsetToStringTag(global.JSON, 'JSON', true);\\n\\n/***/ },\\n/* 195 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar META = __webpack_require__(44)('meta')\\n\\t , isObject = __webpack_require__(13)\\n\\t , has = __webpack_require__(29)\\n\\t , setDesc = __webpack_require__(11).f\\n\\t , id = 0;\\n\\tvar isExtensible = Object.isExtensible || function(){\\n\\t return true;\\n\\t};\\n\\tvar FREEZE = !__webpack_require__(16)(function(){\\n\\t return isExtensible(Object.preventExtensions({}));\\n\\t});\\n\\tvar setMeta = function(it){\\n\\t setDesc(it, META, {value: {\\n\\t i: 'O' + ++id, // object ID\\n\\t w: {} // weak collections IDs\\n\\t }});\\n\\t};\\n\\tvar fastKey = function(it, create){\\n\\t // return primitive with prefix\\n\\t if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\\n\\t if(!has(it, META)){\\n\\t // can't set metadata to uncaught frozen object\\n\\t if(!isExtensible(it))return 'F';\\n\\t // not necessary to add metadata\\n\\t if(!create)return 'E';\\n\\t // add missing metadata\\n\\t setMeta(it);\\n\\t // return object ID\\n\\t } return it[META].i;\\n\\t};\\n\\tvar getWeak = function(it, create){\\n\\t if(!has(it, META)){\\n\\t // can't set metadata to uncaught frozen object\\n\\t if(!isExtensible(it))return true;\\n\\t // not necessary to add metadata\\n\\t if(!create)return false;\\n\\t // add missing metadata\\n\\t setMeta(it);\\n\\t // return hash weak collections IDs\\n\\t } return it[META].w;\\n\\t};\\n\\t// add metadata on freeze-family methods calling\\n\\tvar onFreeze = function(it){\\n\\t if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it);\\n\\t return it;\\n\\t};\\n\\tvar meta = module.exports = {\\n\\t KEY: META,\\n\\t NEED: false,\\n\\t fastKey: fastKey,\\n\\t getWeak: getWeak,\\n\\t onFreeze: onFreeze\\n\\t};\\n\\n/***/ },\\n/* 196 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar global = __webpack_require__(6)\\n\\t , core = __webpack_require__(7)\\n\\t , LIBRARY = __webpack_require__(27)\\n\\t , wksExt = __webpack_require__(55)\\n\\t , defineProperty = __webpack_require__(11).f;\\n\\tmodule.exports = function(name){\\n\\t var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\\n\\t if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});\\n\\t};\\n\\n/***/ },\\n/* 197 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar getKeys = __webpack_require__(34)\\n\\t , toIObject = __webpack_require__(36);\\n\\tmodule.exports = function(object, el){\\n\\t var O = toIObject(object)\\n\\t , keys = getKeys(O)\\n\\t , length = keys.length\\n\\t , index = 0\\n\\t , key;\\n\\t while(length > index)if(O[key = keys[index++]] === el)return key;\\n\\t};\\n\\n/***/ },\\n/* 198 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// all enumerable object keys, includes symbols\\n\\tvar getKeys = __webpack_require__(34)\\n\\t , gOPS = __webpack_require__(199)\\n\\t , pIE = __webpack_require__(200);\\n\\tmodule.exports = function(it){\\n\\t var result = getKeys(it)\\n\\t , getSymbols = gOPS.f;\\n\\t if(getSymbols){\\n\\t var symbols = getSymbols(it)\\n\\t , isEnum = pIE.f\\n\\t , i = 0\\n\\t , key;\\n\\t while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);\\n\\t } return result;\\n\\t};\\n\\n/***/ },\\n/* 199 */\\n/***/ function(module, exports) {\\n\\n\\texports.f = Object.getOwnPropertySymbols;\\n\\n/***/ },\\n/* 200 */\\n/***/ function(module, exports) {\\n\\n\\texports.f = {}.propertyIsEnumerable;\\n\\n/***/ },\\n/* 201 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t// 7.2.2 IsArray(argument)\\n\\tvar cof = __webpack_require__(38);\\n\\tmodule.exports = Array.isArray || function isArray(arg){\\n\\t return cof(arg) == 'Array';\\n\\t};\\n\\n/***/ },\\n/* 202 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tvar pIE = __webpack_require__(200)\\n\\t , createDesc = __webpack_require__(19)\\n\\t , toIObject = __webpack_require__(36)\\n\\t , toPrimitive = __webpack_require__(18)\\n\\t , has = __webpack_require__(29)\\n\\t , IE8_DOM_DEFINE = __webpack_require__(14)\\n\\t , gOPD = Object.getOwnPropertyDescriptor;\\n\\t\\n\\texports.f = __webpack_require__(15) ? gOPD : function getOwnPropertyDescriptor(O, P){\\n\\t O = toIObject(O);\\n\\t P = toPrimitive(P, true);\\n\\t if(IE8_DOM_DEFINE)try {\\n\\t return gOPD(O, P);\\n\\t } catch(e){ /* empty */ }\\n\\t if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);\\n\\t};\\n\\n/***/ },\\n/* 203 */\\n/***/ function(module, exports) {\\n\\n\\n\\n/***/ },\\n/* 204 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(196)('asyncIterator');\\n\\n/***/ },\\n/* 205 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\t__webpack_require__(196)('observable');\\n\\n/***/ },\\n/* 206 */\\n/***/ function(module, exports, __webpack_require__) {\\n\\n\\tmodule.exports={render:function (){var _vm=this;var _h=_vm.$createElement;\\n\\t return _vm._c('div', {\\n\\t class: {\\n\\t 'open': _vm.showDropdown\\n\\t },\\n\\t staticStyle: {\\n\\t \\\"position\\\": \\\"relative\\\"\\n\\t }\\n\\t }, [_vm._c('input', {\\n\\t directives: [{\\n\\t name: \\\"model\\\",\\n\\t rawName: \\\"v-model\\\",\\n\\t value: (_vm.val),\\n\\t expression: \\\"val\\\"\\n\\t }],\\n\\t staticClass: \\\"form-control\\\",\\n\\t attrs: {\\n\\t \\\"type\\\": \\\"text\\\",\\n\\t \\\"autocomplete\\\": \\\"off\\\",\\n\\t \\\"placeholder\\\": _vm.placeholder\\n\\t },\\n\\t domProps: {\\n\\t \\\"value\\\": _vm._s(_vm.val)\\n\\t },\\n\\t on: {\\n\\t \\\"blur\\\": function($event) {\\n\\t _vm.showDropdown = false\\n\\t },\\n\\t \\\"keydown\\\": [function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"down\\\", 40)) { return; }\\n\\t _vm.down($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"enter\\\", 13)) { return; }\\n\\t _vm.hit($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"esc\\\", 27)) { return; }\\n\\t _vm.reset($event)\\n\\t }, function($event) {\\n\\t if (_vm._k($event.keyCode, \\\"up\\\", 38)) { return; }\\n\\t _vm.up($event)\\n\\t }],\\n\\t \\\"input\\\": function($event) {\\n\\t if ($event.target.composing) { return; }\\n\\t _vm.val = $event.target.value\\n\\t }\\n\\t }\\n\\t }), _vm._v(\\\" \\\"), _vm._c('ul', {\\n\\t ref: \\\"dropdown\\\",\\n\\t staticClass: \\\"dropdown-menu\\\"\\n\\t }, _vm._l((_vm.items), function(item, i) {\\n\\t return _vm._c('li', {\\n\\t class: {\\n\\t 'active': _vm.isActive(i)\\n\\t }\\n\\t }, [_vm._c('a', {\\n\\t on: {\\n\\t \\\"mousedown\\\": function($event) {\\n\\t $event.preventDefault();\\n\\t _vm.hit($event)\\n\\t },\\n\\t \\\"mousemove\\\": function($event) {\\n\\t _vm.setActive(i)\\n\\t }\\n\\t }\\n\\t }, [_vm._c(_vm.tmpl, {\\n\\t tag: \\\"component\\\",\\n\\t attrs: {\\n\\t \\\"item\\\": item\\n\\t }\\n\\t })], 1)])\\n\\t }))])\\n\\t},staticRenderFns: []}\\n\\tif (false) {\\n\\t module.hot.accept()\\n\\t if (module.hot.data) {\\n\\t require(\\\"vue-hot-reload-api\\\").rerender(\\\"data-v-5b5f5e94\\\", module.exports)\\n\\t }\\n\\t}\\n\\n/***/ }\\n/******/ ])\\n});\\n;\\n//# sourceMappingURL=vue-strap.js.map//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L3Z1ZS1zdHJhcC9kaXN0L3Z1ZS1zdHJhcC5qcz9lMTQ3Il0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlZ1ZVN0cmFwXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlZ1ZVN0cmFwXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge30sXG4vKioqKioqLyBcdFx0XHRpZDogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KTtcblx0XG5cdHZhciBfQ2xpY2tPdXRzaWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsaWNrT3V0c2lkZSk7XG5cdFxuXHR2YXIgX1Njcm9sbCA9IF9fd2VicGFja19yZXF1aXJlX18oNjgpO1xuXHRcblx0dmFyIF9TY3JvbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2Nyb2xsKTtcblx0XG5cdHZhciBfQWNjb3JkaW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OSk7XG5cdFxuXHR2YXIgX0FjY29yZGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BY2NvcmRpb24pO1xuXHRcblx0dmFyIF9BZmZpeCA9IF9fd2VicGFja19yZXF1aXJlX18oNzIpO1xuXHRcblx0dmFyIF9BZmZpeDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BZmZpeCk7XG5cdFxuXHR2YXIgX0FsZXJ0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3NSk7XG5cdFxuXHR2YXIgX0FsZXJ0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FsZXJ0KTtcblx0XG5cdHZhciBfQXNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgyKTtcblx0XG5cdHZhciBfQXNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQXNpZGUpO1xuXHRcblx0dmFyIF9CdXR0b25Hcm91cCA9IF9fd2VicGFja19yZXF1aXJlX18oODcpO1xuXHRcblx0dmFyIF9CdXR0b25Hcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CdXR0b25Hcm91cCk7XG5cdFxuXHR2YXIgX0Nhcm91c2VsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5MCk7XG5cdFxuXHR2YXIgX0Nhcm91c2VsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Nhcm91c2VsKTtcblx0XG5cdHZhciBfQ2hlY2tib3ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk1KTtcblx0XG5cdHZhciBfQ2hlY2tib3gyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2hlY2tib3gpO1xuXHRcblx0dmFyIF9EYXRlcGlja2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDApO1xuXHRcblx0dmFyIF9EYXRlcGlja2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0RhdGVwaWNrZXIpO1xuXHRcblx0dmFyIF9Ecm9wZG93biA9IF9fd2VicGFja19yZXF1aXJlX18oMTA1KTtcblx0XG5cdHZhciBfRHJvcGRvd24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRHJvcGRvd24pO1xuXHRcblx0dmFyIF9Gb3JtR3JvdXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwOCk7XG5cdFxuXHR2YXIgX0Zvcm1Hcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Gb3JtR3JvdXApO1xuXHRcblx0dmFyIF9Gb3JtVmFsaWRhdG9yID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMTEpO1xuXHRcblx0dmFyIF9Gb3JtVmFsaWRhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Zvcm1WYWxpZGF0b3IpO1xuXHRcblx0dmFyIF9JbnB1dCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE0KTtcblx0XG5cdHZhciBfSW5wdXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfSW5wdXQpO1xuXHRcblx0dmFyIF9Nb2RhbCA9IF9fd2VicGFja19yZXF1aXJlX18oMTE5KTtcblx0XG5cdHZhciBfTW9kYWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTW9kYWwpO1xuXHRcblx0dmFyIF9OYXZiYXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyOCk7XG5cdFxuXHR2YXIgX05hdmJhcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9OYXZiYXIpO1xuXHRcblx0dmFyIF9PcHRpb24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMSk7XG5cdFxuXHR2YXIgX09wdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9PcHRpb24pO1xuXHRcblx0dmFyIF9QYW5lbCA9IF9fd2VicGFja19yZXF1aXJlX18oMTM0KTtcblx0XG5cdHZhciBfUGFuZWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFuZWwpO1xuXHRcblx0dmFyIF9Qb3BvdmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzkpO1xuXHRcblx0dmFyIF9Qb3BvdmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BvcG92ZXIpO1xuXHRcblx0dmFyIF9Qcm9ncmVzc2JhciA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ1KTtcblx0XG5cdHZhciBfUHJvZ3Jlc3NiYXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUHJvZ3Jlc3NiYXIpO1xuXHRcblx0dmFyIF9SYWRpbyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ4KTtcblx0XG5cdHZhciBfUmFkaW8yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUmFkaW8pO1xuXHRcblx0dmFyIF9TZWxlY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1Myk7XG5cdFxuXHR2YXIgX1NlbGVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TZWxlY3QpO1xuXHRcblx0dmFyIF9TbGlkZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1OCk7XG5cdFxuXHR2YXIgX1NsaWRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TbGlkZXIpO1xuXHRcblx0dmFyIF9TcGlubmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjEpO1xuXHRcblx0dmFyIF9TcGlubmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NwaW5uZXIpO1xuXHRcblx0dmFyIF9UYWIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2Nik7XG5cdFxuXHR2YXIgX1RhYjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWIpO1xuXHRcblx0dmFyIF9UYWJHcm91cCA9IF9fd2VicGFja19yZXF1aXJlX18oMTY5KTtcblx0XG5cdHZhciBfVGFiR3JvdXAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFiR3JvdXApO1xuXHRcblx0dmFyIF9UYWJzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzQpO1xuXHRcblx0dmFyIF9UYWJzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYnMpO1xuXHRcblx0dmFyIF9Ub2dnbGVCdXR0b24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3OSk7XG5cdFxuXHR2YXIgX1RvZ2dsZUJ1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ub2dnbGVCdXR0b24pO1xuXHRcblx0dmFyIF9Ub29sdGlwID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODIpO1xuXHRcblx0dmFyIF9Ub29sdGlwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Rvb2x0aXApO1xuXHRcblx0dmFyIF9UeXBlYWhlYWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4Nyk7XG5cdFxuXHR2YXIgX1R5cGVhaGVhZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UeXBlYWhlYWQpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdC8vIENvbXBvbmVudHNcblx0XG5cdC8vIERpcmVjdGl2ZXNcblx0Ly8gVXRpbHNcblx0dmFyIFZ1ZVN0cmFwID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIENsaWNrT3V0c2lkZTogX0NsaWNrT3V0c2lkZTIuZGVmYXVsdCxcblx0ICAgIFNjcm9sbDogX1Njcm9sbDIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgdXRpbHM6IHtcblx0ICAgICQ6IF9Ob2RlTGlzdDIuZGVmYXVsdCxcblx0ICAgIGNvZXJjZTogX3V0aWxzLmNvZXJjZVxuXHQgIH0sXG5cdCAgLy9jb21wb25lbnRzXG5cdCAgYWNjb3JkaW9uOiBfQWNjb3JkaW9uMi5kZWZhdWx0LFxuXHQgIGFmZml4OiBfQWZmaXgyLmRlZmF1bHQsXG5cdCAgYWxlcnQ6IF9BbGVydDIuZGVmYXVsdCxcblx0ICBhc2lkZTogX0FzaWRlMi5kZWZhdWx0LFxuXHQgIGJ1dHRvbkdyb3VwOiBfQnV0dG9uR3JvdXAyLmRlZmF1bHQsXG5cdCAgY2Fyb3VzZWw6IF9DYXJvdXNlbDIuZGVmYXVsdCxcblx0ICBjaGVja2JveDogX0NoZWNrYm94Mi5kZWZhdWx0LFxuXHQgIGRhdGVwaWNrZXI6IF9EYXRlcGlja2VyMi5kZWZhdWx0LFxuXHQgIGRyb3Bkb3duOiBfRHJvcGRvd24yLmRlZmF1bHQsXG5cdCAgZm9ybUdyb3VwOiBfRm9ybUdyb3VwMi5kZWZhdWx0LFxuXHQgIGZvcm1WYWxpZGF0b3I6IF9Gb3JtVmFsaWRhdG9yMi5kZWZhdWx0LFxuXHQgIGlucHV0OiBfSW5wdXQyLmRlZmF1bHQsXG5cdCAgbW9kYWw6IF9Nb2RhbDIuZGVmYXVsdCxcblx0ICBuYXZiYXI6IF9OYXZiYXIyLmRlZmF1bHQsXG5cdCAgb3B0aW9uOiBfT3B0aW9uMi5kZWZhdWx0LFxuXHQgIHBhbmVsOiBfUGFuZWwyLmRlZmF1bHQsXG5cdCAgcG9wb3ZlcjogX1BvcG92ZXIyLmRlZmF1bHQsXG5cdCAgcHJvZ3Jlc3NiYXI6IF9Qcm9ncmVzc2JhcjIuZGVmYXVsdCxcblx0ICByYWRpbzogX1JhZGlvMi5kZWZhdWx0LFxuXHQgIHNlbGVjdDogX1NlbGVjdDIuZGVmYXVsdCxcblx0ICBzbGlkZXI6IF9TbGlkZXIyLmRlZmF1bHQsXG5cdCAgc3Bpbm5lcjogX1NwaW5uZXIyLmRlZmF1bHQsXG5cdCAgdGFiOiBfVGFiMi5kZWZhdWx0LFxuXHQgIHRhYkdyb3VwOiBfVGFiR3JvdXAyLmRlZmF1bHQsXG5cdCAgdGFiczogX1RhYnMyLmRlZmF1bHQsXG5cdCAgdG9nZ2xlQnV0dG9uOiBfVG9nZ2xlQnV0dG9uMi5kZWZhdWx0LFxuXHQgIHRvb2x0aXA6IF9Ub29sdGlwMi5kZWZhdWx0LFxuXHQgIHR5cGVhaGVhZDogX1R5cGVhaGVhZDIuZGVmYXVsdFxuXHR9O1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBWdWVTdHJhcDtcblxuLyoqKi8gfSxcbi8qIDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9kZWZpbmVQcm9wZXJ0eSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdFxuXHR2YXIgX2RlZmluZVByb3BlcnR5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZmluZVByb3BlcnR5KTtcblx0XG5cdHZhciBfaXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcblx0XG5cdHZhciBfaXRlcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXRlcmF0b3IpO1xuXHRcblx0dmFyIF9nZXRPd25Qcm9wZXJ0eU5hbWVzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1Nik7XG5cdFxuXHR2YXIgX2dldE93blByb3BlcnR5TmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0T3duUHJvcGVydHlOYW1lcyk7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrMiA9IF9fd2VicGFja19yZXF1aXJlX18oNjIpO1xuXHRcblx0dmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzczIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYzKTtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2xhc3MyKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDY0KTtcblx0XG5cdHZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXHR2YXIgbm9kZUVycm9yID0gbmV3IEVycm9yKCdQYXNzZWQgYXJndW1lbnRzIG11c3QgYmUgb2YgTm9kZScpO1xuXHR2YXIgYmx1ckV2ZW50O1xuXHR2YXIgYmx1ckxpc3QgPSBbXTtcblx0dmFyIEV2ZW50cyA9IFtdO1xuXHRcblx0ZnVuY3Rpb24gaXNOb2RlKHZhbCkge1xuXHQgIHJldHVybiB2YWwgaW5zdGFuY2VvZiB3aW5kb3cuTm9kZTtcblx0fVxuXHRmdW5jdGlvbiBpc05vZGVMaXN0KHZhbCkge1xuXHQgIHJldHVybiB2YWwgaW5zdGFuY2VvZiB3aW5kb3cuTm9kZUxpc3QgfHwgdmFsIGluc3RhbmNlb2YgTm9kZUxpc3QgfHwgdmFsIGluc3RhbmNlb2Ygd2luZG93LkhUTUxDb2xsZWN0aW9uIHx8IHZhbCBpbnN0YW5jZW9mIEFycmF5O1xuXHR9XG5cdFxuXHR2YXIgTm9kZUxpc3QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgZnVuY3Rpb24gTm9kZUxpc3QoYXJncykge1xuXHQgICAgKDAsIF9jbGFzc0NhbGxDaGVjazMuZGVmYXVsdCkodGhpcywgTm9kZUxpc3QpO1xuXHRcblx0ICAgIHZhciBub2RlcyA9IGFyZ3M7XG5cdCAgICBpZiAoYXJnc1swXSA9PT0gd2luZG93KSB7XG5cdCAgICAgIG5vZGVzID0gW3dpbmRvd107XG5cdCAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuXHQgICAgICBub2RlcyA9IChhcmdzWzFdIHx8IGRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsKGFyZ3NbMF0pO1xuXHQgICAgICBpZiAoYXJnc1sxXSkge1xuXHQgICAgICAgIHRoaXMub3duZXIgPSBhcmdzWzFdO1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2UgaWYgKDAgaW4gYXJncyAmJiAhaXNOb2RlKGFyZ3NbMF0pICYmIGFyZ3NbMF0gJiYgJ2xlbmd0aCcgaW4gYXJnc1swXSkge1xuXHQgICAgICBub2RlcyA9IGFyZ3NbMF07XG5cdCAgICAgIGlmIChhcmdzWzFdKSB7XG5cdCAgICAgICAgdGhpcy5vd25lciA9IGFyZ3NbMV07XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIGlmIChub2Rlcykge1xuXHQgICAgICBmb3IgKHZhciBpIGluIG5vZGVzKSB7XG5cdCAgICAgICAgdGhpc1tpXSA9IG5vZGVzW2ldO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMubGVuZ3RoID0gbm9kZXMubGVuZ3RoO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5sZW5ndGggPSAwO1xuXHQgICAgfVxuXHQgICAgd2luZG93LnBydWViYSA9IHRoaXM7XG5cdCAgfVxuXHRcblx0ICAoMCwgX2NyZWF0ZUNsYXNzMy5kZWZhdWx0KShOb2RlTGlzdCwgW3tcblx0ICAgIGtleTogJ2NvbmNhdCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gY29uY2F0KCkge1xuXHQgICAgICB2YXIgbm9kZXMgPSBBcnJheVByb3RvLnNsaWNlLmNhbGwodGhpcyk7XG5cdCAgICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYXJyKSB7XG5cdCAgICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJyLCBmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChpc05vZGUoZWwpKSB7XG5cdCAgICAgICAgICAgIGlmICghfm5vZGVzLmluZGV4T2YoZWwpKSBub2Rlcy5wdXNoKGVsKTtcblx0ICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlTGlzdChlbCkpIHtcblx0ICAgICAgICAgICAgZmxhdHRlbihlbCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmNhbGwoYXJncywgZnVuY3Rpb24gKGFyZykge1xuXHQgICAgICAgIGlmIChpc05vZGUoYXJnKSkge1xuXHQgICAgICAgICAgaWYgKCF+bm9kZXMuaW5kZXhPZihhcmcpKSBub2Rlcy5wdXNoKGFyZyk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KGFyZykpIHtcblx0ICAgICAgICAgIGZsYXR0ZW4oYXJnKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhyb3cgRXJyb3IoJ0NvbmNhdCBhcmd1bWVudHMgbXVzdCBiZSBvZiBhIE5vZGUsIE5vZGVMaXN0LCBIVE1MQ29sbGVjdGlvbiwgb3IgQXJyYXkgb2YgKE5vZGUsIE5vZGVMaXN0LCBIVE1MQ29sbGVjdGlvbiwgQXJyYXkpJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIE5vZGVMaXN0SlMobm9kZXMsIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2RlbGV0ZScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZSgpIHtcblx0ICAgICAgdmFyIG5vdFJlbW92ZWQgPSBmbGF0dGVuKHRoaXMpLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBpZiAoZWwucmVtb3ZlKSB7XG5cdCAgICAgICAgICBlbC5yZW1vdmUoKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGVsLnBhcmVudE5vZGUpIHtcblx0ICAgICAgICAgIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5jb250YWlucyhlbCk7XG5cdCAgICAgIH0pO1xuXHQgICAgICBpZiAobm90UmVtb3ZlZC5sZW5ndGgpIGNvbnNvbGUud2FybignTm9kZUxpc3Q6IFNvbWUgbm9kZXMgY291bGQgbm90IGJlIGRlbGV0ZWQuJyk7XG5cdCAgICAgIHJldHVybiBub3RSZW1vdmVkO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2VhY2gnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGVhY2goKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guYXBwbHkodGhpcywgYXJncyk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZpbHRlcicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZmlsdGVyKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIE5vZGVMaXN0SlMoQXJyYXlQcm90by5maWx0ZXIuYXBwbHkodGhpcywgYXJncyksIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2ZpbmQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmQoZWxlbWVudCkge1xuXHQgICAgICB2YXIgbm9kZXMgPSBbXTtcblx0ICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykgZmxhdHRlbih0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgbm9kZXMucHVzaChub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudCkpO1xuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKGlzTm9kZShlbGVtZW50KSkgZmxhdHRlbih0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgaWYgKG5vZGUgIT09IGVsZW1lbnQgJiYgbm9kZS5jb250YWlucyhlbGVtZW50KSkgbm9kZXMucHVzaChlbGVtZW50KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmIChpc05vZGVMaXN0KGVsZW1lbnQpKSB7XG5cdCAgICAgICAgdmFyIGVscyA9IGZsYXR0ZW4oZWxlbWVudCk7XG5cdCAgICAgICAgZmxhdHRlbih0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgICBlbHMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgICAgaWYgKG5vZGUgIT09IGVsICYmIG5vZGUuY29udGFpbnMoZWwpKSBub2Rlcy5wdXNoKGVsKTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiBmbGF0dGVuKG5vZGVzLCB0aGlzLm93bmVyKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdmb3JFYWNoJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JFYWNoKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNCksIF9rZXk0ID0gMDsgX2tleTQgPCBfbGVuNDsgX2tleTQrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTRdID0gYXJndW1lbnRzW19rZXk0XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgQXJyYXlQcm90by5mb3JFYWNoLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdpbmNsdWRlcycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gaW5jbHVkZXMoZWxlbWVudCwgaW5kZXgpIHtcblx0ICAgICAgcmV0dXJuIH50aGlzLmluZGV4T2YoZWxlbWVudCwgaW5kZXgpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ21hcCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gbWFwKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuNSA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNSksIF9rZXk1ID0gMDsgX2tleTUgPCBfbGVuNTsgX2tleTUrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTVdID0gYXJndW1lbnRzW19rZXk1XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIG1hcHBlZCA9IEFycmF5UHJvdG8ubWFwLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHQgICAgICByZXR1cm4gbWFwcGVkLnNvbWUoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgcmV0dXJuIGlzTm9kZShlbCkgfHwgaXNOb2RlTGlzdChlbCk7XG5cdCAgICAgIH0pID8gZmxhdHRlbihtYXBwZWQsIHRoaXMpIDogbWFwcGVkO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3BhcmVudCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcGFyZW50KCkge1xuXHQgICAgICByZXR1cm4gZmxhdHRlbih0aGlzLm1hcChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwucGFyZW50Tm9kZTtcblx0ICAgICAgfSksIHRoaXMpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3BvcCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcG9wKGFtb3VudCkge1xuXHQgICAgICBpZiAodHlwZW9mIGFtb3VudCAhPT0gJ251bWJlcicpIHtcblx0ICAgICAgICBhbW91bnQgPSAxO1xuXHQgICAgICB9XG5cdCAgICAgIHZhciBub2RlcyA9IFtdO1xuXHQgICAgICB2YXIgcG9wID0gQXJyYXlQcm90by5wb3AuYmluZCh0aGlzKTtcblx0ICAgICAgd2hpbGUgKGFtb3VudC0tKSB7XG5cdCAgICAgICAgbm9kZXMucHVzaChwb3AoKSk7XG5cdCAgICAgIH1yZXR1cm4gTm9kZUxpc3RKUyhub2RlcywgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncHVzaCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gcHVzaCgpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIGZvciAodmFyIF9sZW42ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW42KSwgX2tleTYgPSAwOyBfa2V5NiA8IF9sZW42OyBfa2V5NisrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5Nl0gPSBhcmd1bWVudHNbX2tleTZdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBBcnJheVByb3RvLmZvckVhY2guY2FsbChhcmdzLCBmdW5jdGlvbiAoYXJnKSB7XG5cdCAgICAgICAgaWYgKCFpc05vZGUoYXJnKSkgdGhyb3cgbm9kZUVycm9yO1xuXHQgICAgICAgIGlmICghfl90aGlzLmluZGV4T2YoYXJnKSkgQXJyYXlQcm90by5wdXNoLmNhbGwoX3RoaXMsIGFyZyk7XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdzaGlmdCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gc2hpZnQoYW1vdW50KSB7XG5cdCAgICAgIGlmICh0eXBlb2YgYW1vdW50ICE9PSAnbnVtYmVyJykge1xuXHQgICAgICAgIGFtb3VudCA9IDE7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIG5vZGVzID0gW107XG5cdCAgICAgIHdoaWxlIChhbW91bnQtLSkge1xuXHQgICAgICAgIG5vZGVzLnB1c2goQXJyYXlQcm90by5zaGlmdC5jYWxsKHRoaXMpKTtcblx0ICAgICAgfXJldHVybiBub2Rlcy5sZW5ndGggPT0gMSA/IG5vZGVzWzBdIDogTm9kZUxpc3RKUyhub2RlcywgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnc2xpY2UnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWNlKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuNyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuNyksIF9rZXk3ID0gMDsgX2tleTcgPCBfbGVuNzsgX2tleTcrKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTddID0gYXJndW1lbnRzW19rZXk3XTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgcmV0dXJuIE5vZGVMaXN0SlMoQXJyYXlQcm90by5zbGljZS5hcHBseSh0aGlzLCBhcmdzKSwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnc3BsaWNlJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBzcGxpY2UoKSB7XG5cdCAgICAgIGZvciAodmFyIF9sZW44ID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW44KSwgX2tleTggPSAwOyBfa2V5OCA8IF9sZW44OyBfa2V5OCsrKSB7XG5cdCAgICAgICAgYXJnc1tfa2V5OF0gPSBhcmd1bWVudHNbX2tleThdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBmb3IgKHZhciBpID0gMiwgbCA9IGFyZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdCAgICAgICAgaWYgKCFpc05vZGUoYXJnc1tpXSkpIHRocm93IG5vZGVFcnJvcjtcblx0ICAgICAgfVxuXHQgICAgICBBcnJheVByb3RvLnNwbGljZS5hcHBseSh0aGlzLCBhcmdzKTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAndW5zaGlmdCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdW5zaGlmdCgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICB2YXIgdW5zaGlmdCA9IEFycmF5UHJvdG8udW5zaGlmdC5iaW5kKHRoaXMpO1xuXHRcblx0ICAgICAgZm9yICh2YXIgX2xlbjkgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjkpLCBfa2V5OSA9IDA7IF9rZXk5IDwgX2xlbjk7IF9rZXk5KyspIHtcblx0ICAgICAgICBhcmdzW19rZXk5XSA9IGFyZ3VtZW50c1tfa2V5OV07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIEFycmF5UHJvdG8uZm9yRWFjaC5jYWxsKGFyZ3MsIGZ1bmN0aW9uIChhcmcpIHtcblx0ICAgICAgICBpZiAoIWlzTm9kZShhcmcpKSB0aHJvdyBub2RlRXJyb3I7XG5cdCAgICAgICAgaWYgKCF+X3RoaXMyLmluZGV4T2YoYXJnKSkgdW5zaGlmdChhcmcpO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnYWRkQ2xhc3MnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZENsYXNzKGNsYXNzZXMpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgdHJ1ZSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncmVtb3ZlQ2xhc3MnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGNsYXNzZXMpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlQ2xhc3MoY2xhc3NlcywgZmFsc2UpO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3RvZ2dsZUNsYXNzJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB0b2dnbGVDbGFzcyhjbGFzc2VzKSB7XG5cdCAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcblx0XG5cdCAgICAgIHZhciBtZXRob2QgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsID8gJ3RvZ2dsZScgOiB2YWx1ZSA/ICdhZGQnIDogJ3JlbW92ZSc7XG5cdCAgICAgIGlmICh0eXBlb2YgY2xhc3NlcyA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy50cmltKCkucmVwbGFjZSgvXFxzKy8sICcgJykuc3BsaXQoJyAnKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBjbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcblx0ICAgICAgICAgIHJldHVybiBlbC5jbGFzc0xpc3RbbWV0aG9kXShjKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZ2V0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQocHJvcCkge1xuXHQgICAgICB2YXIgYXJyID0gW107XG5cdCAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBpZiAoZWwgIT09IG51bGwpIHtcblx0ICAgICAgICAgIGVsID0gZWxbcHJvcF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiBmbGF0dGVuKGFyciwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnc2V0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQocHJvcCwgdmFsdWUpIHtcblx0ICAgICAgaWYgKHByb3AuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuXHQgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChlbCkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcCkge1xuXHQgICAgICAgICAgICAgIGlmIChrZXkgaW4gZWwpIHtcblx0ICAgICAgICAgICAgICAgIGVsW2tleV0gPSBwcm9wW2tleV07XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgICAgaWYgKHByb3AgaW4gZWwpIHtcblx0ICAgICAgICAgICAgZWxbcHJvcF0gPSB2YWx1ZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdjYWxsJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjYWxsKCkge1xuXHQgICAgICBmb3IgKHZhciBfbGVuMTAgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjEwKSwgX2tleTEwID0gMDsgX2tleTEwIDwgX2xlbjEwOyBfa2V5MTArKykge1xuXHQgICAgICAgIGFyZ3NbX2tleTEwXSA9IGFyZ3VtZW50c1tfa2V5MTBdO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgbWV0aG9kID0gQXJyYXlQcm90by5zaGlmdC5jYWxsKGFyZ3MpO1xuXHQgICAgICB2YXIgYXJyID0gW107XG5cdCAgICAgIHZhciByZXR1cm5UaGlzID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbCAmJiBlbFttZXRob2RdIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0ICAgICAgICAgIGVsID0gZWxbbWV0aG9kXS5hcHBseShlbCwgYXJncyk7XG5cdCAgICAgICAgICBhcnIucHVzaChlbCk7XG5cdCAgICAgICAgICBpZiAocmV0dXJuVGhpcyAmJiBlbCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVyblRoaXMgPSBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgYXJyLnB1c2godW5kZWZpbmVkKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gcmV0dXJuVGhpcyA/IHRoaXMgOiBmbGF0dGVuKGFyciwgdGhpcyk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnaXRlbScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gaXRlbShpbmRleCkge1xuXHQgICAgICByZXR1cm4gTm9kZUxpc3RKUyhbdGhpc1tpbmRleF1dLCB0aGlzKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvbicsXG5cdFxuXHRcblx0ICAgIC8vIGV2ZW50IGhhbmRsZXJzXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb24oZXZlbnRzLCBzZWxlY3RvciwgY2FsbGJhY2spIHtcblx0ICAgICAgaWYgKHR5cGVvZiBldmVudHMgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgZXZlbnRzID0gZXZlbnRzLnRyaW0oKS5yZXBsYWNlKC9cXHMrLywgJyAnKS5zcGxpdCgnICcpO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghdGhpcyB8fCAhdGhpcy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXHQgICAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgIGNhbGxiYWNrID0gc2VsZWN0b3I7XG5cdCAgICAgICAgc2VsZWN0b3IgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICghY2FsbGJhY2spIHJldHVybiB0aGlzO1xuXHQgICAgICB2YXIgZm4gPSBjYWxsYmFjaztcblx0ICAgICAgY2FsbGJhY2sgPSBzZWxlY3RvciA/IGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgdmFyIGVscyA9IE5vZGVMaXN0SlMoc2VsZWN0b3IsIHRoaXMpO1xuXHQgICAgICAgIGlmICghZWxzLmxlbmd0aCkge1xuXHQgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHMuc29tZShmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIHZhciB0YXJnZXQgPSBlbC5jb250YWlucyhlLnRhcmdldCk7XG5cdCAgICAgICAgICBpZiAodGFyZ2V0KSBmbi5jYWxsKGVsLCBlLCBlbCk7XG5cdCAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9IDogZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICBmbi5hcHBseSh0aGlzLCBbZSwgdGhpc10pO1xuXHQgICAgICB9O1xuXHQgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgICBpZiAoZWwgPT09IHdpbmRvdyB8fCBpc05vZGUoZWwpKSB7XG5cdCAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGNhbGxiYWNrLCBmYWxzZSk7XG5cdCAgICAgICAgICAgIEV2ZW50cy5wdXNoKHtcblx0ICAgICAgICAgICAgICBlbDogZWwsXG5cdCAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuXHQgICAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29mZicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb2ZmKGV2ZW50cywgY2FsbGJhY2spIHtcblx0ICAgICAgaWYgKGV2ZW50cyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdCAgICAgICAgY2FsbGJhY2sgPSBldmVudHM7XG5cdCAgICAgICAgZXZlbnRzID0gbnVsbDtcblx0ICAgICAgfVxuXHQgICAgICBldmVudHMgPSBldmVudHMgaW5zdGFuY2VvZiBBcnJheSA/IGV2ZW50cyA6IHR5cGVvZiBldmVudHMgPT09ICdzdHJpbmcnID8gZXZlbnRzLnRyaW0oKS5yZXBsYWNlKC9cXHMrLywgJyAnKS5zcGxpdCgnICcpIDogbnVsbDtcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIEV2ZW50cyA9IEV2ZW50cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgIGlmIChlICYmIGUuZWwgPT09IGVsICYmICghY2FsbGJhY2sgfHwgY2FsbGJhY2sgPT09IGUuY2FsbGJhY2spICYmICghZXZlbnRzIHx8IH5ldmVudHMuaW5kZXhPZihlLmV2ZW50KSkpIHtcblx0ICAgICAgICAgICAgZS5lbC5yZW1vdmVFdmVudExpc3RlbmVyKGUuZXZlbnQsIGUuY2FsbGJhY2spO1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uQmx1cicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb25CbHVyKGNhbGxiYWNrKSB7XG5cdCAgICAgIGlmICghdGhpcyB8fCAhdGhpcy5sZW5ndGgpIHJldHVybiB0aGlzO1xuXHQgICAgICBpZiAoIWNhbGxiYWNrKSByZXR1cm4gdGhpcztcblx0ICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGJsdXJMaXN0LnB1c2goeyBlbDogZWwsIGNhbGxiYWNrOiBjYWxsYmFjayB9KTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmICghYmx1ckV2ZW50KSB7XG5cdCAgICAgICAgYmx1ckV2ZW50ID0gZnVuY3Rpb24gYmx1ckV2ZW50KGUpIHtcblx0ICAgICAgICAgIGJsdXJMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcblx0ICAgICAgICAgICAgdmFyIHRhcmdldCA9IGl0ZW0uZWwuY29udGFpbnMoZS50YXJnZXQpIHx8IGl0ZW0uZWwgPT09IGUudGFyZ2V0O1xuXHQgICAgICAgICAgICBpZiAoIXRhcmdldCkgaXRlbS5jYWxsYmFjay5jYWxsKGl0ZW0uZWwsIGUsIGl0ZW0uZWwpO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGJsdXJFdmVudCwgZmFsc2UpO1xuXHQgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBibHVyRXZlbnQsIGZhbHNlKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvZmZCbHVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvZmZCbHVyKGNhbGxiYWNrKSB7XG5cdCAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICBibHVyTGlzdCA9IGJsdXJMaXN0LmZpbHRlcihmdW5jdGlvbiAoYmx1cikge1xuXHQgICAgICAgICAgaWYgKGJsdXIgJiYgYmx1ci5lbCA9PT0gZWwgJiYgKCFjYWxsYmFjayB8fCBibHVyLmNhbGxiYWNrID09PSBjYWxsYmFjaykpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgcmV0dXJuIGVsO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnYXNBcnJheScsXG5cdCAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcblx0ICAgICAgcmV0dXJuIEFycmF5UHJvdG8uc2xpY2UuY2FsbCh0aGlzKTtcblx0ICAgIH1cblx0ICB9XSk7XG5cdCAgcmV0dXJuIE5vZGVMaXN0O1xuXHR9KCk7XG5cdFxuXHR2YXIgTkwgPSBOb2RlTGlzdC5wcm90b3R5cGU7XG5cdFxuXHRmdW5jdGlvbiBmbGF0dGVuKGFyciwgb3duZXIpIHtcblx0ICB2YXIgbGlzdCA9IFtdO1xuXHQgIEFycmF5UHJvdG8uZm9yRWFjaC5jYWxsKGFyciwgZnVuY3Rpb24gKGVsKSB7XG5cdCAgICBpZiAoaXNOb2RlKGVsKSkge1xuXHQgICAgICBpZiAoIX5saXN0LmluZGV4T2YoZWwpKSBsaXN0LnB1c2goZWwpO1xuXHQgICAgfSBlbHNlIGlmIChpc05vZGVMaXN0KGVsKSkge1xuXHQgICAgICBmb3IgKHZhciBpZCBpbiBlbCkge1xuXHQgICAgICAgIGlmICghfmxpc3QuaW5kZXhPZihlbFtpZF0pKSBsaXN0LnB1c2goZWxbaWRdKTtcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIGlmIChlbCAhPT0gbnVsbCkge1xuXHQgICAgICBhcnIuZ2V0ID0gTkwuZ2V0O1xuXHQgICAgICBhcnIuc2V0ID0gTkwuc2V0O1xuXHQgICAgICBhcnIuY2FsbCA9IE5MLmNhbGw7XG5cdCAgICAgIGFyci5vd25lciA9IG93bmVyO1xuXHQgICAgICByZXR1cm4gYXJyO1xuXHQgICAgfVxuXHQgIH0pO1xuXHQgIHJldHVybiBOb2RlTGlzdEpTKGxpc3QsIG93bmVyKTtcblx0fVxuXHRcblx0dmFyIGV4Y2VwdGlvbnMgPSBbJ2pvaW4nLCAnY29weVdpdGhpbicsICdmaWxsJywgJ2ZpbmQnLCAnZm9yRWFjaCddO1xuXHQoMCwgX2dldE93blByb3BlcnR5TmFtZXMyLmRlZmF1bHQpKEFycmF5UHJvdG8pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuXHQgIGlmICghfmV4Y2VwdGlvbnMuaW5kZXhPZihrZXkpICYmIE5MW2tleV0gPT09IHVuZGVmaW5lZCkge1xuXHQgICAgTkxba2V5XSA9IEFycmF5UHJvdG9ba2V5XTtcblx0ICB9XG5cdH0pO1xuXHRpZiAod2luZG93LlN5bWJvbCAmJiBfaXRlcmF0b3IyLmRlZmF1bHQpIHtcblx0ICBOTFtfaXRlcmF0b3IyLmRlZmF1bHRdID0gTkwudmFsdWVzID0gQXJyYXlQcm90b1tfaXRlcmF0b3IyLmRlZmF1bHRdO1xuXHR9XG5cdHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0ZnVuY3Rpb24gc2V0dGVyR2V0dGVyKHByb3ApIHtcblx0ICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgaWYgKE5MW3Byb3BdKSByZXR1cm47XG5cdCAgaWYgKGRpdltwcm9wXSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdCAgICBOTFtwcm9wXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgZm9yICh2YXIgX2xlbjExID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4xMSksIF9rZXkxMSA9IDA7IF9rZXkxMSA8IF9sZW4xMTsgX2tleTExKyspIHtcblx0ICAgICAgICBhcmdzW19rZXkxMV0gPSBhcmd1bWVudHNbX2tleTExXTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIGFyciA9IFtdO1xuXHQgICAgICB2YXIgcmV0dXJuVGhpcyA9IHRydWU7XG5cdCAgICAgIGZvciAodmFyIGkgaW4gTkwpIHtcblx0ICAgICAgICB2YXIgZWwgPSBOTFtpXTtcblx0ICAgICAgICBpZiAoZWwgJiYgZWxbcHJvcF0gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHQgICAgICAgICAgZWwgPSBlbFtwcm9wXS5hcHBseShlbCwgYXJncyk7XG5cdCAgICAgICAgICBhcnIucHVzaChlbCk7XG5cdCAgICAgICAgICBpZiAocmV0dXJuVGhpcyAmJiBlbCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVyblRoaXMgPSBmYWxzZTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgYXJyLnB1c2godW5kZWZpbmVkKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHJldHVyblRoaXMgPyBfdGhpczMgOiBmbGF0dGVuKGFyciwgX3RoaXMzKTtcblx0ICAgIH07XG5cdCAgfSBlbHNlIHtcblx0ICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKE5MLCBwcm9wLCB7XG5cdCAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuXHQgICAgICAgIHZhciBhcnIgPSBbXTtcblx0ICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgICBpZiAoZWwgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgZWwgPSBlbFtwcm9wXTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGFyci5wdXNoKGVsKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm4gZmxhdHRlbihhcnIsIHRoaXMpO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuXHQgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIGlmIChlbCAmJiBwcm9wIGluIGVsKSB7XG5cdCAgICAgICAgICAgIGVsW3Byb3BdID0gdmFsdWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH0pO1xuXHQgIH1cblx0fVxuXHRmb3IgKHZhciBwcm9wIGluIGRpdikge1xuXHQgIHNldHRlckdldHRlcihwcm9wKTtcblx0fWZ1bmN0aW9uIE5vZGVMaXN0SlMoKSB7XG5cdCAgZm9yICh2YXIgX2xlbjEyID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4xMiksIF9rZXkxMiA9IDA7IF9rZXkxMiA8IF9sZW4xMjsgX2tleTEyKyspIHtcblx0ICAgIGFyZ3NbX2tleTEyXSA9IGFyZ3VtZW50c1tfa2V5MTJdO1xuXHQgIH1cblx0XG5cdCAgcmV0dXJuIG5ldyBOb2RlTGlzdChhcmdzKTtcblx0fVxuXHR3aW5kb3cuTkwgPSBOb2RlTGlzdEpTO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gTm9kZUxpc3RKUztcblxuLyoqKi8gfSxcbi8qIDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogX193ZWJwYWNrX3JlcXVpcmVfXygzKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0dmFyICRPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpLk9iamVjdDtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKXtcblx0ICByZXR1cm4gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0Ly8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcblx0JGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhX193ZWJwYWNrX3JlcXVpcmVfXygxNSksICdPYmplY3QnLCB7ZGVmaW5lUHJvcGVydHk6IF9fd2VicGFja19yZXF1aXJlX18oMTEpLmZ9KTtcblxuLyoqKi8gfSxcbi8qIDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnbG9iYWwgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBjb3JlICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpXG5cdCAgLCBjdHggICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpXG5cdCAgLCBoaWRlICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKVxuXHQgICwgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cdFxuXHR2YXIgJGV4cG9ydCA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHNvdXJjZSl7XG5cdCAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkZcblx0ICAgICwgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuR1xuXHQgICAgLCBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TXG5cdCAgICAsIElTX1BST1RPICA9IHR5cGUgJiAkZXhwb3J0LlBcblx0ICAgICwgSVNfQklORCAgID0gdHlwZSAmICRleHBvcnQuQlxuXHQgICAgLCBJU19XUkFQICAgPSB0eXBlICYgJGV4cG9ydC5XXG5cdCAgICAsIGV4cG9ydHMgICA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pXG5cdCAgICAsIGV4cFByb3RvICA9IGV4cG9ydHNbUFJPVE9UWVBFXVxuXHQgICAgLCB0YXJnZXQgICAgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG5cdCAgICAsIGtleSwgb3duLCBvdXQ7XG5cdCAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG5cdCAgZm9yKGtleSBpbiBzb3VyY2Upe1xuXHQgICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG5cdCAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuXHQgICAgaWYob3duICYmIGtleSBpbiBleHBvcnRzKWNvbnRpbnVlO1xuXHQgICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcblx0ICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG5cdCAgICAvLyBwcmV2ZW50IGdsb2JhbCBwb2xsdXRpb24gZm9yIG5hbWVzcGFjZXNcblx0ICAgIGV4cG9ydHNba2V5XSA9IElTX0dMT0JBTCAmJiB0eXBlb2YgdGFyZ2V0W2tleV0gIT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZVtrZXldXG5cdCAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuXHQgICAgOiBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbClcblx0ICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2UgdGhlbSBpbiBsaWJyYXJ5XG5cdCAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uKEMpe1xuXHQgICAgICB2YXIgRiA9IGZ1bmN0aW9uKGEsIGIsIGMpe1xuXHQgICAgICAgIGlmKHRoaXMgaW5zdGFuY2VvZiBDKXtcblx0ICAgICAgICAgIHN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtcblx0ICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEM7XG5cdCAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDKGEpO1xuXHQgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQyhhLCBiKTtcblx0ICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuXHQgICAgICAgIH0gcmV0dXJuIEMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgfTtcblx0ICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuXHQgICAgICByZXR1cm4gRjtcblx0ICAgIC8vIG1ha2Ugc3RhdGljIHZlcnNpb25zIGZvciBwcm90b3R5cGUgbWV0aG9kc1xuXHQgICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuXHQgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLm1ldGhvZHMuJU5BTUUlXG5cdCAgICBpZihJU19QUk9UTyl7XG5cdCAgICAgIChleHBvcnRzLnZpcnR1YWwgfHwgKGV4cG9ydHMudmlydHVhbCA9IHt9KSlba2V5XSA9IG91dDtcblx0ICAgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSVcblx0ICAgICAgaWYodHlwZSAmICRleHBvcnQuUiAmJiBleHBQcm90byAmJiAhZXhwUHJvdG9ba2V5XSloaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXHQvLyB0eXBlIGJpdG1hcFxuXHQkZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuXHQkZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuXHQkZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuXHQkZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG5cdCRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuXHQkZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcblx0JGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG5cdCRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YCBcblx0bW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuXG4vKioqLyB9LFxuLyogNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcblx0dmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG5cdCAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHRpZih0eXBlb2YgX19nID09ICdudW1iZXInKV9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG4vKioqLyB9LFxuLyogNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHt2ZXJzaW9uOiAnMi40LjAnfTtcblx0aWYodHlwZW9mIF9fZSA9PSAnbnVtYmVyJylfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cbi8qKiovIH0sXG4vKiA4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcblx0dmFyIGFGdW5jdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCl7XG5cdCAgYUZ1bmN0aW9uKGZuKTtcblx0ICBpZih0aGF0ID09PSB1bmRlZmluZWQpcmV0dXJuIGZuO1xuXHQgIHN3aXRjaChsZW5ndGgpe1xuXHQgICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYSl7XG5cdCAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuXHQgICAgfTtcblx0ICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEsIGIpe1xuXHQgICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcblx0ICAgIH07XG5cdCAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbihhLCBiLCBjKXtcblx0ICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG5cdCAgICB9O1xuXHQgIH1cblx0ICByZXR1cm4gZnVuY3Rpb24oLyogLi4uYXJncyAqLyl7XG5cdCAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgaWYodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGRQICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuXHQgICwgY3JlYXRlRGVzYyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpID8gZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcblx0ICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuXHR9IDogZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcblx0ICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuXHQgIHJldHVybiBvYmplY3Q7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIGFuT2JqZWN0ICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcblx0ICAsIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNClcblx0ICAsIHRvUHJpbWl0aXZlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0ICAsIGRQICAgICAgICAgICAgID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXHRcblx0ZXhwb3J0cy5mID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKXtcblx0ICBhbk9iamVjdChPKTtcblx0ICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG5cdCAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG5cdCAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcblx0ICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcblx0ICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG5cdCAgaWYoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKXRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG5cdCAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKU9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuXHQgIHJldHVybiBPO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcblx0ICByZXR1cm4gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9ICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXygxNikoZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19yZXF1aXJlX18oMTcpKCdkaXYnKSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcblx0fSk7XG5cbi8qKiovIH0sXG4vKiAxNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxuXHRtb2R1bGUuZXhwb3J0cyA9ICFfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KShmdW5jdGlvbigpe1xuXHQgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG5cdH0pO1xuXG4vKioqLyB9LFxuLyogMTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYyl7XG5cdCAgdHJ5IHtcblx0ICAgIHJldHVybiAhIWV4ZWMoKTtcblx0ICB9IGNhdGNoKGUpe1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBpc09iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpXG5cdCAgLCBkb2N1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNikuZG9jdW1lbnRcblx0ICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcblx0ICAsIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuXHR2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblx0Ly8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcblx0Ly8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XG5cdCAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gaXQ7XG5cdCAgdmFyIGZuLCB2YWw7XG5cdCAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuXHQgIGlmKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcblx0ICBpZighUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuXHQgIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuXHQgIHJldHVybiB7XG5cdCAgICBlbnVtZXJhYmxlICA6ICEoYml0bWFwICYgMSksXG5cdCAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG5cdCAgICB3cml0YWJsZSAgICA6ICEoYml0bWFwICYgNCksXG5cdCAgICB2YWx1ZSAgICAgICA6IHZhbHVlXG5cdCAgfTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDIwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oMjEpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cbi8qKiovIH0sXG4vKiAyMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMik7XG5cdF9fd2VicGFja19yZXF1aXJlX18oNTEpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNTUpLmYoJ2l0ZXJhdG9yJyk7XG5cbi8qKiovIH0sXG4vKiAyMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgJGF0ICA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpKHRydWUpO1xuXHRcblx0Ly8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbihpdGVyYXRlZCl7XG5cdCAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuXHQgIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG5cdC8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcblx0fSwgZnVuY3Rpb24oKXtcblx0ICB2YXIgTyAgICAgPSB0aGlzLl90XG5cdCAgICAsIGluZGV4ID0gdGhpcy5faVxuXHQgICAgLCBwb2ludDtcblx0ICBpZihpbmRleCA+PSBPLmxlbmd0aClyZXR1cm4ge3ZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWV9O1xuXHQgIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcblx0ICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcblx0ICByZXR1cm4ge3ZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2V9O1xuXHR9KTtcblxuLyoqKi8gfSxcbi8qIDIzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNClcblx0ICAsIGRlZmluZWQgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjUpO1xuXHQvLyB0cnVlICAtPiBTdHJpbmcjYXRcblx0Ly8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVE9fU1RSSU5HKXtcblx0ICByZXR1cm4gZnVuY3Rpb24odGhhdCwgcG9zKXtcblx0ICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpXG5cdCAgICAgICwgaSA9IHRvSW50ZWdlcihwb3MpXG5cdCAgICAgICwgbCA9IHMubGVuZ3RoXG5cdCAgICAgICwgYSwgYjtcblx0ICAgIGlmKGkgPCAwIHx8IGkgPj0gbClyZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG5cdCAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuXHQgICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcblx0ICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcblx0ICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG5cdCAgfTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDI0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyA3LjEuNCBUb0ludGVnZXJcblx0dmFyIGNlaWwgID0gTWF0aC5jZWlsXG5cdCAgLCBmbG9vciA9IE1hdGguZmxvb3I7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIGlmKGl0ID09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG5cdCAgcmV0dXJuIGl0O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0dmFyIExJQlJBUlkgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNylcblx0ICAsICRleHBvcnQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KVxuXHQgICwgcmVkZWZpbmUgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KVxuXHQgICwgaGlkZSAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKVxuXHQgICwgaGFzICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgSXRlcmF0b3JzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKVxuXHQgICwgJGl0ZXJDcmVhdGUgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMxKVxuXHQgICwgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KVxuXHQgICwgZ2V0UHJvdG90eXBlT2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ5KVxuXHQgICwgSVRFUkFUT1IgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgnaXRlcmF0b3InKVxuXHQgICwgQlVHR1kgICAgICAgICAgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSkgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuXHQgICwgRkZfSVRFUkFUT1IgICAgPSAnQEBpdGVyYXRvcidcblx0ICAsIEtFWVMgICAgICAgICAgID0gJ2tleXMnXG5cdCAgLCBWQUxVRVMgICAgICAgICA9ICd2YWx1ZXMnO1xuXHRcblx0dmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKXtcblx0ICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cdCAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpe1xuXHQgICAgaWYoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pcmV0dXJuIHByb3RvW2tpbmRdO1xuXHQgICAgc3dpdGNoKGtpbmQpe1xuXHQgICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG5cdCAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG5cdCAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG5cdCAgfTtcblx0ICB2YXIgVEFHICAgICAgICA9IE5BTUUgKyAnIEl0ZXJhdG9yJ1xuXHQgICAgLCBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVNcblx0ICAgICwgVkFMVUVTX0JVRyA9IGZhbHNlXG5cdCAgICAsIHByb3RvICAgICAgPSBCYXNlLnByb3RvdHlwZVxuXHQgICAgLCAkbmF0aXZlICAgID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdXG5cdCAgICAsICRkZWZhdWx0ICAgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKVxuXHQgICAgLCAkZW50cmllcyAgID0gREVGQVVMVCA/ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKSA6IHVuZGVmaW5lZFxuXHQgICAgLCAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZVxuXHQgICAgLCBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuXHQgIC8vIEZpeCBuYXRpdmVcblx0ICBpZigkYW55TmF0aXZlKXtcblx0ICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKSk7XG5cdCAgICBpZihJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSl7XG5cdCAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcblx0ICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG5cdCAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuXHQgICAgICBpZighTElCUkFSWSAmJiAhaGFzKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUikpaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuXHQgICAgfVxuXHQgIH1cblx0ICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG5cdCAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKXtcblx0ICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuXHQgICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKXsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcblx0ICB9XG5cdCAgLy8gRGVmaW5lIGl0ZXJhdG9yXG5cdCAgaWYoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpe1xuXHQgICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcblx0ICB9XG5cdCAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuXHQgIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuXHQgIEl0ZXJhdG9yc1tUQUddICA9IHJldHVyblRoaXM7XG5cdCAgaWYoREVGQVVMVCl7XG5cdCAgICBtZXRob2RzID0ge1xuXHQgICAgICB2YWx1ZXM6ICBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcblx0ICAgICAga2V5czogICAgSVNfU0VUICAgICA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuXHQgICAgICBlbnRyaWVzOiAkZW50cmllc1xuXHQgICAgfTtcblx0ICAgIGlmKEZPUkNFRClmb3Ioa2V5IGluIG1ldGhvZHMpe1xuXHQgICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcblx0ICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG5cdCAgfVxuXHQgIHJldHVybiBtZXRob2RzO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0gdHJ1ZTtcblxuLyoqKi8gfSxcbi8qIDI4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXG4vKioqLyB9LFxuLyogMjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdHZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuXHQgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8qKiovIH0sXG4vKiAzMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgY3JlYXRlICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMyKVxuXHQgICwgZGVzY3JpcHRvciAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KVxuXHQgICwgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KVxuXHQgICwgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblx0XG5cdC8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTApKEl0ZXJhdG9yUHJvdG90eXBlLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgnaXRlcmF0b3InKSwgZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH0pO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCl7XG5cdCAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7bmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KX0pO1xuXHQgIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuXHR2YXIgYW5PYmplY3QgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKVxuXHQgICwgZFBzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMzKVxuXHQgICwgZW51bUJ1Z0tleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ1KVxuXHQgICwgSUVfUFJPVE8gICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQyKSgnSUVfUFJPVE8nKVxuXHQgICwgRW1wdHkgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XG5cdCAgLCBQUk9UT1RZUEUgICA9ICdwcm90b3R5cGUnO1xuXHRcblx0Ly8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxuXHR2YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XG5cdCAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcblx0ICB2YXIgaWZyYW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNykoJ2lmcmFtZScpXG5cdCAgICAsIGkgICAgICA9IGVudW1CdWdLZXlzLmxlbmd0aFxuXHQgICAgLCBsdCAgICAgPSAnPCdcblx0ICAgICwgZ3QgICAgID0gJz4nXG5cdCAgICAsIGlmcmFtZURvY3VtZW50O1xuXHQgIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHQgIF9fd2VicGFja19yZXF1aXJlX18oNDYpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG5cdCAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuXHQgIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG5cdCAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuXHQgIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG5cdCAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuXHQgIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcblx0ICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuXHQgIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuXHQgIHdoaWxlKGktLSlkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcblx0ICByZXR1cm4gY3JlYXRlRGljdCgpO1xuXHR9O1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKXtcblx0ICB2YXIgcmVzdWx0O1xuXHQgIGlmKE8gIT09IG51bGwpe1xuXHQgICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuXHQgICAgcmVzdWx0ID0gbmV3IEVtcHR5O1xuXHQgICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG5cdCAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG5cdCAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcblx0ICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuXHQgIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMzMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBkUCAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG5cdCAgLCBhbk9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpXG5cdCAgLCBnZXRLZXlzICA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKXtcblx0ICBhbk9iamVjdChPKTtcblx0ICB2YXIga2V5cyAgID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKVxuXHQgICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuXHQgICAgLCBpID0gMFxuXHQgICAgLCBQO1xuXHQgIHdoaWxlKGxlbmd0aCA+IGkpZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcblx0ICByZXR1cm4gTztcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcblx0dmFyICRrZXlzICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNSlcblx0ICAsIGVudW1CdWdLZXlzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NSk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTyl7XG5cdCAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgaGFzICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIHRvSU9iamVjdCAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpXG5cdCAgLCBhcnJheUluZGV4T2YgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM5KShmYWxzZSlcblx0ICAsIElFX1BST1RPICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDIpKCdJRV9QUk9UTycpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIG5hbWVzKXtcblx0ICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcblx0ICAgICwgaSAgICAgID0gMFxuXHQgICAgLCByZXN1bHQgPSBbXVxuXHQgICAgLCBrZXk7XG5cdCAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuXHQgIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcblx0ICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XG5cdCAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuXHQgIH1cblx0ICByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xuXHR2YXIgSU9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMzcpXG5cdCAgLCBkZWZpbmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNSk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xuXHR2YXIgY29mID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOCk7XG5cdG1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMzggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdHZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDM5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG5cdC8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG5cdHZhciB0b0lPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2KVxuXHQgICwgdG9MZW5ndGggID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MClcblx0ICAsIHRvSW5kZXggICA9IF9fd2VicGFja19yZXF1aXJlX18oNDEpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcblx0ICByZXR1cm4gZnVuY3Rpb24oJHRoaXMsIGVsLCBmcm9tSW5kZXgpe1xuXHQgICAgdmFyIE8gICAgICA9IHRvSU9iamVjdCgkdGhpcylcblx0ICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcblx0ICAgICAgLCBpbmRleCAgPSB0b0luZGV4KGZyb21JbmRleCwgbGVuZ3RoKVxuXHQgICAgICAsIHZhbHVlO1xuXHQgICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuXHQgICAgaWYoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpd2hpbGUobGVuZ3RoID4gaW5kZXgpe1xuXHQgICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG5cdCAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuXHQgICAgLy8gQXJyYXkjdG9JbmRleCBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuXHQgICAgfSBlbHNlIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTyl7XG5cdCAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcblx0ICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcblx0ICB9O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMS4xNSBUb0xlbmd0aFxuXHR2YXIgdG9JbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNClcblx0ICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcblx0ICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxuXHR9O1xuXG4vKioqLyB9LFxuLyogNDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciB0b0ludGVnZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI0KVxuXHQgICwgbWF4ICAgICAgID0gTWF0aC5tYXhcblx0ICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGluZGV4LCBsZW5ndGgpe1xuXHQgIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcblx0ICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgc2hhcmVkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MykoJ2tleXMnKVxuXHQgICwgdWlkICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NCk7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcblx0ICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnbG9iYWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJ1xuXHQgICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG5cdCAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB7fSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA0NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0dmFyIGlkID0gMFxuXHQgICwgcHggPSBNYXRoLnJhbmRvbSgpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG5cdCAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQ1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5cdG1vZHVsZS5leHBvcnRzID0gKFxuXHQgICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG5cdCkuc3BsaXQoJywnKTtcblxuLyoqKi8gfSxcbi8qIDQ2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNikuZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4vKioqLyB9LFxuLyogNDcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBkZWYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKS5mXG5cdCAgLCBoYXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgVEFHID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OCkoJ3RvU3RyaW5nVGFnJyk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuXHQgIGlmKGl0ICYmICFoYXMoaXQgPSBzdGF0ID8gaXQgOiBpdC5wcm90b3R5cGUsIFRBRykpZGVmKGl0LCBUQUcsIHtjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWd9KTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDQ4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgc3RvcmUgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDMpKCd3a3MnKVxuXHQgICwgdWlkICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNDQpXG5cdCAgLCBTeW1ib2wgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KS5TeW1ib2xcblx0ICAsIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cdFxuXHR2YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuXHQgIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuXHQgICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcblx0fTtcblx0XG5cdCRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG5cbi8qKiovIH0sXG4vKiA0OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcblx0dmFyIGhhcyAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIHRvT2JqZWN0ICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MClcblx0ICAsIElFX1BST1RPICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MikoJ0lFX1BST1RPJylcblx0ICAsIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uKE8pe1xuXHQgIE8gPSB0b09iamVjdChPKTtcblx0ICBpZihoYXMoTywgSUVfUFJPVE8pKXJldHVybiBPW0lFX1BST1RPXTtcblx0ICBpZih0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKXtcblx0ICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcblx0ICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcblx0dmFyIGRlZmluZWQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1MSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg1Mik7XG5cdHZhciBnbG9iYWwgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KVxuXHQgICwgaGlkZSAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTApXG5cdCAgLCBJdGVyYXRvcnMgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMClcblx0ICAsIFRPX1NUUklOR19UQUcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KSgndG9TdHJpbmdUYWcnKTtcblx0XG5cdGZvcih2YXIgY29sbGVjdGlvbnMgPSBbJ05vZGVMaXN0JywgJ0RPTVRva2VuTGlzdCcsICdNZWRpYUxpc3QnLCAnU3R5bGVTaGVldExpc3QnLCAnQ1NTUnVsZUxpc3QnXSwgaSA9IDA7IGkgPCA1OyBpKyspe1xuXHQgIHZhciBOQU1FICAgICAgID0gY29sbGVjdGlvbnNbaV1cblx0ICAgICwgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXVxuXHQgICAgLCBwcm90byAgICAgID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcblx0ICBpZihwcm90byAmJiAhcHJvdG9bVE9fU1RSSU5HX1RBR10paGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG5cdCAgSXRlcmF0b3JzW05BTUVdID0gSXRlcmF0b3JzLkFycmF5O1xuXHR9XG5cbi8qKiovIH0sXG4vKiA1MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHR2YXIgYWRkVG9VbnNjb3BhYmxlcyA9IF9fd2VicGFja19yZXF1aXJlX18oNTMpXG5cdCAgLCBzdGVwICAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1NClcblx0ICAsIEl0ZXJhdG9ycyAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKVxuXHQgICwgdG9JT2JqZWN0ICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzYpO1xuXHRcblx0Ly8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuXHQvLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuXHQvLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG5cdC8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG5cdCAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuXHQgIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG5cdCAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcblx0Ly8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG5cdH0sIGZ1bmN0aW9uKCl7XG5cdCAgdmFyIE8gICAgID0gdGhpcy5fdFxuXHQgICAgLCBraW5kICA9IHRoaXMuX2tcblx0ICAgICwgaW5kZXggPSB0aGlzLl9pKys7XG5cdCAgaWYoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpe1xuXHQgICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcblx0ICAgIHJldHVybiBzdGVwKDEpO1xuXHQgIH1cblx0ICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGluZGV4KTtcblx0ICBpZihraW5kID09ICd2YWx1ZXMnKXJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcblx0ICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG5cdH0sICd2YWx1ZXMnKTtcblx0XG5cdC8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcblx0SXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblx0XG5cdGFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcblx0YWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5cdGFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcblxuLyoqKi8gfSxcbi8qIDUzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH07XG5cbi8qKiovIH0sXG4vKiA1NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkb25lLCB2YWx1ZSl7XG5cdCAgcmV0dXJuIHt2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZX07XG5cdH07XG5cbi8qKiovIH0sXG4vKiA1NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cy5mID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0OCk7XG5cbi8qKiovIH0sXG4vKiA1NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDU3KSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogNTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oNTgpO1xuXHR2YXIgJE9iamVjdCA9IF9fd2VicGFja19yZXF1aXJlX18oNykuT2JqZWN0O1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuXHQgIHJldHVybiAkT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaXQpO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogNTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG5cdF9fd2VicGFja19yZXF1aXJlX18oNTkpKCdnZXRPd25Qcm9wZXJ0eU5hbWVzJywgZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg2MCkuZjtcblx0fSk7XG5cbi8qKiovIH0sXG4vKiA1OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG5cdHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KVxuXHQgICwgY29yZSAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNylcblx0ICAsIGZhaWxzICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVksIGV4ZWMpe1xuXHQgIHZhciBmbiAgPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV1cblx0ICAgICwgZXhwID0ge307XG5cdCAgZXhwW0tFWV0gPSBleGVjKGZuKTtcblx0ICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uKCl7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA2MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xuXHR2YXIgdG9JT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIGdPUE4gICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNjEpLmZcblx0ICAsIHRvU3RyaW5nICA9IHt9LnRvU3RyaW5nO1xuXHRcblx0dmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcblx0ICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblx0XG5cdHZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uKGl0KXtcblx0ICB0cnkge1xuXHQgICAgcmV0dXJuIGdPUE4oaXQpO1xuXHQgIH0gY2F0Y2goZSl7XG5cdCAgICByZXR1cm4gd2luZG93TmFtZXMuc2xpY2UoKTtcblx0ICB9XG5cdH07XG5cdFxuXHRtb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG5cdCAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogZ09QTih0b0lPYmplY3QoaXQpKTtcblx0fTtcblxuXG4vKioqLyB9LFxuLyogNjEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcblx0dmFyICRrZXlzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1KVxuXHQgICwgaGlkZGVuS2V5cyA9IF9fd2VicGFja19yZXF1aXJlX18oNDUpLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXHRcblx0ZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKXtcblx0ICByZXR1cm4gJGtleXMoTywgaGlkZGVuS2V5cyk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiA2MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHRleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuXHQgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG5cdCAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDYzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cdFxuXHR2YXIgX2RlZmluZVByb3BlcnR5ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0XG5cdHZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcblx0ICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcblx0ICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuXHQgICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG5cdCAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG5cdCAgICAgICgwLCBfZGVmaW5lUHJvcGVydHkyLmRlZmF1bHQpKHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuXHQgICAgfVxuXHQgIH1cblx0XG5cdCAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcblx0ICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG5cdCAgICBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcblx0ICAgIHJldHVybiBDb25zdHJ1Y3Rvcjtcblx0ICB9O1xuXHR9KCk7XG5cbi8qKiovIH0sXG4vKiA2NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0LyoqXHJcblx0ICogQXJyYXkuZmluZFxyXG5cdCAqL1xuXHRpZiAoIUFycmF5LnByb3RvdHlwZS5maW5kKSB7XG5cdCAgQXJyYXkucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG5cdCAgICAndXNlIHN0cmljdCc7XG5cdFxuXHQgICAgaWYgKHRoaXMgPT0gbnVsbCkge1xuXHQgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUuZmluZCBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQnKTtcblx0ICAgIH1cblx0ICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ByZWRpY2F0ZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblx0ICAgIH1cblx0ICAgIHZhciBsaXN0ID0gT2JqZWN0KHRoaXMpO1xuXHQgICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoID4+PiAwO1xuXHQgICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07XG5cdCAgICB2YXIgdmFsdWU7XG5cdFxuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuXHQgICAgICB2YWx1ZSA9IGxpc3RbaV07XG5cdCAgICAgIGlmIChwcmVkaWNhdGUuY2FsbCh0aGlzQXJnLCB2YWx1ZSwgaSwgbGlzdCkpIHtcblx0ICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHJldHVybiB1bmRlZmluZWQ7XG5cdCAgfTtcblx0fVxuXHRcblx0LypcclxuXHQgKiBjbGFzc0xpc3QuanM6IENyb3NzLWJyb3dzZXIgZnVsbCBlbGVtZW50LmNsYXNzTGlzdCBpbXBsZW1lbnRhdGlvbi5cclxuXHQgKiAxLjEuMjAxNTAzMTJcclxuXHQgKlxyXG5cdCAqIEJ5IEVsaSBHcmV5LCBodHRwOi8vZWxpZ3JleS5jb21cclxuXHQgKiBMaWNlbnNlOiBEZWRpY2F0ZWQgdG8gdGhlIHB1YmxpYyBkb21haW4uXHJcblx0ICogICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvY2xhc3NMaXN0LmpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UubWRcclxuXHQgKi9cblx0LypnbG9iYWwgc2VsZiwgZG9jdW1lbnQsIERPTUV4Y2VwdGlvbiAqL1xuXHQvKiEgQHNvdXJjZSBodHRwOi8vcHVybC5lbGlncmV5LmNvbS9naXRodWIvY2xhc3NMaXN0LmpzL2Jsb2IvbWFzdGVyL2NsYXNzTGlzdC5qcyAqL1xuXHRpZiAoXCJkb2N1bWVudFwiIGluIHNlbGYpIHtcblx0ICAvLyBGdWxsIHBvbHlmaWxsIGZvciBicm93c2VycyB3aXRoIG5vIGNsYXNzTGlzdCBzdXBwb3J0XG5cdCAgLy8gSW5jbHVkaW5nIElFIDwgRWRnZSBtaXNzaW5nIFNWR0VsZW1lbnQuY2xhc3NMaXN0XG5cdCAgaWYgKCEoXCJjbGFzc0xpc3RcIiBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiX1wiKSkgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TICYmICEoXCJjbGFzc0xpc3RcIiBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIikpKSB7XG5cdFxuXHQgICAgKGZ1bmN0aW9uICh2aWV3KSB7XG5cdFxuXHQgICAgICBcInVzZSBzdHJpY3RcIjtcblx0XG5cdCAgICAgIGlmICghKCdFbGVtZW50JyBpbiB2aWV3KSkgcmV0dXJuO1xuXHRcblx0ICAgICAgdmFyIGNsYXNzTGlzdFByb3AgPSBcImNsYXNzTGlzdFwiLFxuXHQgICAgICAgICAgcHJvdG9Qcm9wID0gXCJwcm90b3R5cGVcIixcblx0ICAgICAgICAgIGVsZW1DdHJQcm90byA9IHZpZXcuRWxlbWVudFtwcm90b1Byb3BdLFxuXHQgICAgICAgICAgb2JqQ3RyID0gT2JqZWN0LFxuXHQgICAgICAgICAgc3RyVHJpbSA9IFN0cmluZ1twcm90b1Byb3BdLnRyaW0gfHwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2UoL15cXHMrfFxccyskL2csIFwiXCIpO1xuXHQgICAgICB9LFxuXHQgICAgICAgICAgYXJySW5kZXhPZiA9IEFycmF5W3Byb3RvUHJvcF0uaW5kZXhPZiB8fCBmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgICAgIHZhciBpID0gMCxcblx0ICAgICAgICAgICAgbGVuID0gdGhpcy5sZW5ndGg7XG5cdCAgICAgICAgZm9yICg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgaWYgKGkgaW4gdGhpcyAmJiB0aGlzW2ldID09PSBpdGVtKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gLTE7XG5cdCAgICAgIH1cblx0ICAgICAgLy8gVmVuZG9yczogcGxlYXNlIGFsbG93IGNvbnRlbnQgY29kZSB0byBpbnN0YW50aWF0ZSBET01FeGNlcHRpb25zXG5cdCAgICAgICxcblx0ICAgICAgICAgIERPTUV4ID0gZnVuY3Rpb24gRE9NRXgodHlwZSwgbWVzc2FnZSkge1xuXHQgICAgICAgIHRoaXMubmFtZSA9IHR5cGU7XG5cdCAgICAgICAgdGhpcy5jb2RlID0gRE9NRXhjZXB0aW9uW3R5cGVdO1xuXHQgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBjaGVja1Rva2VuQW5kR2V0SW5kZXggPSBmdW5jdGlvbiBjaGVja1Rva2VuQW5kR2V0SW5kZXgoY2xhc3NMaXN0LCB0b2tlbikge1xuXHQgICAgICAgIGlmICh0b2tlbiA9PT0gXCJcIikge1xuXHQgICAgICAgICAgdGhyb3cgbmV3IERPTUV4KFwiU1lOVEFYX0VSUlwiLCBcIkFuIGludmFsaWQgb3IgaWxsZWdhbCBzdHJpbmcgd2FzIHNwZWNpZmllZFwiKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKC9cXHMvLnRlc3QodG9rZW4pKSB7XG5cdCAgICAgICAgICB0aHJvdyBuZXcgRE9NRXgoXCJJTlZBTElEX0NIQVJBQ1RFUl9FUlJcIiwgXCJTdHJpbmcgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXJcIik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBhcnJJbmRleE9mLmNhbGwoY2xhc3NMaXN0LCB0b2tlbik7XG5cdCAgICAgIH0sXG5cdCAgICAgICAgICBDbGFzc0xpc3QgPSBmdW5jdGlvbiBDbGFzc0xpc3QoZWxlbSkge1xuXHQgICAgICAgIHZhciB0cmltbWVkQ2xhc3NlcyA9IHN0clRyaW0uY2FsbChlbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIpLFxuXHQgICAgICAgICAgICBjbGFzc2VzID0gdHJpbW1lZENsYXNzZXMgPyB0cmltbWVkQ2xhc3Nlcy5zcGxpdCgvXFxzKy8pIDogW10sXG5cdCAgICAgICAgICAgIGkgPSAwLFxuXHQgICAgICAgICAgICBsZW4gPSBjbGFzc2VzLmxlbmd0aDtcblx0ICAgICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICB0aGlzLnB1c2goY2xhc3Nlc1tpXSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy50b1N0cmluZygpKTtcblx0ICAgICAgICB9O1xuXHQgICAgICB9LFxuXHQgICAgICAgICAgY2xhc3NMaXN0UHJvdG8gPSBDbGFzc0xpc3RbcHJvdG9Qcm9wXSA9IFtdLFxuXHQgICAgICAgICAgY2xhc3NMaXN0R2V0dGVyID0gZnVuY3Rpb24gY2xhc3NMaXN0R2V0dGVyKCkge1xuXHQgICAgICAgIHJldHVybiBuZXcgQ2xhc3NMaXN0KHRoaXMpO1xuXHQgICAgICB9O1xuXHQgICAgICAvLyBNb3N0IERPTUV4Y2VwdGlvbiBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgYWxsb3cgY2FsbGluZyBET01FeGNlcHRpb24ncyB0b1N0cmluZygpXG5cdCAgICAgIC8vIG9uIG5vbi1ET01FeGNlcHRpb25zLiBFcnJvcidzIHRvU3RyaW5nKCkgaXMgc3VmZmljaWVudCBoZXJlLlxuXHQgICAgICBET01FeFtwcm90b1Byb3BdID0gRXJyb3JbcHJvdG9Qcm9wXTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8uaXRlbSA9IGZ1bmN0aW9uIChpKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXNbaV0gfHwgbnVsbDtcblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8uY29udGFpbnMgPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICB0b2tlbiArPSBcIlwiO1xuXHQgICAgICAgIHJldHVybiBjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pICE9PSAtMTtcblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8uYWRkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0b2tlbnMgPSBhcmd1bWVudHMsXG5cdCAgICAgICAgICAgIGkgPSAwLFxuXHQgICAgICAgICAgICBsID0gdG9rZW5zLmxlbmd0aCxcblx0ICAgICAgICAgICAgdG9rZW4sXG5cdCAgICAgICAgICAgIHVwZGF0ZWQgPSBmYWxzZTtcblx0ICAgICAgICBkbyB7XG5cdCAgICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXSArIFwiXCI7XG5cdCAgICAgICAgICBpZiAoY2hlY2tUb2tlbkFuZEdldEluZGV4KHRoaXMsIHRva2VuKSA9PT0gLTEpIHtcblx0ICAgICAgICAgICAgdGhpcy5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSB3aGlsZSAoKytpIDwgbCk7XG5cdFxuXHQgICAgICAgIGlmICh1cGRhdGVkKSB7XG5cdCAgICAgICAgICB0aGlzLl91cGRhdGVDbGFzc05hbWUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH07XG5cdCAgICAgIGNsYXNzTGlzdFByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgdG9rZW5zID0gYXJndW1lbnRzLFxuXHQgICAgICAgICAgICBpID0gMCxcblx0ICAgICAgICAgICAgbCA9IHRva2Vucy5sZW5ndGgsXG5cdCAgICAgICAgICAgIHRva2VuLFxuXHQgICAgICAgICAgICB1cGRhdGVkID0gZmFsc2UsXG5cdCAgICAgICAgICAgIGluZGV4O1xuXHQgICAgICAgIGRvIHtcblx0ICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldICsgXCJcIjtcblx0ICAgICAgICAgIGluZGV4ID0gY2hlY2tUb2tlbkFuZEdldEluZGV4KHRoaXMsIHRva2VuKTtcblx0ICAgICAgICAgIHdoaWxlIChpbmRleCAhPT0gLTEpIHtcblx0ICAgICAgICAgICAgdGhpcy5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgaW5kZXggPSBjaGVja1Rva2VuQW5kR2V0SW5kZXgodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gd2hpbGUgKCsraSA8IGwpO1xuXHRcblx0ICAgICAgICBpZiAodXBkYXRlZCkge1xuXHQgICAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgICBjbGFzc0xpc3RQcm90by50b2dnbGUgPSBmdW5jdGlvbiAodG9rZW4sIGZvcmNlKSB7XG5cdCAgICAgICAgdG9rZW4gKz0gXCJcIjtcblx0XG5cdCAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuY29udGFpbnModG9rZW4pLFxuXHQgICAgICAgICAgICBtZXRob2QgPSByZXN1bHQgPyBmb3JjZSAhPT0gdHJ1ZSAmJiBcInJlbW92ZVwiIDogZm9yY2UgIT09IGZhbHNlICYmIFwiYWRkXCI7XG5cdFxuXHQgICAgICAgIGlmIChtZXRob2QpIHtcblx0ICAgICAgICAgIHRoaXNbbWV0aG9kXSh0b2tlbik7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICBpZiAoZm9yY2UgPT09IHRydWUgfHwgZm9yY2UgPT09IGZhbHNlKSB7XG5cdCAgICAgICAgICByZXR1cm4gZm9yY2U7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHJldHVybiAhcmVzdWx0O1xuXHQgICAgICAgIH1cblx0ICAgICAgfTtcblx0ICAgICAgY2xhc3NMaXN0UHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuam9pbihcIiBcIik7XG5cdCAgICAgIH07XG5cdFxuXHQgICAgICBpZiAob2JqQ3RyLmRlZmluZVByb3BlcnR5KSB7XG5cdCAgICAgICAgdmFyIGNsYXNzTGlzdFByb3BEZXNjID0ge1xuXHQgICAgICAgICAgZ2V0OiBjbGFzc0xpc3RHZXR0ZXIsXG5cdCAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuXHQgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KGVsZW1DdHJQcm90bywgY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0UHJvcERlc2MpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG5cdCAgICAgICAgICAvLyBJRSA4IGRvZXNuJ3Qgc3VwcG9ydCBlbnVtZXJhYmxlOnRydWVcblx0ICAgICAgICAgIGlmIChleC5udW1iZXIgPT09IC0weDdGRjVFQzU0KSB7XG5cdCAgICAgICAgICAgIGNsYXNzTGlzdFByb3BEZXNjLmVudW1lcmFibGUgPSBmYWxzZTtcblx0ICAgICAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KGVsZW1DdHJQcm90bywgY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0UHJvcERlc2MpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIGlmIChvYmpDdHJbcHJvdG9Qcm9wXS5fX2RlZmluZUdldHRlcl9fKSB7XG5cdCAgICAgICAgZWxlbUN0clByb3RvLl9fZGVmaW5lR2V0dGVyX18oY2xhc3NMaXN0UHJvcCwgY2xhc3NMaXN0R2V0dGVyKTtcblx0ICAgICAgfVxuXHQgICAgfSkoc2VsZik7XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vIFRoZXJlIGlzIGZ1bGwgb3IgcGFydGlhbCBuYXRpdmUgY2xhc3NMaXN0IHN1cHBvcnQsIHNvIGp1c3QgY2hlY2sgaWYgd2UgbmVlZFxuXHQgICAgLy8gdG8gbm9ybWFsaXplIHRoZSBhZGQvcmVtb3ZlIGFuZCB0b2dnbGUgQVBJcy5cblx0XG5cdCAgICAoZnVuY3Rpb24gKCkge1xuXHQgICAgICBcInVzZSBzdHJpY3RcIjtcblx0XG5cdCAgICAgIHZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJfXCIpO1xuXHRcblx0ICAgICAgdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcImMxXCIsIFwiYzJcIik7XG5cdFxuXHQgICAgICAvLyBQb2x5ZmlsbCBmb3IgSUUgMTAvMTEgYW5kIEZpcmVmb3ggPDI2LCB3aGVyZSBjbGFzc0xpc3QuYWRkIGFuZFxuXHQgICAgICAvLyBjbGFzc0xpc3QucmVtb3ZlIGV4aXN0IGJ1dCBzdXBwb3J0IG9ubHkgb25lIGFyZ3VtZW50IGF0IGEgdGltZS5cblx0ICAgICAgaWYgKCF0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjMlwiKSkge1xuXHQgICAgICAgIHZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiBjcmVhdGVNZXRob2QobWV0aG9kKSB7XG5cdCAgICAgICAgICB2YXIgb3JpZ2luYWwgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlW21ldGhvZF07XG5cdFxuXHQgICAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgICAgIHZhciBpLFxuXHQgICAgICAgICAgICAgICAgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcblx0XG5cdCAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICAgIHRva2VuID0gYXJndW1lbnRzW2ldO1xuXHQgICAgICAgICAgICAgIG9yaWdpbmFsLmNhbGwodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgY3JlYXRlTWV0aG9kKCdhZGQnKTtcblx0ICAgICAgICBjcmVhdGVNZXRob2QoJ3JlbW92ZScpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKFwiYzNcIiwgZmFsc2UpO1xuXHRcblx0ICAgICAgLy8gUG9seWZpbGwgZm9yIElFIDEwIGFuZCBGaXJlZm94IDwyNCwgd2hlcmUgY2xhc3NMaXN0LnRvZ2dsZSBkb2VzIG5vdFxuXHQgICAgICAvLyBzdXBwb3J0IHRoZSBzZWNvbmQgYXJndW1lbnQuXG5cdCAgICAgIGlmICh0ZXN0RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJjM1wiKSkge1xuXHQgICAgICAgIHZhciBfdG9nZ2xlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGU7XG5cdFxuXHQgICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKHRva2VuLCBmb3JjZSkge1xuXHQgICAgICAgICAgaWYgKDEgaW4gYXJndW1lbnRzICYmICF0aGlzLmNvbnRhaW5zKHRva2VuKSA9PT0gIWZvcmNlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmb3JjZTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiBfdG9nZ2xlLmNhbGwodGhpcywgdG9rZW4pO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHRlc3RFbGVtZW50ID0gbnVsbDtcblx0ICAgIH0pKCk7XG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA2NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdGV4cG9ydHMuZ2V0SlNPTiA9IGdldEpTT047XG5cdGV4cG9ydHMuZ2V0U2Nyb2xsQmFyV2lkdGggPSBnZXRTY3JvbGxCYXJXaWR0aDtcblx0ZXhwb3J0cy50cmFuc2xhdGlvbnMgPSB0cmFuc2xhdGlvbnM7XG5cdGV4cG9ydHMuZGVsYXllciA9IGRlbGF5ZXI7XG5cdGV4cG9ydHMuVnVlRml4ZXIgPSBWdWVGaXhlcjtcblx0Ly8gY29lcmNlIGNvbnZlcnQgc29tIHR5cGVzIG9mIGRhdGEgaW50byBhbm90aGVyIHR5cGVcblx0dmFyIGNvZXJjZSA9IGV4cG9ydHMuY29lcmNlID0ge1xuXHQgIC8vIENvbnZlcnQgYSBzdHJpbmcgdG8gYm9vbGVhbS4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHZhbHVlIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBzbyBpZiBpcyBub3QgYm9vbGVhbiwgVnVlIHRocm93IGEgd2FybmluZy5cblx0ICBib29sZWFuOiBmdW5jdGlvbiBib29sZWFuKHZhbCkge1xuXHQgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gdmFsID09PSAnJyB8fCB2YWwgPT09ICd0cnVlJyA/IHRydWUgOiB2YWwgPT09ICdmYWxzZScgfHwgdmFsID09PSAnbnVsbCcgfHwgdmFsID09PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogdmFsIDogdmFsO1xuXHQgIH0sXG5cdCAgLy8gQXR0ZW1wdCB0byBjb252ZXJ0IGEgc3RyaW5nIHZhbHVlIHRvIGEgTnVtYmVyLiBPdGhlcndpc2UsIHJldHVybiAwLlxuXHQgIG51bWJlcjogZnVuY3Rpb24gbnVtYmVyKHZhbCkge1xuXHQgICAgdmFyIGFsdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcblx0ICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyA/IHZhbCA6IHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCB8fCBpc05hTihOdW1iZXIodmFsKSkgPyBhbHQgOiBOdW1iZXIodmFsKTtcblx0ICB9LFxuXHQgIC8vIEF0dGVtcHQgdG8gY29udmVydCB0byBzdHJpbmcgYW55IHZhbHVlLCBleGNlcHQgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuXHQgIHN0cmluZzogZnVuY3Rpb24gc3RyaW5nKHZhbCkge1xuXHQgICAgcmV0dXJuIHZhbCA9PT0gdW5kZWZpbmVkIHx8IHZhbCA9PT0gbnVsbCA/ICcnIDogdmFsICsgJyc7XG5cdCAgfSxcblx0ICAvLyBQYXR0ZXJuIGFjY2VwdCBSZWdFeHAsIGZ1bmN0aW9uLCBvciBzdHJpbmcgKGNvbnZlcnRlZCB0byBSZWdFeHApLiBPdGhlcndpc2UgcmV0dXJuIG51bGwuXG5cdCAgcGF0dGVybjogZnVuY3Rpb24gcGF0dGVybih2YWwpIHtcblx0ICAgIHJldHVybiB2YWwgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB2YWwgaW5zdGFuY2VvZiBSZWdFeHAgPyB2YWwgOiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IG5ldyBSZWdFeHAodmFsKSA6IG51bGw7XG5cdCAgfVxuXHR9O1xuXHRcblx0ZnVuY3Rpb24gZ2V0SlNPTih1cmwpIHtcblx0ICB2YXIgcmVxdWVzdCA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblx0ICB2YXIgZGF0YSA9IHt9O1xuXHQgIC8vIHAgKC1zaW11bGF0ZWQtIHByb21pc2UpXG5cdCAgdmFyIHAgPSB7XG5cdCAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKGZuMSwgZm4yKSB7XG5cdCAgICAgIHJldHVybiBwLmRvbmUoZm4xKS5mYWlsKGZuMik7XG5cdCAgICB9LFxuXHQgICAgY2F0Y2g6IGZ1bmN0aW9uIF9jYXRjaChmbikge1xuXHQgICAgICByZXR1cm4gcC5mYWlsKGZuKTtcblx0ICAgIH0sXG5cdCAgICBhbHdheXM6IGZ1bmN0aW9uIGFsd2F5cyhmbikge1xuXHQgICAgICByZXR1cm4gcC5kb25lKGZuKS5mYWlsKGZuKTtcblx0ICAgIH1cblx0ICB9O1xuXHQgIFsnZG9uZScsICdmYWlsJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuXHQgICAgZGF0YVtuYW1lXSA9IFtdO1xuXHQgICAgcFtuYW1lXSA9IGZ1bmN0aW9uIChmbikge1xuXHQgICAgICBpZiAoZm4gaW5zdGFuY2VvZiBGdW5jdGlvbikgZGF0YVtuYW1lXS5wdXNoKGZuKTtcblx0ICAgICAgcmV0dXJuIHA7XG5cdCAgICB9O1xuXHQgIH0pO1xuXHQgIHAuZG9uZShKU09OLnBhcnNlKTtcblx0ICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgPT09IDQpIHtcblx0ICAgICAgdmFyIHJlc3BvbnNlO1xuXHQgICAgICB2YXIgaTtcblx0ICAgICAgdmFyIHZhbHVlO1xuXHRcblx0ICAgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgZSA9IHsgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyB9O1xuXHQgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG5cdCAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICByZXNwb25zZSA9IHJlcXVlc3QucmVzcG9uc2VUZXh0O1xuXHRcblx0ICAgICAgICAgICAgZm9yIChpIGluIGRhdGEuZG9uZSkge1xuXHQgICAgICAgICAgICAgIHZhbHVlID0gZGF0YS5kb25lW2ldKHJlc3BvbnNlKTtcblx0XG5cdCAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgZGF0YS5mYWlsLmZvckVhY2goZnVuY3Rpb24gKGZhaWwpIHtcblx0ICAgICAgICAgICAgICByZXR1cm4gZmFpbChlcnIpO1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgZGF0YS5mYWlsLmZvckVhY2goZnVuY3Rpb24gKGZhaWwpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhaWwoZSk7XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pKCk7XG5cdCAgICB9XG5cdCAgfTtcblx0ICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHVybCk7XG5cdCAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuXHQgIHJlcXVlc3Quc2VuZCgpO1xuXHQgIHJldHVybiBwO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBnZXRTY3JvbGxCYXJXaWR0aCgpIHtcblx0ICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCA8PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7XG5cdCAgICByZXR1cm4gMDtcblx0ICB9XG5cdCAgdmFyIGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuXHQgIGlubmVyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuXHQgIGlubmVyLnN0eWxlLmhlaWdodCA9ICcyMDBweCc7XG5cdFxuXHQgIHZhciBvdXRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHQgIG91dGVyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0ICBvdXRlci5zdHlsZS50b3AgPSAnMHB4Jztcblx0ICBvdXRlci5zdHlsZS5sZWZ0ID0gJzBweCc7XG5cdCAgb3V0ZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuXHQgIG91dGVyLnN0eWxlLndpZHRoID0gJzIwMHB4Jztcblx0ICBvdXRlci5zdHlsZS5oZWlnaHQgPSAnMTUwcHgnO1xuXHQgIG91dGVyLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XG5cdCAgb3V0ZXIuYXBwZW5kQ2hpbGQoaW5uZXIpO1xuXHRcblx0ICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyKTtcblx0ICB2YXIgdzEgPSBpbm5lci5vZmZzZXRXaWR0aDtcblx0ICBvdXRlci5zdHlsZS5vdmVyZmxvdyA9ICdzY3JvbGwnO1xuXHQgIHZhciB3MiA9IGlubmVyLm9mZnNldFdpZHRoO1xuXHQgIGlmICh3MSA9PT0gdzIpIHcyID0gb3V0ZXIuY2xpZW50V2lkdGg7XG5cdFxuXHQgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQob3V0ZXIpO1xuXHRcblx0ICByZXR1cm4gdzEgLSB3Mjtcblx0fVxuXHRcblx0Ly8gcmV0dXJuIGFsbCB0aGUgdHJhbnNsYXRpb25zIG9yIHRoZSBkZWZhdWx0IGxhbmd1YWdlIChlbmdsaXNoKVxuXHRmdW5jdGlvbiB0cmFuc2xhdGlvbnMoKSB7XG5cdCAgdmFyIGxhbmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdlbic7XG5cdFxuXHQgIHZhciB0ZXh0ID0ge1xuXHQgICAgZGF5c09mV2VlazogWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddLFxuXHQgICAgbGltaXQ6ICdMaW1pdCByZWFjaGVkICh7e2xpbWl0fX0gaXRlbXMgbWF4KS4nLFxuXHQgICAgbG9hZGluZzogJ0xvYWRpbmcuLi4nLFxuXHQgICAgbWluTGVuZ3RoOiAnTWluLiBMZW5ndGgnLFxuXHQgICAgbW9udGhzOiBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXSxcblx0ICAgIG5vdFNlbGVjdGVkOiAnTm90aGluZyBTZWxlY3RlZCcsXG5cdCAgICByZXF1aXJlZDogJ1JlcXVpcmVkJyxcblx0ICAgIHNlYXJjaDogJ1NlYXJjaCdcblx0ICB9O1xuXHQgIHJldHVybiB3aW5kb3cuVnVlU3RyYXBMYW5nID8gd2luZG93LlZ1ZVN0cmFwTGFuZyhsYW5nKSA6IHRleHQ7XG5cdH1cblx0XG5cdC8vIGRlbGF5ZXI6IHNldCBhIGZ1bmN0aW9uIHRoYXQgZXhlY3V0ZSBhZnRlciBhIGRlbGF5XG5cdC8vIEBwYXJhbXMgKGZ1bmN0aW9uLCBkZWxheV9wcm9wIG9yIHZhbHVlLCBkZWZhdWx0X3ZhbHVlKVxuXHRmdW5jdGlvbiBkZWxheWVyKGZuLCB2YXJUaW1lcikge1xuXHQgIHZhciBpZk5hTiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogMTAwO1xuXHRcblx0ICBmdW5jdGlvbiB0b0ludChlbCkge1xuXHQgICAgcmV0dXJuICgvXlswLTldKyQvLnRlc3QoZWwpID8gTnVtYmVyKGVsKSB8fCAxIDogbnVsbFxuXHQgICAgKTtcblx0ICB9XG5cdCAgdmFyIHRpbWVySWQ7XG5cdCAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcblx0ICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcblx0ICAgIH1cblx0XG5cdCAgICBpZiAodGltZXJJZCkgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuXHQgICAgdGltZXJJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICBmbi5hcHBseShfdGhpcywgYXJncyk7XG5cdCAgICB9LCB0b0ludCh2YXJUaW1lcikgfHwgdG9JbnQodGhpc1t2YXJUaW1lcl0pIHx8IGlmTmFOKTtcblx0ICB9O1xuXHR9XG5cdFxuXHQvLyBGaXggYSB2dWUgaW5zdGFuY2UgTGlmZWN5Y2xlIHRvIHZ1ZSAxLzIgKGp1c3QgdGhlIGJhc2ljIGVsZW1lbnRzLCBpcyBub3QgYSByZWFsIHBhcnNlciwgc28gdGhpcyB3b3JrIG9ubHkgaWYgeW91ciBjb2RlIGlzIGNvbXBhdGlibGUgd2l0aCBib3RoKVxuXHQvLyAoV2FpdGluZyBmb3IgdGVzdGluZylcblx0ZnVuY3Rpb24gVnVlRml4ZXIodnVlKSB7XG5cdCAgdmFyIHZ1ZTIgPSAhd2luZG93LlZ1ZSB8fCAhd2luZG93LlZ1ZS5wYXJ0aWFsO1xuXHQgIHZhciBtaXhpbiA9IHtcblx0ICAgIGNvbXB1dGVkOiB7XG5cdCAgICAgIHZ1ZTI6IGZ1bmN0aW9uIHZ1ZTIoKSB7XG5cdCAgICAgICAgcmV0dXJuICF0aGlzLiRkaXNwYXRjaDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH07XG5cdCAgaWYgKCF2dWUyKSB7XG5cdCAgICAvL3RyYW5zbGF0ZSB2dWUyIGF0dHJpYnV0ZXMgdG8gdnVlMVxuXHQgICAgaWYgKHZ1ZS5iZWZvcmVDcmVhdGUpIHtcblx0ICAgICAgbWl4aW4uY3JlYXRlID0gdnVlLmJlZm9yZUNyZWF0ZTtcblx0ICAgICAgZGVsZXRlIHZ1ZS5iZWZvcmVDcmVhdGU7XG5cdCAgICB9XG5cdCAgICBpZiAodnVlLmJlZm9yZU1vdW50KSB7XG5cdCAgICAgIHZ1ZS5iZWZvcmVDb21waWxlID0gdnVlLmJlZm9yZU1vdW50O1xuXHQgICAgICBkZWxldGUgdnVlLmJlZm9yZU1vdW50O1xuXHQgICAgfVxuXHQgICAgaWYgKHZ1ZS5tb3VudGVkKSB7XG5cdCAgICAgIHZ1ZS5yZWFkeSA9IHZ1ZS5tb3VudGVkO1xuXHQgICAgICBkZWxldGUgdnVlLm1vdW50ZWQ7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIC8vdHJhbnNsYXRlIHZ1ZTEgYXR0cmlidXRlcyB0byB2dWUyXG5cdCAgICBpZiAodnVlLmJlZm9yZUNvbXBpbGUpIHtcblx0ICAgICAgdnVlLmJlZm9yZU1vdW50ID0gdnVlLmJlZm9yZUNvbXBpbGU7XG5cdCAgICAgIGRlbGV0ZSB2dWUuYmVmb3JlQ29tcGlsZTtcblx0ICAgIH1cblx0ICAgIGlmICh2dWUuY29tcGlsZWQpIHtcblx0ICAgICAgbWl4aW4uY29tcGlsZWQgPSB2dWUuY29tcGlsZWQ7XG5cdCAgICAgIGRlbGV0ZSB2dWUuY29tcGlsZWQ7XG5cdCAgICB9XG5cdCAgICBpZiAodnVlLnJlYWR5KSB7XG5cdCAgICAgIHZ1ZS5tb3VudGVkID0gdnVlLnJlYWR5O1xuXHQgICAgICBkZWxldGUgdnVlLnJlYWR5O1xuXHQgICAgfVxuXHQgIH1cblx0ICBpZiAoIXZ1ZS5taXhpbnMpIHtcblx0ICAgIHZ1ZS5taXhpbnMgPSBbXTtcblx0ICB9XG5cdCAgdnVlLm1peGlucy51bnNoaWZ0KG1peGluKTtcblx0ICByZXR1cm4gdnVlO1xuXHR9XG5cbi8qKiovIH0sXG4vKiA2NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKHByb2Nlc3MpIHsndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0LyoqXHJcblx0ICogQ2xpY2sgb3V0c2lkZSBkaXJlY3RpdmVcclxuXHQgKi9cblx0dmFyIGJpbmRlZCA9IFtdO1xuXHRcblx0ZnVuY3Rpb24gaGFuZGxlcihlKSB7XG5cdCAgYmluZGVkLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG5cdCAgICBpZiAoIWVsLm5vZGUuY29udGFpbnMoZS50YXJnZXQpKSBlbC5jYWxsYmFjayhlKTtcblx0ICB9KTtcblx0fVxuXHRcblx0ZnVuY3Rpb24gYWRkTGlzdGVuZXIobm9kZSwgY2FsbGJhY2spIHtcblx0ICBpZiAoIWJpbmRlZC5sZW5ndGgpIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlciwgZmFsc2UpO1xuXHQgIGJpbmRlZC5wdXNoKHsgbm9kZTogbm9kZSwgY2FsbGJhY2s6IGNhbGxiYWNrIH0pO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihub2RlLCBjYWxsYmFjaykge1xuXHQgIGJpbmRlZCA9IGJpbmRlZC5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG5cdCAgICByZXR1cm4gZWwubm9kZSAhPT0gbm9kZSA/IHRydWUgOiAhY2FsbGJhY2sgPyBmYWxzZSA6IGVsLmNhbGxiYWNrICE9PSBjYWxsYmFjaztcblx0ICB9KTtcblx0ICBpZiAoIWJpbmRlZC5sZW5ndGgpIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlciwgZmFsc2UpO1xuXHR9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgYmluZDogZnVuY3Rpb24gYmluZChlbCwgYmluZGluZykge1xuXHQgICAgcmVtb3ZlTGlzdGVuZXIoZWwsIGJpbmRpbmcudmFsdWUpO1xuXHQgICAgaWYgKHR5cGVvZiBiaW5kaW5nLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG5cdCAgICAgICAgVnVlLnV0aWwud2FybignQ2xpY2tPdXRzaWRlIG9ubHkgd29yayB3aXRoIGEgZnVuY3Rpb24sIHJlY2VpdmVkOiB2LScgKyBiaW5kaW5nLm5hbWUgKyAnPVwiJyArIGJpbmRpbmcuZXhwcmVzc2lvbiArICdcIicpO1xuXHQgICAgICB9XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBhZGRMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShlbCwgYmluZGluZykge1xuXHQgICAgaWYgKGJpbmRpbmcudmFsdWUgIT09IGJpbmRpbmcub2xkVmFsdWUpIHtcblx0ICAgICAgcmVtb3ZlTGlzdGVuZXIoZWwsIGJpbmRpbmcub2xkVmFsdWUpO1xuXHQgICAgICBhZGRMaXN0ZW5lcihlbCwgYmluZGluZy52YWx1ZSk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB1bmJpbmQ6IGZ1bmN0aW9uIHVuYmluZChlbCwgYmluZGluZykge1xuXHQgICAgcmVtb3ZlTGlzdGVuZXIoZWwsIGJpbmRpbmcudmFsdWUpO1xuXHQgIH1cblx0fTtcblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oNjcpKSlcblxuLyoqKi8gfSxcbi8qIDY3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblx0dmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXHRcblx0Ly8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG5cdC8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuXHQvLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG5cdC8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cdFxuXHR2YXIgY2FjaGVkU2V0VGltZW91dDtcblx0dmFyIGNhY2hlZENsZWFyVGltZW91dDtcblx0XG5cdGZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcblx0fVxuXHRmdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG5cdH1cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIHRyeSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuXHQgICAgICAgIH1cblx0ICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG5cdCAgICB9XG5cdH0gKCkpXG5cdGZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG5cdCAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuXHQgICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuXHQgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgICB9XG5cdCAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXHQgICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG5cdCAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG5cdCAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuXHQgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgICB9IGNhdGNoKGUpe1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG5cdCAgICAgICAgfSBjYXRjaChlKXtcblx0ICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3Jcblx0ICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0XG5cdFxuXHR9XG5cdGZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcblx0ICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuXHQgICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuXHQgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH1cblx0ICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcblx0ICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuXHQgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcblx0ICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgICB9XG5cdCAgICB0cnkge1xuXHQgICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3Ncblx0ICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgICB9IGNhdGNoIChlKXtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGUpe1xuXHQgICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cblx0ICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdFxuXHRcblx0XG5cdH1cblx0dmFyIHF1ZXVlID0gW107XG5cdHZhciBkcmFpbmluZyA9IGZhbHNlO1xuXHR2YXIgY3VycmVudFF1ZXVlO1xuXHR2YXIgcXVldWVJbmRleCA9IC0xO1xuXHRcblx0ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuXHQgICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgZHJhaW5pbmcgPSBmYWxzZTtcblx0ICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuXHQgICAgfVxuXHQgICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuXHQgICAgICAgIGRyYWluUXVldWUoKTtcblx0ICAgIH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcblx0ICAgIGlmIChkcmFpbmluZykge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuXHQgICAgZHJhaW5pbmcgPSB0cnVlO1xuXHRcblx0ICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG5cdCAgICB3aGlsZShsZW4pIHtcblx0ICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcblx0ICAgICAgICBxdWV1ZSA9IFtdO1xuXHQgICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcblx0ICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuXHQgICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcblx0ICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG5cdCAgICB9XG5cdCAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuXHQgICAgZHJhaW5pbmcgPSBmYWxzZTtcblx0ICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0fVxuXHRcblx0cHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcblx0ICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcblx0ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG5cdCAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuXHQgICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG5cdCAgICB9XG5cdH07XG5cdFxuXHQvLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5cdGZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuXHQgICAgdGhpcy5mdW4gPSBmdW47XG5cdCAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG5cdH1cblx0SXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG5cdH07XG5cdHByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5cdHByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5cdHByb2Nlc3MuZW52ID0ge307XG5cdHByb2Nlc3MuYXJndiA9IFtdO1xuXHRwcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcblx0cHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXHRcblx0ZnVuY3Rpb24gbm9vcCgpIHt9XG5cdFxuXHRwcm9jZXNzLm9uID0gbm9vcDtcblx0cHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5cdHByb2Nlc3Mub25jZSA9IG5vb3A7XG5cdHByb2Nlc3Mub2ZmID0gbm9vcDtcblx0cHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5cdHByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcblx0cHJvY2Vzcy5lbWl0ID0gbm9vcDtcblx0XG5cdHByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG5cdH07XG5cdFxuXHRwcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xuXHRwcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcblx0fTtcblx0cHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG4vKioqLyB9LFxuLyogNjggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqLyhmdW5jdGlvbihwcm9jZXNzKSB7J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8qKlxyXG5cdCAqIENsaWNrIG91dHNpZGUgZGlyZWN0aXZlXHJcblx0ICovXG5cdHZhciBIQU5ETEVSID0gJ192dWVfc2Nyb2xsX2hhbmRsZXInO1xuXHR2YXIgZXZlbnRzID0gWydyZXNpemUnLCAnc2Nyb2xsJ107XG5cdFxuXHRmdW5jdGlvbiBiaW5kKGVsLCBiaW5kaW5nKSB7XG5cdCAgdW5iaW5kKGVsKTtcblx0XG5cdCAgdmFyIGNhbGxiYWNrID0gYmluZGluZy52YWx1ZTtcblx0ICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuXHQgICAgICBWdWUudXRpbC53YXJuKCdDbGlja091dHNpZGUgb25seSB3b3JrIHdpdGggYSBmdW5jdGlvbiB2YWx1ZSwgcmVjZWl2ZWQ6IHYtJyArIGJpbmRpbmcubmFtZSArICc9XCInICsgYmluZGluZy5leHByZXNzaW9uICsgJ1wiJyk7XG5cdCAgICB9XG5cdCAgfSBlbHNlIHtcblx0ICAgIGVsW0hBTkRMRVJdID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgY2FsbGJhY2soZSk7XG5cdCAgICB9O1xuXHQgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZSwgZWxbSEFORExFUl0sIGZhbHNlKTtcblx0ICAgIH0pO1xuXHQgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGVsW0hBTkRMRVJdLCBmYWxzZSk7XG5cdCAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgZWxbSEFORExFUl0oKTtcblx0ICAgIH0sIDApO1xuXHQgIH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gdW5iaW5kKGVsKSB7XG5cdCAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcblx0ICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGUsIGVsW0hBTkRMRVJdLCBmYWxzZSk7XG5cdCAgfSk7XG5cdCAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIGVsW0hBTkRMRVJdLCBmYWxzZSk7XG5cdCAgZGVsZXRlIGVsW0hBTkRMRVJdO1xuXHR9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgYmluZDogYmluZCxcblx0ICB1bmJpbmQ6IHVuYmluZCxcblx0ICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShlbCwgYmluZGluZykge1xuXHQgICAgaWYgKGJpbmRpbmcudmFsdWUgIT09IGJpbmRpbmcub2xkVmFsdWUpIGJpbmQoZWwsIGJpbmRpbmcpO1xuXHQgIH1cblx0fTtcblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oNjcpKSlcblxuLyoqKi8gfSxcbi8qIDY5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEFjY29yZGlvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtZDRiNzVhOTJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWQ0Yjc1YTkyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQWNjb3JkaW9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDcwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgdHlwZToge1xuXHQgICAgICB0eXBlOiBTdHJpbmcsXG5cdCAgICAgIGRlZmF1bHQ6IG51bGxcblx0ICAgIH0sXG5cdCAgICBvbmVBdEF0aW1lOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IGZhbHNlXG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBvcGVuQ2hpbGQ6IGZ1bmN0aW9uIG9wZW5DaGlsZChjaGlsZCkge1xuXHQgICAgICBpZiAodGhpcy5vbmVBdEF0aW1lKSB7XG5cdCAgICAgICAgdGhpcy4kY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuXHQgICAgICAgICAgaWYgKGNoaWxkICE9PSBpdGVtKSB7XG5cdCAgICAgICAgICAgIGl0ZW0ub3BlbiA9IGZhbHNlO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5faXNBY2NvcmRpb24gPSB0cnVlO1xuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDcxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLWdyb3VwXCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LWQ0Yjc1YTkyXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogNzIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzMpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNzQpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQWZmaXgudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTVlYmRkZWJmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi01ZWJkZGViZlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEFmZml4LnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDczICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfU2Nyb2xsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2OCk7XG5cdFxuXHR2YXIgX1Njcm9sbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TY3JvbGwpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBkaXJlY3RpdmVzOiB7XG5cdCAgICBTY3JvbGw6IF9TY3JvbGwyLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICBvZmZzZXQ6IHtcblx0ICAgICAgdHlwZTogTnVtYmVyLFxuXHQgICAgICBkZWZhdWx0OiAwXG5cdCAgICB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgYWZmaXhlZDogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHRvcDogZnVuY3Rpb24gdG9wKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5vZmZzZXQgPiAwID8gdGhpcy5vZmZzZXQgKyAncHgnIDogbnVsbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIC8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9ibG9iL21hc3Rlci9jb21wb25lbnRzL2FmZml4L2luZGV4LmpzeCNMMjBcblx0ICAgIGNoZWNrU2Nyb2xsOiBmdW5jdGlvbiBjaGVja1Njcm9sbCgpIHtcblx0ICAgICAgLy8gaWYgaXMgaGlkZGVuIGRvbid0IGNhbGN1bGF0ZSBhbnl0aGluZ1xuXHQgICAgICBpZiAoISh0aGlzLiRlbC5vZmZzZXRXaWR0aCB8fCB0aGlzLiRlbC5vZmZzZXRIZWlnaHQgfHwgdGhpcy4kZWwuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIC8vIGdldCB3aW5kb3cgc2Nyb2xsIGFuZCBlbGVtZW50IHBvc2l0aW9uIHRvIGRldGVjdCBpZiBoYXZlIHRvIGJlIG5vcm1hbCBvciBhZmZpeGVkXG5cdCAgICAgIHZhciBzY3JvbGwgPSB7fTtcblx0ICAgICAgdmFyIGVsZW1lbnQgPSB7fTtcblx0ICAgICAgdmFyIHJlY3QgPSB0aGlzLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0ICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXHQgICAgICB2YXIgX2FyciA9IFsnVG9wJywgJ0xlZnQnXTtcblx0ICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IF9hcnIubGVuZ3RoOyBfaSsrKSB7XG5cdCAgICAgICAgdmFyIHR5cGUgPSBfYXJyW19pXTtcblx0ICAgICAgICB2YXIgdCA9IHR5cGUudG9Mb3dlckNhc2UoKTtcblx0ICAgICAgICB2YXIgcmV0ID0gd2luZG93WydwYWdlJyArICh0eXBlID09PSAnVG9wJyA/ICdZJyA6ICdYJykgKyAnT2Zmc2V0J107XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9ICdzY3JvbGwnICsgdHlwZTtcblx0ICAgICAgICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcblx0ICAgICAgICAgIC8vIGllNiw3LDggc3RhbmRhcmQgbW9kZVxuXHQgICAgICAgICAgcmV0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W21ldGhvZF07XG5cdCAgICAgICAgICBpZiAodHlwZW9mIHJldCAhPT0gJ251bWJlcicpIHtcblx0ICAgICAgICAgICAgLy8gcXVpcmtzIG1vZGVcblx0ICAgICAgICAgICAgcmV0ID0gZG9jdW1lbnQuYm9keVttZXRob2RdO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBzY3JvbGxbdF0gPSByZXQ7XG5cdCAgICAgICAgZWxlbWVudFt0XSA9IHNjcm9sbFt0XSArIHJlY3RbdF0gLSAodGhpcy4kZWxbJ2NsaWVudCcgKyB0eXBlXSB8fCBib2R5WydjbGllbnQnICsgdHlwZV0gfHwgMCk7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIGZpeCA9IHNjcm9sbC50b3AgPiBlbGVtZW50LnRvcCAtIHRoaXMub2Zmc2V0O1xuXHQgICAgICBpZiAodGhpcy5hZmZpeGVkICE9PSBmaXgpIHtcblx0ICAgICAgICB0aGlzLmFmZml4ZWQgPSBmaXg7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiA3NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJoaWRkZW4tcHJpbnQgaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG5cdCAgfSwgW192bS5fYygnbmF2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzY3JvbGxcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNjcm9sbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jaGVja1Njcm9sbCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY2hlY2tTY3JvbGxcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJicy1kb2NzLXNpZGViYXJcIixcblx0ICAgIGNsYXNzOiB7XG5cdCAgICAgIGFmZml4OiBfdm0uYWZmaXhlZFxuXHQgICAgfSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICBtYXJnaW5Ub3A6IF92bS50b3Bcblx0ICAgIH0pXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTVlYmRkZWJmXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogNzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oNzYpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MClcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4MSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxBbGVydC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtYWY3YzFmNmFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWFmN2MxZjZhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQWxlcnQudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogNzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc3KTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1hZjdjMWY2YSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQWxlcnQudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1hZjdjMWY2YSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQWxlcnQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogNzcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmZhZGUtZW50ZXItYWN0aXZlLFxcclxcbi5mYWRlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBvcGFjaXR5IC4zcyBlYXNlO1xcbn1cXG4uZmFkZS1lbnRlcixcXHJcXG4uZmFkZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgaGVpZ2h0OiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXG59XFxuLmFsZXJ0LnRvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDMwcHg7XFxyXFxuICBtYXJnaW46IDAgYXV0bztcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIHotaW5kZXg6IDEwNTA7XFxufVxcbi5hbGVydC50b3AtcmlnaHQge1xcclxcbiAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgdG9wOiAzMHB4O1xcclxcbiAgcmlnaHQ6IDUwcHg7XFxyXFxuICB6LWluZGV4OiAxMDUwO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0FsZXJ0LnZ1ZT83MWE5MWMxYVwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBb0RBOztFQUVBLDZCQUFBO0NBQ0E7QUFDQTs7RUFFQSxVQUFBO0VBQ0EsV0FBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtFQUNBLFVBQUE7RUFDQSxlQUFBO0VBQ0EsUUFBQTtFQUNBLFNBQUE7RUFDQSxjQUFBO0NBQ0E7QUFDQTtFQUNBLGdCQUFBO0VBQ0EsVUFBQTtFQUNBLFlBQUE7RUFDQSxjQUFBO0NBQ0FcIixcImZpbGVcIjpcIkFsZXJ0LnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8dHJhbnNpdGlvbiBuYW1lPVxcXCJmYWRlXFxcIj5cXHJcXG4gICAgPGRpdiB2LXNob3c9XFxcInZhbFxcXCIgOmNsYXNzPVxcXCJbJ2FsZXJ0JywgJ2FsZXJ0LScrdHlwZSwgcGxhY2VtZW50XVxcXCIgOnN0eWxlPVxcXCJ7d2lkdGg6d2lkdGh9XFxcIiByb2xlPVxcXCJhbGVydFxcXCI+XFxyXFxuICAgICAgPGJ1dHRvbiB2LXNob3c9XFxcImRpc21pc3NhYmxlXFxcIiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJ2YWwgPSBmYWxzZVxcXCI+XFxyXFxuICAgICAgICA8c3Bhbj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgIDwvYnV0dG9uPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L3RyYW5zaXRpb24+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Y29lcmNlLCBkZWxheWVyfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xcclxcblxcclxcbnZhciBEVVJBVElPTiA9IDBcXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBkaXNtaXNzYWJsZToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZHVyYXRpb246IHtkZWZhdWx0OiBEVVJBVElPTn0sXFxyXFxuICAgIHBsYWNlbWVudDoge3R5cGU6IFN0cmluZ30sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICB2YWx1ZToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcXHJcXG4gICAgd2lkdGg6IHt0eXBlOiBTdHJpbmd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgdmFsOiB0aGlzLnZhbHVlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBkdXJhdGlvbk51bSAoKSB7IHJldHVybiBjb2VyY2UubnVtYmVyKHRoaXMuZHVyYXRpb24sIERVUkFUSU9OKSB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgdmFsICh2YWwpIHtcXHJcXG4gICAgICBpZiAodmFsICYmIHRoaXMuZHVyYXRpb25OdW0gPiAwKSB7IHRoaXMuX2RlbGF5Q2xvc2UoKSB9XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB2YWxcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5fZGVsYXlDbG9zZSA9IGRlbGF5ZXIoZnVuY3Rpb24gKCkge1xcclxcbiAgICAgIHRoaXMudmFsID0gZmFsc2VcXHJcXG4gICAgfSwgJ2R1cmF0aW9uTnVtJylcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi5mYWRlLWVudGVyLWFjdGl2ZSxcXHJcXG4uZmFkZS1sZWF2ZS1hY3RpdmUge1xcclxcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuM3MgZWFzZTtcXHJcXG59XFxyXFxuLmZhZGUtZW50ZXIsXFxyXFxuLmZhZGUtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIGhlaWdodDogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxufVxcclxcbi5hbGVydC50b3Age1xcclxcbiAgcG9zaXRpb246IGZpeGVkO1xcclxcbiAgdG9wOiAzMHB4O1xcclxcbiAgbWFyZ2luOiAwIGF1dG87XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICB6LWluZGV4OiAxMDUwO1xcclxcbn1cXHJcXG4uYWxlcnQudG9wLXJpZ2h0IHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMzBweDtcXHJcXG4gIHJpZ2h0OiA1MHB4O1xcclxcbiAgei1pbmRleDogMTA1MDtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDc4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvKlxyXG5cdFx0TUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcclxuXHRcdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcclxuXHQqL1xyXG5cdC8vIGNzcyBiYXNlIGNvZGUsIGluamVjdGVkIGJ5IHRoZSBjc3MtbG9hZGVyXHJcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBsaXN0ID0gW107XHJcblx0XHJcblx0XHQvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXHJcblx0XHRsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XHJcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcclxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaXRlbSA9IHRoaXNbaV07XHJcblx0XHRcdFx0aWYoaXRlbVsyXSkge1xyXG5cdFx0XHRcdFx0cmVzdWx0LnB1c2goXCJAbWVkaWEgXCIgKyBpdGVtWzJdICsgXCJ7XCIgKyBpdGVtWzFdICsgXCJ9XCIpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXN1bHQucHVzaChpdGVtWzFdKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHJlc3VsdC5qb2luKFwiXCIpO1xyXG5cdFx0fTtcclxuXHRcclxuXHRcdC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XHJcblx0XHRsaXN0LmkgPSBmdW5jdGlvbihtb2R1bGVzLCBtZWRpYVF1ZXJ5KSB7XHJcblx0XHRcdGlmKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKVxyXG5cdFx0XHRcdG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsIFwiXCJdXTtcclxuXHRcdFx0dmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcclxuXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR2YXIgaWQgPSB0aGlzW2ldWzBdO1xyXG5cdFx0XHRcdGlmKHR5cGVvZiBpZCA9PT0gXCJudW1iZXJcIilcclxuXHRcdFx0XHRcdGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IoaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0dmFyIGl0ZW0gPSBtb2R1bGVzW2ldO1xyXG5cdFx0XHRcdC8vIHNraXAgYWxyZWFkeSBpbXBvcnRlZCBtb2R1bGVcclxuXHRcdFx0XHQvLyB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCAxMDAlIHBlcmZlY3QgZm9yIHdlaXJkIG1lZGlhIHF1ZXJ5IGNvbWJpbmF0aW9uc1xyXG5cdFx0XHRcdC8vICB3aGVuIGEgbW9kdWxlIGlzIGltcG9ydGVkIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IG1lZGlhIHF1ZXJpZXMuXHJcblx0XHRcdFx0Ly8gIEkgaG9wZSB0aGlzIHdpbGwgbmV2ZXIgb2NjdXIgKEhleSB0aGlzIHdheSB3ZSBoYXZlIHNtYWxsZXIgYnVuZGxlcylcclxuXHRcdFx0XHRpZih0eXBlb2YgaXRlbVswXSAhPT0gXCJudW1iZXJcIiB8fCAhYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xyXG5cdFx0XHRcdFx0aWYobWVkaWFRdWVyeSAmJiAhaXRlbVsyXSkge1xyXG5cdFx0XHRcdFx0XHRpdGVtWzJdID0gbWVkaWFRdWVyeTtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZihtZWRpYVF1ZXJ5KSB7XHJcblx0XHRcdFx0XHRcdGl0ZW1bMl0gPSBcIihcIiArIGl0ZW1bMl0gKyBcIikgYW5kIChcIiArIG1lZGlhUXVlcnkgKyBcIilcIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxpc3QucHVzaChpdGVtKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0XHRyZXR1cm4gbGlzdDtcclxuXHR9O1xyXG5cblxuLyoqKi8gfSxcbi8qIDc5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKlxuXHRcdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG5cdFx0QXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuXHQqL1xuXHR2YXIgc3R5bGVzSW5Eb20gPSB7fSxcblx0XHRtZW1vaXplID0gZnVuY3Rpb24oZm4pIHtcblx0XHRcdHZhciBtZW1vO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBtZW1vID09PSBcInVuZGVmaW5lZFwiKSBtZW1vID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHRcdFx0cmV0dXJuIG1lbW87XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0aXNPbGRJRSA9IG1lbW9pemUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gL21zaWUgWzYtOV1cXGIvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSk7XG5cdFx0fSksXG5cdFx0Z2V0SGVhZEVsZW1lbnQgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBkb2N1bWVudC5oZWFkIHx8IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXTtcblx0XHR9KSxcblx0XHRzaW5nbGV0b25FbGVtZW50ID0gbnVsbCxcblx0XHRzaW5nbGV0b25Db3VudGVyID0gMCxcblx0XHRzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcCA9IFtdO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihsaXN0LCBvcHRpb25zKSB7XG5cdFx0aWYoZmFsc2UpIHtcblx0XHRcdGlmKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0eWxlLWxvYWRlciBjYW5ub3QgYmUgdXNlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xuXHRcdH1cblx0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0Ly8gRm9yY2Ugc2luZ2xlLXRhZyBzb2x1dGlvbiBvbiBJRTYtOSwgd2hpY2ggaGFzIGEgaGFyZCBsaW1pdCBvbiB0aGUgIyBvZiA8c3R5bGU+XG5cdFx0Ly8gdGFncyBpdCB3aWxsIGFsbG93IG9uIGEgcGFnZVxuXHRcdGlmICh0eXBlb2Ygb3B0aW9ucy5zaW5nbGV0b24gPT09IFwidW5kZWZpbmVkXCIpIG9wdGlvbnMuc2luZ2xldG9uID0gaXNPbGRJRSgpO1xuXHRcblx0XHQvLyBCeSBkZWZhdWx0LCBhZGQgPHN0eWxlPiB0YWdzIHRvIHRoZSBib3R0b20gb2YgPGhlYWQ+LlxuXHRcdGlmICh0eXBlb2Ygb3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJ1bmRlZmluZWRcIikgb3B0aW9ucy5pbnNlcnRBdCA9IFwiYm90dG9tXCI7XG5cdFxuXHRcdHZhciBzdHlsZXMgPSBsaXN0VG9TdHlsZXMobGlzdCk7XG5cdFx0YWRkU3R5bGVzVG9Eb20oc3R5bGVzLCBvcHRpb25zKTtcblx0XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG5cdFx0XHR2YXIgbWF5UmVtb3ZlID0gW107XG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xuXHRcdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblx0XHRcdFx0ZG9tU3R5bGUucmVmcy0tO1xuXHRcdFx0XHRtYXlSZW1vdmUucHVzaChkb21TdHlsZSk7XG5cdFx0XHR9XG5cdFx0XHRpZihuZXdMaXN0KSB7XG5cdFx0XHRcdHZhciBuZXdTdHlsZXMgPSBsaXN0VG9TdHlsZXMobmV3TGlzdCk7XG5cdFx0XHRcdGFkZFN0eWxlc1RvRG9tKG5ld1N0eWxlcywgb3B0aW9ucyk7XG5cdFx0XHR9XG5cdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgbWF5UmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciBkb21TdHlsZSA9IG1heVJlbW92ZVtpXTtcblx0XHRcdFx0aWYoZG9tU3R5bGUucmVmcyA9PT0gMCkge1xuXHRcdFx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKylcblx0XHRcdFx0XHRcdGRvbVN0eWxlLnBhcnRzW2pdKCk7XG5cdFx0XHRcdFx0ZGVsZXRlIHN0eWxlc0luRG9tW2RvbVN0eWxlLmlkXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGFkZFN0eWxlc1RvRG9tKHN0eWxlcywgb3B0aW9ucykge1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBpdGVtID0gc3R5bGVzW2ldO1xuXHRcdFx0dmFyIGRvbVN0eWxlID0gc3R5bGVzSW5Eb21baXRlbS5pZF07XG5cdFx0XHRpZihkb21TdHlsZSkge1xuXHRcdFx0XHRkb21TdHlsZS5yZWZzKys7XG5cdFx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdGRvbVN0eWxlLnBhcnRzW2pdKGl0ZW0ucGFydHNbal0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvcig7IGogPCBpdGVtLnBhcnRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0ZG9tU3R5bGUucGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBwYXJ0cyA9IFtdO1xuXHRcdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdHBhcnRzLnB1c2goYWRkU3R5bGUoaXRlbS5wYXJ0c1tqXSwgb3B0aW9ucykpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlc0luRG9tW2l0ZW0uaWRdID0ge2lkOiBpdGVtLmlkLCByZWZzOiAxLCBwYXJ0czogcGFydHN9O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gbGlzdFRvU3R5bGVzKGxpc3QpIHtcblx0XHR2YXIgc3R5bGVzID0gW107XG5cdFx0dmFyIG5ld1N0eWxlcyA9IHt9O1xuXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IGxpc3RbaV07XG5cdFx0XHR2YXIgaWQgPSBpdGVtWzBdO1xuXHRcdFx0dmFyIGNzcyA9IGl0ZW1bMV07XG5cdFx0XHR2YXIgbWVkaWEgPSBpdGVtWzJdO1xuXHRcdFx0dmFyIHNvdXJjZU1hcCA9IGl0ZW1bM107XG5cdFx0XHR2YXIgcGFydCA9IHtjc3M6IGNzcywgbWVkaWE6IG1lZGlhLCBzb3VyY2VNYXA6IHNvdXJjZU1hcH07XG5cdFx0XHRpZighbmV3U3R5bGVzW2lkXSlcblx0XHRcdFx0c3R5bGVzLnB1c2gobmV3U3R5bGVzW2lkXSA9IHtpZDogaWQsIHBhcnRzOiBbcGFydF19KTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0bmV3U3R5bGVzW2lkXS5wYXJ0cy5wdXNoKHBhcnQpO1xuXHRcdH1cblx0XHRyZXR1cm4gc3R5bGVzO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgc3R5bGVFbGVtZW50KSB7XG5cdFx0dmFyIGhlYWQgPSBnZXRIZWFkRWxlbWVudCgpO1xuXHRcdHZhciBsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcCA9IHN0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wW3N0eWxlRWxlbWVudHNJbnNlcnRlZEF0VG9wLmxlbmd0aCAtIDFdO1xuXHRcdGlmIChvcHRpb25zLmluc2VydEF0ID09PSBcInRvcFwiKSB7XG5cdFx0XHRpZighbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3ApIHtcblx0XHRcdFx0aGVhZC5pbnNlcnRCZWZvcmUoc3R5bGVFbGVtZW50LCBoZWFkLmZpcnN0Q2hpbGQpO1xuXHRcdFx0fSBlbHNlIGlmKGxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wLm5leHRTaWJsaW5nKSB7XG5cdFx0XHRcdGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlRWxlbWVudCwgbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AubmV4dFNpYmxpbmcpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpO1xuXHRcdFx0fVxuXHRcdFx0c3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3AucHVzaChzdHlsZUVsZW1lbnQpO1xuXHRcdH0gZWxzZSBpZiAob3B0aW9ucy5pbnNlcnRBdCA9PT0gXCJib3R0b21cIikge1xuXHRcdFx0aGVhZC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgJ2luc2VydEF0Jy4gTXVzdCBiZSAndG9wJyBvciAnYm90dG9tJy5cIik7XG5cdFx0fVxuXHR9XG5cdFxuXHRmdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG5cdFx0c3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcblx0XHR2YXIgaWR4ID0gc3R5bGVFbGVtZW50c0luc2VydGVkQXRUb3AuaW5kZXhPZihzdHlsZUVsZW1lbnQpO1xuXHRcdGlmKGlkeCA+PSAwKSB7XG5cdFx0XHRzdHlsZUVsZW1lbnRzSW5zZXJ0ZWRBdFRvcC5zcGxpY2UoaWR4LCAxKTtcblx0XHR9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKSB7XG5cdFx0dmFyIHN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcblx0XHRzdHlsZUVsZW1lbnQudHlwZSA9IFwidGV4dC9jc3NcIjtcblx0XHRpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucywgc3R5bGVFbGVtZW50KTtcblx0XHRyZXR1cm4gc3R5bGVFbGVtZW50O1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBhZGRTdHlsZShvYmosIG9wdGlvbnMpIHtcblx0XHR2YXIgc3R5bGVFbGVtZW50LCB1cGRhdGUsIHJlbW92ZTtcblx0XG5cdFx0aWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XG5cdFx0XHR2YXIgc3R5bGVJbmRleCA9IHNpbmdsZXRvbkNvdW50ZXIrKztcblx0XHRcdHN0eWxlRWxlbWVudCA9IHNpbmdsZXRvbkVsZW1lbnQgfHwgKHNpbmdsZXRvbkVsZW1lbnQgPSBjcmVhdGVTdHlsZUVsZW1lbnQob3B0aW9ucykpO1xuXHRcdFx0dXBkYXRlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCwgc3R5bGVJbmRleCwgZmFsc2UpO1xuXHRcdFx0cmVtb3ZlID0gYXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsIHN0eWxlRWxlbWVudCwgc3R5bGVJbmRleCwgdHJ1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHN0eWxlRWxlbWVudCA9IGNyZWF0ZVN0eWxlRWxlbWVudChvcHRpb25zKTtcblx0XHRcdHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZUVsZW1lbnQpO1xuXHRcdFx0cmVtb3ZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuXHRcdFx0fTtcblx0XHR9XG5cdFxuXHRcdHVwZGF0ZShvYmopO1xuXHRcblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlU3R5bGUobmV3T2JqKSB7XG5cdFx0XHRpZihuZXdPYmopIHtcblx0XHRcdFx0aWYobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwKVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0dXBkYXRlKG9iaiA9IG5ld09iaik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZW1vdmUoKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cdFxuXHR2YXIgcmVwbGFjZVRleHQgPSAoZnVuY3Rpb24gKCkge1xuXHRcdHZhciB0ZXh0U3RvcmUgPSBbXTtcblx0XG5cdFx0cmV0dXJuIGZ1bmN0aW9uIChpbmRleCwgcmVwbGFjZW1lbnQpIHtcblx0XHRcdHRleHRTdG9yZVtpbmRleF0gPSByZXBsYWNlbWVudDtcblx0XHRcdHJldHVybiB0ZXh0U3RvcmUuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJ1xcbicpO1xuXHRcdH07XG5cdH0pKCk7XG5cdFxuXHRmdW5jdGlvbiBhcHBseVRvU2luZ2xldG9uVGFnKHN0eWxlRWxlbWVudCwgaW5kZXgsIHJlbW92ZSwgb2JqKSB7XG5cdFx0dmFyIGNzcyA9IHJlbW92ZSA/IFwiXCIgOiBvYmouY3NzO1xuXHRcblx0XHRpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcblx0XHRcdHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSByZXBsYWNlVGV4dChpbmRleCwgY3NzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpO1xuXHRcdFx0dmFyIGNoaWxkTm9kZXMgPSBzdHlsZUVsZW1lbnQuY2hpbGROb2Rlcztcblx0XHRcdGlmIChjaGlsZE5vZGVzW2luZGV4XSkgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaW5kZXhdKTtcblx0XHRcdGlmIChjaGlsZE5vZGVzLmxlbmd0aCkge1xuXHRcdFx0XHRzdHlsZUVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNzc05vZGUsIGNoaWxkTm9kZXNbaW5kZXhdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChjc3NOb2RlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGFwcGx5VG9UYWcoc3R5bGVFbGVtZW50LCBvYmopIHtcblx0XHR2YXIgY3NzID0gb2JqLmNzcztcblx0XHR2YXIgbWVkaWEgPSBvYmoubWVkaWE7XG5cdFx0dmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG5cdFxuXHRcdGlmIChtZWRpYSkge1xuXHRcdFx0c3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIG1lZGlhKTtcblx0XHR9XG5cdFxuXHRcdGlmIChzb3VyY2VNYXApIHtcblx0XHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZGV2dG9vbHMvZG9jcy9qYXZhc2NyaXB0LWRlYnVnZ2luZ1xuXHRcdFx0Ly8gdGhpcyBtYWtlcyBzb3VyY2UgbWFwcyBpbnNpZGUgc3R5bGUgdGFncyB3b3JrIHByb3Blcmx5IGluIENocm9tZVxuXHRcdFx0Y3NzICs9ICdcXG4vKiMgc291cmNlVVJMPScgKyBzb3VyY2VNYXAuc291cmNlc1swXSArICcgKi8nO1xuXHRcdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjY2MDM4NzVcblx0XHRcdGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIgKyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpICsgXCIgKi9cIjtcblx0XHR9XG5cdFxuXHRcdGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuXHRcdFx0c3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0d2hpbGUoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcblx0XHRcdFx0c3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcblx0XHRcdH1cblx0XHRcdHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcblx0XHR9XG5cdH1cblxuXG4vKioqLyB9LFxuLyogODAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIERVUkFUSU9OID0gMDsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzbWlzc2FibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGR1cmF0aW9uOiB7IGRlZmF1bHQ6IERVUkFUSU9OIH0sXG5cdCAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuXHQgICAgd2lkdGg6IHsgdHlwZTogU3RyaW5nIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWw6IHRoaXMudmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGR1cmF0aW9uTnVtOiBmdW5jdGlvbiBkdXJhdGlvbk51bSgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UubnVtYmVyKHRoaXMuZHVyYXRpb24sIERVUkFUSU9OKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsKSB7XG5cdCAgICAgIGlmIChfdmFsICYmIHRoaXMuZHVyYXRpb25OdW0gPiAwKSB7XG5cdCAgICAgICAgdGhpcy5fZGVsYXlDbG9zZSgpO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgX3ZhbCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5fZGVsYXlDbG9zZSA9ICgwLCBfdXRpbHMuZGVsYXllcikoZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLnZhbCA9IGZhbHNlO1xuXHQgICAgfSwgJ2R1cmF0aW9uTnVtJyk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogODEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImZhZGVcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIGNsYXNzOiBbJ2FsZXJ0JywgJ2FsZXJ0LScgKyBfdm0udHlwZSwgX3ZtLnBsYWNlbWVudF0sXG5cdCAgICBzdHlsZTogKHtcblx0ICAgICAgd2lkdGg6IF92bS53aWR0aFxuXHQgICAgfSksXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJhbGVydFwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmRpc21pc3NhYmxlKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJkaXNtaXNzYWJsZVwiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNsb3NlXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInR5cGVcIjogXCJidXR0b25cIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbCA9IGZhbHNlXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywgW192bS5fdihcIsOXXCIpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtYWY3YzFmNmFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiA4MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXyg4Mylcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg1KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDg2KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXEFzaWRlLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0zYTRiZGUyN1wiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtM2E0YmRlMjdcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBBc2lkZS52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiA4MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oODQpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTNhNGJkZTI3IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Bc2lkZS52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTNhNGJkZTI3IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Bc2lkZS52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiA4NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYXNpZGUtb3BlbiB7XFxyXFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcztcXG59XFxuLmFzaWRlLW9wZW4uaGFzLXB1c2gtcmlnaHQge1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zMDBweCk7XFxufVxcbi5hc2lkZSB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICBib3R0b206IDA7XFxyXFxuICB6LWluZGV4OiAxMDQ5O1xcclxcbiAgb3ZlcmZsb3c6IGF1dG87XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcbn1cXG4uYXNpZGUubGVmdCB7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgcmlnaHQ6IGF1dG87XFxufVxcbi5hc2lkZS5yaWdodCB7XFxyXFxuICBsZWZ0OiBhdXRvO1xcclxcbiAgcmlnaHQ6IDA7XFxufVxcbi5zbGlkZWxlZnQtZW50ZXIge1xcclxcbiAgdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO1xcbn1cXG4uc2xpZGVsZWZ0LWVudGVyLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LWluIC4zcztcXG59XFxuLnNsaWRlbGVmdC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlbGVmdC1vdXQgLjNzO1xcbn1cXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1pbiB7XFxuMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG59XFxuQGtleWZyYW1lcyBzbGlkZWxlZnQtb3V0IHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxufVxcbn1cXG4uc2xpZGVyaWdodC1lbnRlci1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtaW4gLjNzO1xcbn1cXG4uc2xpZGVyaWdodC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlcmlnaHQtb3V0IC4zcztcXG59XFxuQGtleWZyYW1lcyBzbGlkZXJpZ2h0LWluIHtcXG4wJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcXHJcXG4gICAgb3BhY2l0eTogMTtcXG59XFxufVxcbkBrZXlmcmFtZXMgc2xpZGVyaWdodC1vdXQge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcbn1cXG59XFxuLmFzaWRlOmZvY3VzIHtcXHJcXG4gICAgb3V0bGluZTogMDtcXG59XFxuQG1lZGlhIChtYXgtd2lkdGg6IDk5MXB4KSB7XFxuLmFzaWRlIHtcXHJcXG4gICAgbWluLXdpZHRoOiAyNDBweDtcXG59XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIge1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XFxyXFxuICBtaW4taGVpZ2h0OiAxNi40M3B4O1xcclxcbiAgcGFkZGluZzogNnB4IDE1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjMzM3YWI3O1xcclxcbiAgY29sb3I6ICNmZmY7XFxufVxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIgLmNsb3NlIHtcXHJcXG4gIG1hcmdpbi1yaWdodDogLThweDtcXHJcXG4gIHBhZGRpbmc6IDRweCA4cHg7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG4gIGZvbnQtc2l6ZTogMjVweDtcXHJcXG4gIG9wYWNpdHk6IC44O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtYm9keSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nOiAxNXB4O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIHtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxyXFxuICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTVlNWU1O1xcbn1cXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMDtcXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWdyb3VwIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogLTFweDtcXG59XFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWJsb2NrKy5idG4tYmxvY2sge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDA7XFxufVxcbi5hc2lkZS1iYWNrZHJvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICB6LWluZGV4OiAxMDQwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2U7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwO1xcbn1cXG4uYXNpZGUtYmFja2Ryb3AuaW4ge1xcclxcbiAgb3BhY2l0eTogLjU7XFxyXFxuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL0FzaWRlLnZ1ZT81NzM5NjIxZlwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBa0ZBO0VBQ0EsMkJBQUE7Q0FDQTtBQUNBO0VBQ0EsOEJBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7RUFDQSxPQUFBO0VBQ0EsVUFBQTtFQUNBLGNBQUE7RUFDQSxlQUFBO0VBQ0EsaUJBQUE7Q0FDQTtBQUNBO0VBQ0EsUUFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7Q0FDQTtBQUNBO0VBQ0EsMkJBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSw2QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EseUJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EsNkJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7Q0FDQTtBQUNBO0VBQ0EsNkJBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSw0QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EseUJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0FBQ0E7SUFDQSx5QkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0EsNEJBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0lBQ0EsV0FBQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLGlCQUFBO0NBQ0E7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7RUFDQSxvQkFBQTtFQUNBLGtCQUFBO0VBQ0Esb0JBQUE7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsaUJBQUE7RUFDQSxZQUFBO0VBQ0EsZ0JBQUE7RUFDQSxZQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxjQUFBO0VBQ0Esa0JBQUE7RUFDQSw4QkFBQTtDQUNBO0FBQ0E7RUFDQSxpQkFBQTtFQUNBLGlCQUFBO0NBQ0E7QUFDQTtFQUNBLGtCQUFBO0NBQ0E7QUFDQTtFQUNBLGVBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7RUFDQSxPQUFBO0VBQ0EsU0FBQTtFQUNBLFVBQUE7RUFDQSxRQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUFDQSw2QkFBQTtFQUNBLHVCQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7RUFDQSwwQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJBc2lkZS52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPHRyYW5zaXRpb24gOm5hbWU9XFxcIidzbGlkZScgKyBwbGFjZW1lbnRcXFwiPlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZVxcXCIgdi1pZj1cXFwic2hvd1xcXCIgOnN0eWxlPVxcXCJ7d2lkdGg6d2lkdGgrJ3B4J31cXFwiIDpjbGFzcz1cXFwicGxhY2VtZW50XFxcIj5cXHJcXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZS1kaWFsb2dcXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXNpZGUtY29udGVudFxcXCI+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImFzaWRlLWhlYWRlclxcXCI+XFxyXFxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPSd0cmlnZ2VyX2Nsb3NlJz48c3Bhbj4mdGltZXM7PC9zcGFuPjwvYnV0dG9uPlxcclxcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwiYXNpZGUtdGl0bGVcXFwiPjxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+e3sgaGVhZGVyIH19PC9zbG90PjwvaDQ+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJhc2lkZS1ib2R5XFxcIj48c2xvdD48L3Nsb3Q+PC9kaXY+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L3RyYW5zaXRpb24+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Z2V0U2Nyb2xsQmFyV2lkdGh9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuaW1wb3J0ICQgZnJvbSAnLi91dGlscy9Ob2RlTGlzdC5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBwbGFjZW1lbnQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdyaWdodCd9LFxcclxcbiAgICBzaG93OiB7dHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWV9LFxcclxcbiAgICB3aWR0aDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMzIwfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIHNob3cgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpXFxyXFxuICAgICAgdGhpcy4kZW1pdCh0aGlzLnNob3cgPyAnb3BlbicgOiAnY2xvc2UnKVxcclxcbiAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5XFxyXFxuICAgICAgY29uc3Qgc2Nyb2xsQmFyV2lkdGggPSBnZXRTY3JvbGxCYXJXaWR0aCgpXFxyXFxuICAgICAgaWYgKHZhbCkge1xcclxcbiAgICAgICAgaWYgKCF0aGlzLl9iYWNrZHJvcCkge1xcclxcbiAgICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnXFxyXFxuICAgICAgICBib2R5LmFwcGVuZENoaWxkKHRoaXMuX2JhY2tkcm9wKVxcclxcbiAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJylcXHJcXG4gICAgICAgIGlmIChzY3JvbGxCYXJXaWR0aCAhPT0gMCkge1xcclxcbiAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoICsgJ3B4J1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgLy8gcmVxdWVzdCBwcm9wZXJ0eSB0aGF0IHJlcXVpcmVzIGxheW91dCB0byBmb3JjZSBhIGxheW91dFxcclxcbiAgICAgICAgdmFyIHggPSB0aGlzLl9iYWNrZHJvcC5jbGllbnRIZWlnaHRcXHJcXG4gICAgICAgIHRoaXMuX2JhY2tkcm9wLmNsYXNzTGlzdC5hZGQoJ2luJylcXHJcXG4gICAgICAgICQodGhpcy5fYmFja2Ryb3ApLm9uKCdjbGljaycsICgpID0+IHRoaXMudHJpZ2dlcl9jbG9zZSgpKVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5vbigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcXHJcXG4gICAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkub2ZmKClcXHJcXG4gICAgICAgICAgdHJ5IHtcXHJcXG4gICAgICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKVxcclxcbiAgICAgICAgICAgIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJzAnXFxyXFxuICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZCh0aGlzLl9iYWNrZHJvcClcXHJcXG4gICAgICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IG51bGxcXHJcXG4gICAgICAgICAgfSBjYXRjaCAoZSkge31cXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnXFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICB0cmlnZ2VyICgpIHtcXHJcXG4gICAgICByZXR1cm4ge1xcclxcbiAgICAgICAgY2xvc2U6ICgpID0+IHRoaXMudHJpZ2dlcl9jbG9zZSgpLFxcclxcbiAgICAgICAgb3BlbjogKCkgPT4gdGhpcy50cmlnZ2VyX29wZW4oKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdHJpZ2dlcl9jbG9zZSAoKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCggJ2Nsb3NlJyApXFxyXFxuICAgIH0sXFxyXFxuICAgIHRyaWdnZXJfb3BlbigpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCAnb3BlbicgKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbW91bnRlZCAoKSB7XFxyXFxuICAgIHRoaXMuJGVtaXQoJ3RyaWdnZXInLCAoKSA9PiB0aGlzLnRyaWdnZXIpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uYXNpZGUtb3BlbiB7XFxyXFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcztcXHJcXG59XFxyXFxuLmFzaWRlLW9wZW4uaGFzLXB1c2gtcmlnaHQge1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zMDBweCk7XFxyXFxufVxcclxcbi5hc2lkZSB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICBib3R0b206IDA7XFxyXFxuICB6LWluZGV4OiAxMDQ5O1xcclxcbiAgb3ZlcmZsb3c6IGF1dG87XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbn1cXHJcXG4uYXNpZGUubGVmdCB7XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgcmlnaHQ6IGF1dG87XFxyXFxufVxcclxcbi5hc2lkZS5yaWdodCB7XFxyXFxuICBsZWZ0OiBhdXRvO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxufVxcclxcbi5zbGlkZWxlZnQtZW50ZXIge1xcclxcbiAgdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO1xcclxcbn1cXHJcXG4uc2xpZGVsZWZ0LWVudGVyLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2xpZGVsZWZ0LWluIC4zcztcXHJcXG59XFxyXFxuLnNsaWRlbGVmdC1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOnNsaWRlbGVmdC1vdXQgLjNzO1xcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1pbiB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSk7XFxyXFxuICAgIG9wYWNpdHk6IDA7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNsaWRlbGVmdC1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLnNsaWRlcmlnaHQtZW50ZXItYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZXJpZ2h0LWluIC4zcztcXHJcXG59XFxyXFxuLnNsaWRlcmlnaHQtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzbGlkZXJpZ2h0LW91dCAuM3M7XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVyaWdodC1pbiB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxufVxcclxcbkBrZXlmcmFtZXMgc2xpZGVyaWdodC1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG4uYXNpZGU6Zm9jdXMge1xcclxcbiAgICBvdXRsaW5lOiAwO1xcclxcbn1cXHJcXG5AbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIHtcXHJcXG4gIC5hc2lkZSB7XFxyXFxuICAgIG1pbi13aWR0aDogMjQwcHg7XFxyXFxuICB9XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIge1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XFxyXFxuICBtaW4taGVpZ2h0OiAxNi40M3B4O1xcclxcbiAgcGFkZGluZzogNnB4IDE1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjMzM3YWI3O1xcclxcbiAgY29sb3I6ICNmZmY7XFxyXFxufVxcclxcbi5hc2lkZSAuYXNpZGUtZGlhbG9nIC5hc2lkZS1oZWFkZXIgLmNsb3NlIHtcXHJcXG4gIG1hcmdpbi1yaWdodDogLThweDtcXHJcXG4gIHBhZGRpbmc6IDRweCA4cHg7XFxyXFxuICBjb2xvcjogI2ZmZjtcXHJcXG4gIGZvbnQtc2l6ZTogMjVweDtcXHJcXG4gIG9wYWNpdHk6IC44O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtYm9keSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nOiAxNXB4O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIHtcXHJcXG4gIHBhZGRpbmc6IDE1cHg7XFxyXFxuICB0ZXh0LWFsaWduOiByaWdodDtcXHJcXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTVlNWU1O1xcclxcbn1cXHJcXG4uYXNpZGUgLmFzaWRlLWRpYWxvZyAuYXNpZGUtZm9vdGVyIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogNXB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMDtcXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWdyb3VwIC5idG4rLmJ0biB7XFxyXFxuICBtYXJnaW4tbGVmdDogLTFweDtcXHJcXG59XFxyXFxuLmFzaWRlIC5hc2lkZS1kaWFsb2cgLmFzaWRlLWZvb3RlciAuYnRuLWJsb2NrKy5idG4tYmxvY2sge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDA7XFxyXFxufVxcclxcbi5hc2lkZS1iYWNrZHJvcCB7XFxyXFxuICBwb3NpdGlvbjogZml4ZWQ7XFxyXFxuICB0b3A6IDA7XFxyXFxuICByaWdodDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIGxlZnQ6IDA7XFxyXFxuICB6LWluZGV4OiAxMDQwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIHRyYW5zaXRpb246IG9wYWNpdHkgLjNzIGVhc2U7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwO1xcclxcbn1cXHJcXG4uYXNpZGUtYmFja2Ryb3AuaW4ge1xcclxcbiAgb3BhY2l0eTogLjU7XFxyXFxuICBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NTApO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogODUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBoZWFkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAncmlnaHQnIH0sXG5cdCAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH0sXG5cdCAgICB3aWR0aDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDMyMCB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyh2YWwsIG9sZCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KHRoaXMuc2hvdyA/ICdvcGVuJyA6ICdjbG9zZScpO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIHZhciBzY3JvbGxCYXJXaWR0aCA9ICgwLCBfdXRpbHMuZ2V0U2Nyb2xsQmFyV2lkdGgpKCk7XG5cdCAgICAgIGlmICh2YWwpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuX2JhY2tkcm9wKSB7XG5cdCAgICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc05hbWUgPSAnYXNpZGUtYmFja2Ryb3AnO1xuXHQgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fYmFja2Ryb3ApO1xuXHQgICAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpO1xuXHQgICAgICAgIGlmIChzY3JvbGxCYXJXaWR0aCAhPT0gMCkge1xuXHQgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBzY3JvbGxCYXJXaWR0aCArICdweCc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIHJlcXVlc3QgcHJvcGVydHkgdGhhdCByZXF1aXJlcyBsYXlvdXQgdG8gZm9yY2UgYSBsYXlvdXRcblx0ICAgICAgICB2YXIgeCA9IHRoaXMuX2JhY2tkcm9wLmNsaWVudEhlaWdodDtcblx0ICAgICAgICB0aGlzLl9iYWNrZHJvcC5jbGFzc0xpc3QuYWRkKCdpbicpO1xuXHQgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRoaXMuX2JhY2tkcm9wKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICByZXR1cm4gX3RoaXMudHJpZ2dlcl9jbG9zZSgpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRoaXMuX2JhY2tkcm9wKS5vbigndHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKF90aGlzLl9iYWNrZHJvcCkub2ZmKCk7XG5cdCAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTtcblx0ICAgICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnMCc7XG5cdCAgICAgICAgICAgIGJvZHkucmVtb3ZlQ2hpbGQoX3RoaXMuX2JhY2tkcm9wKTtcblx0ICAgICAgICAgICAgX3RoaXMuX2JhY2tkcm9wID0gbnVsbDtcblx0ICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lID0gJ2FzaWRlLWJhY2tkcm9wJztcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdHJpZ2dlcjogZnVuY3Rpb24gdHJpZ2dlcigpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpczIudHJpZ2dlcl9jbG9zZSgpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgb3BlbjogZnVuY3Rpb24gb3BlbigpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpczIudHJpZ2dlcl9vcGVuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9O1xuXHQgICAgfSxcblx0ICAgIHRyaWdnZXJfY2xvc2U6IGZ1bmN0aW9uIHRyaWdnZXJfY2xvc2UoKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2Nsb3NlJyk7XG5cdCAgICB9LFxuXHQgICAgdHJpZ2dlcl9vcGVuOiBmdW5jdGlvbiB0cmlnZ2VyX29wZW4oKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ29wZW4nKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgICB0aGlzLiRlbWl0KCd0cmlnZ2VyJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gX3RoaXMzLnRyaWdnZXI7XG5cdCAgICB9KTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiA4NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6ICdzbGlkZScgKyBfdm0ucGxhY2VtZW50XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlXCIsXG5cdCAgICBjbGFzczogX3ZtLnBsYWNlbWVudCxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLndpZHRoICsgJ3B4J1xuXHQgICAgfSlcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJhc2lkZS1kaWFsb2dcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWhlYWRlclwiXG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udHJpZ2dlcl9jbG9zZVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCBbX3ZtLl92KFwiw5dcIildKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2g0Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiYXNpZGUtdGl0bGVcIlxuXHQgIH0sIFtfdm0uX3QoXCJoZWFkZXJcIiwgW192bS5fdihfdm0uX3MoX3ZtLmhlYWRlcikpXSldLCAyKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFzaWRlLWJvZHlcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKV0pXSkgOiBfdm0uX2UoKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTNhNGJkZTI3XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogODcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODgpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oODkpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQnV0dG9uR3JvdXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTEyNWViMGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0xMjVlYjBjOFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEJ1dHRvbkdyb3VwLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDg4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYnV0dG9uczogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBqdXN0aWZpZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZlcnRpY2FsOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICB0aGlzLl9idG5Hcm91cCA9IHRydWU7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB2YWw6IHRoaXMudmFsdWVcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiA4OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczoge1xuXHQgICAgICAnYnRuLWdyb3VwJzogX3ZtLmJ1dHRvbnMsICdidG4tZ3JvdXAtanVzdGlmaWVkJzogX3ZtLmp1c3RpZmllZCwgJ2J0bi1ncm91cC12ZXJ0aWNhbCc6IF92bS52ZXJ0aWNhbFxuXHQgICAgfSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiZGF0YS10b2dnbGVcIjogX3ZtLmJ1dHRvbnMgJiYgJ2J1dHRvbnMnXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0xMjVlYjBjOFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDkwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDkxKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTMpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTQpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQ2Fyb3VzZWwudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRfX3Z1ZV9vcHRpb25zX18uX3Njb3BlSWQgPSBcImRhdGEtdi0zMjJkZWU0MVwiXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzIyZGVlNDFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTMyMmRlZTQxXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQ2Fyb3VzZWwudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogOTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkyKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0zMjJkZWU0MSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2Fyb3VzZWwudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi0zMjJkZWU0MSZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2Fyb3VzZWwudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogOTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLmNhcm91c2VsLWNvbnRyb2xbZGF0YS12LTMyMmRlZTQxXSB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvQ2Fyb3VzZWwudnVlPzJmNDQ2MzQyXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUE0R0E7RUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJDYXJvdXNlbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbjxkaXYgY2xhc3M9XFxcImNhcm91c2VsIHNsaWRlXFxcIiBkYXRhLXJpZGU9XFxcImNhcm91c2VsXFxcIj5cXHJcXG4gIDwhLS0gSW5kaWNhdG9ycyAtLT5cXHJcXG4gIDxvbCBjbGFzcz1cXFwiY2Fyb3VzZWwtaW5kaWNhdG9yc1xcXCIgdi1zaG93PVxcXCJpbmRpY2F0b3JzXFxcIj5cXHJcXG4gICAgPGxpIHYtZm9yPVxcXCIoaW5kaWNhdG9yLGkpIGluIGluZGljYXRvcl9saXN0XFxcIiBAY2xpY2s9XFxcImluZGljYXRvckNsaWNrKGkpXFxcIiA6Y2xhc3M9XFxcInthY3RpdmU6aSA9PT0gaW5kZXh9XFxcIj48c3Bhbj48L3NwYW4+PC9saT5cXHJcXG4gIDwvb2w+XFxyXFxuICA8IS0tIFdyYXBwZXIgZm9yIHNsaWRlcyAtLT5cXHJcXG4gIDxkaXYgY2xhc3M9XFxcImNhcm91c2VsLWlubmVyXFxcIiByb2xlPVxcXCJsaXN0Ym94XFxcIj5cXHJcXG4gICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgPC9kaXY+XFxyXFxuICA8IS0tIENvbnRyb2xzIC0tPlxcclxcbiAgPGRpdiB2LXNob3c9XFxcImNvbnRyb2xzXFxcIiBjbGFzcz1cXFwiY2Fyb3VzZWwtY29udHJvbHMgaGlkZGVuLXhzXFxcIj5cXHJcXG4gICAgPGEgY2xhc3M9XFxcImxlZnQgY2Fyb3VzZWwtY29udHJvbFxcXCIgcm9sZT1cXFwiYnV0dG9uXFxcIiBAY2xpY2s9XFxcInByZXZcXFwiPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tbGVmdFxcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiPjwvc3Bhbj5cXHJcXG4gICAgPC9hPlxcclxcbiAgICA8YSBjbGFzcz1cXFwicmlnaHQgY2Fyb3VzZWwtY29udHJvbFxcXCIgcm9sZT1cXFwiYnV0dG9uXFxcIiBAY2xpY2s9XFxcIm5leHRcXFwiPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tcmlnaHRcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIj48L3NwYW4+XFxyXFxuICAgIDwvYT5cXHJcXG4gIDwvZGl2PlxcclxcbjwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xcclxcbi8vIGxldCBjb2VyY2UgPSB7XFxyXFxuLy8gICBpbnRlcnZhbDogJ251bWJlcidcXHJcXG4vLyB9XFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgaW5kaWNhdG9yczoge1xcclxcbiAgICAgIHR5cGU6IEJvb2xlYW4sXFxyXFxuICAgICAgZGVmYXVsdDogdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICBjb250cm9sczoge1xcclxcbiAgICAgIHR5cGU6IEJvb2xlYW4sXFxyXFxuICAgICAgZGVmYXVsdDogdHJ1ZVxcclxcbiAgICB9LFxcclxcbiAgICBpbnRlcnZhbDoge1xcclxcbiAgICAgIHR5cGU6IE51bWJlcixcXHJcXG4gICAgICBkZWZhdWx0OiA1MDAwXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBpbmRpY2F0b3JfbGlzdDogW10sXFxyXFxuICAgICAgaW5kZXg6IDAsXFxyXFxuICAgICAgaXNBbmltYXRpbmc6IGZhbHNlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBpbmRleCAobmV3VmFsLCBvbGRWYWwpIHtcXHJcXG4gICAgICB0aGlzLnNsaWRlKG5ld1ZhbCA+IG9sZFZhbCA/ICdsZWZ0JyA6ICdyaWdodCcsIG5ld1ZhbCwgb2xkVmFsKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBpbmRpY2F0b3JDbGljayAoaW5kZXgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5pc0FuaW1hdGluZyB8fCB0aGlzLmluZGV4ID09PSBpbmRleCkgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmluZGV4ID0gaW5kZXhcXHJcXG4gICAgfSxcXHJcXG4gICAgc2xpZGUgKGRpcmVjdGlvbiwgbmV4dCwgcHJldikge1xcclxcbiAgICAgIGlmICghdGhpcy4kZWwpIHsgcmV0dXJuIH1cXHJcXG4gICAgICBjb25zdCAkc2xpZGVyID0gJCgnLml0ZW0nLCB0aGlzLiRlbClcXHJcXG4gICAgICBpZiAoISRzbGlkZXIubGVuZ3RoKSB7IHJldHVybiB9XFxyXFxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSAkc2xpZGVyW25leHRdIHx8ICRzbGlkZXJbMF1cXHJcXG4gICAgICAkKHNlbGVjdGVkKS5hZGRDbGFzcyhkaXJlY3Rpb24gPT09ICdsZWZ0JyA/ICduZXh0JyA6ICdwcmV2JylcXHJcXG4gICAgICAvLyByZXF1ZXN0IHByb3BlcnR5IHRoYXQgcmVxdWlyZXMgbGF5b3V0IHRvIGZvcmNlIGEgbGF5b3V0XFxyXFxuICAgICAgdmFyIHggPSBzZWxlY3RlZC5jbGllbnRIZWlnaHRcXHJcXG4gICAgICAkKFskc2xpZGVyW3ByZXZdLCBzZWxlY3RlZF0pLmFkZENsYXNzKGRpcmVjdGlvbikub24oJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB7XFxyXFxuICAgICAgICAkc2xpZGVyLm9mZigndHJhbnNpdGlvbmVuZCcpLmNsYXNzTmFtZSA9ICdpdGVtJ1xcclxcbiAgICAgICAgJChzZWxlY3RlZCkuYWRkQ2xhc3MoJ2FjdGl2ZScpXFxyXFxuICAgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2VcXHJcXG4gICAgICB9KVxcclxcbiAgICB9LFxcclxcbiAgICBuZXh0ICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuJGVsIHx8IHRoaXMuaXNBbmltYXRpbmcpIHsgcmV0dXJuIGZhbHNlIH1cXHJcXG4gICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZVxcclxcbiAgICAgIHRoaXMuaW5kZXggKyAxIDwgJCgnLml0ZW0nLCB0aGlzLiRlbCkubGVuZ3RoID8gdGhpcy5pbmRleCArPSAxIDogdGhpcy5pbmRleCA9IDBcXHJcXG4gICAgfSxcXHJcXG4gICAgcHJldiAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmluZGV4ID09PSAwID8gdGhpcy5pbmRleCA9ICQoJy5pdGVtJywgdGhpcy4kZWwpLmxlbmd0aCAtIDEgOiB0aGlzLmluZGV4IC09IDFcXHJcXG4gICAgfSxcXHJcXG4gICAgdG9nZ2xlSW50ZXJ2YWwgKHZhbCkge1xcclxcbiAgICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgeyB2YWwgPSB0aGlzLl9pbnRlcnZhbElEIH1cXHJcXG4gICAgICBpZih0aGlzLl9pbnRlcnZhbElEKSB7XFxyXFxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsSUQpXFxyXFxuICAgICAgICBkZWxldGUgdGhpcy5faW50ZXJ2YWxJRFxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZih2YWwgJiYgdGhpcy5pbnRlcnZhbCA+IDApIHtcXHJcXG4gICAgICAgIHRoaXMuX2ludGVydmFsSUQgPSBzZXRJbnRlcnZhbCh0aGlzLm5leHQsIHRoaXMuaW50ZXJ2YWwpXFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbW91bnRlZCAoKSB7XFxyXFxuICAgIHRoaXMudG9nZ2xlSW50ZXJ2YWwodHJ1ZSlcXHJcXG4gICAgJCh0aGlzLiRlbCkub24oJ21vdXNlZW50ZXInLCAoKSA9PiB0aGlzLnRvZ2dsZUludGVydmFsKGZhbHNlKSkub24oJ21vdXNlbGVhdmUnLCAoKSA9PiB0aGlzLnRvZ2dsZUludGVydmFsKHRydWUpKVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICB0aGlzLnRvZ2dsZUludGVydmFsKGZhbHNlKVxcclxcbiAgICAkKHRoaXMuJGVsKS5vZmYoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZSBzY29wZWQ+XFxyXFxuLmNhcm91c2VsLWNvbnRyb2wge1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogOTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvLyBsZXQgY29lcmNlID0ge1xuXHQvLyAgIGludGVydmFsOiAnbnVtYmVyJ1xuXHQvLyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGluZGljYXRvcnM6IHtcblx0ICAgICAgdHlwZTogQm9vbGVhbixcblx0ICAgICAgZGVmYXVsdDogdHJ1ZVxuXHQgICAgfSxcblx0ICAgIGNvbnRyb2xzOiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IHRydWVcblx0ICAgIH0sXG5cdCAgICBpbnRlcnZhbDoge1xuXHQgICAgICB0eXBlOiBOdW1iZXIsXG5cdCAgICAgIGRlZmF1bHQ6IDUwMDBcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBpbmRpY2F0b3JfbGlzdDogW10sXG5cdCAgICAgIGluZGV4OiAwLFxuXHQgICAgICBpc0FuaW1hdGluZzogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleChuZXdWYWwsIG9sZFZhbCkge1xuXHQgICAgICB0aGlzLnNsaWRlKG5ld1ZhbCA+IG9sZFZhbCA/ICdsZWZ0JyA6ICdyaWdodCcsIG5ld1ZhbCwgb2xkVmFsKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGluZGljYXRvckNsaWNrOiBmdW5jdGlvbiBpbmRpY2F0b3JDbGljayhpbmRleCkge1xuXHQgICAgICBpZiAodGhpcy5pc0FuaW1hdGluZyB8fCB0aGlzLmluZGV4ID09PSBpbmRleCkgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuXHQgICAgfSxcblx0ICAgIHNsaWRlOiBmdW5jdGlvbiBzbGlkZShkaXJlY3Rpb24sIG5leHQsIHByZXYpIHtcblx0ICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgIGlmICghdGhpcy4kZWwpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdmFyICRzbGlkZXIgPSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnLml0ZW0nLCB0aGlzLiRlbCk7XG5cdCAgICAgIGlmICghJHNsaWRlci5sZW5ndGgpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIHNlbGVjdGVkID0gJHNsaWRlcltuZXh0XSB8fCAkc2xpZGVyWzBdO1xuXHQgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KShzZWxlY3RlZCkuYWRkQ2xhc3MoZGlyZWN0aW9uID09PSAnbGVmdCcgPyAnbmV4dCcgOiAncHJldicpO1xuXHQgICAgICAvLyByZXF1ZXN0IHByb3BlcnR5IHRoYXQgcmVxdWlyZXMgbGF5b3V0IHRvIGZvcmNlIGEgbGF5b3V0XG5cdCAgICAgIHZhciB4ID0gc2VsZWN0ZWQuY2xpZW50SGVpZ2h0O1xuXHQgICAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KShbJHNsaWRlcltwcmV2XSwgc2VsZWN0ZWRdKS5hZGRDbGFzcyhkaXJlY3Rpb24pLm9uKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICRzbGlkZXIub2ZmKCd0cmFuc2l0aW9uZW5kJykuY2xhc3NOYW1lID0gJ2l0ZW0nO1xuXHQgICAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHNlbGVjdGVkKS5hZGRDbGFzcygnYWN0aXZlJyk7XG5cdCAgICAgICAgX3RoaXMuaXNBbmltYXRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSk7XG5cdCAgICB9LFxuXHQgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcblx0ICAgICAgaWYgKCF0aGlzLiRlbCB8fCB0aGlzLmlzQW5pbWF0aW5nKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLmluZGV4ICsgMSA8ICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCcuaXRlbScsIHRoaXMuJGVsKS5sZW5ndGggPyB0aGlzLmluZGV4ICs9IDEgOiB0aGlzLmluZGV4ID0gMDtcblx0ICAgIH0sXG5cdCAgICBwcmV2OiBmdW5jdGlvbiBwcmV2KCkge1xuXHQgICAgICBpZiAoIXRoaXMuJGVsIHx8IHRoaXMuaXNBbmltYXRpbmcpIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7XG5cdCAgICAgIHRoaXMuaW5kZXggPT09IDAgPyB0aGlzLmluZGV4ID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5pdGVtJywgdGhpcy4kZWwpLmxlbmd0aCAtIDEgOiB0aGlzLmluZGV4IC09IDE7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlSW50ZXJ2YWw6IGZ1bmN0aW9uIHRvZ2dsZUludGVydmFsKHZhbCkge1xuXHQgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcblx0ICAgICAgICB2YWwgPSB0aGlzLl9pbnRlcnZhbElEO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9pbnRlcnZhbElEKSB7XG5cdCAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbElEKTtcblx0ICAgICAgICBkZWxldGUgdGhpcy5faW50ZXJ2YWxJRDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodmFsICYmIHRoaXMuaW50ZXJ2YWwgPiAwKSB7XG5cdCAgICAgICAgdGhpcy5faW50ZXJ2YWxJRCA9IHNldEludGVydmFsKHRoaXMubmV4dCwgdGhpcy5pbnRlcnZhbCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMyID0gdGhpcztcblx0XG5cdCAgICB0aGlzLnRvZ2dsZUludGVydmFsKHRydWUpO1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkodGhpcy4kZWwpLm9uKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gX3RoaXMyLnRvZ2dsZUludGVydmFsKGZhbHNlKTtcblx0ICAgIH0pLm9uKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKCkge1xuXHQgICAgICByZXR1cm4gX3RoaXMyLnRvZ2dsZUludGVydmFsKHRydWUpO1xuXHQgICAgfSk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgdGhpcy50b2dnbGVJbnRlcnZhbChmYWxzZSk7XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLiRlbCkub2ZmKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnKTtcblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiA5NCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbCBzbGlkZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJkYXRhLXJpZGVcIjogXCJjYXJvdXNlbFwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnb2wnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6IChfdm0uaW5kaWNhdG9ycyksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiaW5kaWNhdG9yc1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNhcm91c2VsLWluZGljYXRvcnNcIlxuXHQgIH0sIF92bS5fbCgoX3ZtLmluZGljYXRvcl9saXN0KSwgZnVuY3Rpb24oaW5kaWNhdG9yLCBpKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICBhY3RpdmU6IGkgPT09IF92bS5pbmRleFxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICBfdm0uaW5kaWNhdG9yQ2xpY2soaSlcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX2MoJ3NwYW4nKV0pXG5cdCAgfSkpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNhcm91c2VsLWlubmVyXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJsaXN0Ym94XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jb250cm9scyksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY29udHJvbHNcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjYXJvdXNlbC1jb250cm9scyBoaWRkZW4teHNcIlxuXHQgIH0sIFtfdm0uX2MoJ2EnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJsZWZ0IGNhcm91c2VsLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0ucHJldlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tbGVmdFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfVxuXHQgIH0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnYScsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInJpZ2h0IGNhcm91c2VsLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0ubmV4dFxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLWNoZXZyb24tcmlnaHRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KV0pXSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0zMjJkZWU0MVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDk1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDk2KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTgpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oOTkpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcQ2hlY2tib3gudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRfX3Z1ZV9vcHRpb25zX18uX3Njb3BlSWQgPSBcImRhdGEtdi02OTIyYmYyNFwiXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNjkyMmJmMjRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTY5MjJiZjI0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gQ2hlY2tib3gudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogOTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk3KTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02OTIyYmYyNCZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2hlY2tib3gudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi02OTIyYmYyNCZzY29wZWQ9dHJ1ZSEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vQ2hlY2tib3gudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogOTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxubGFiZWwuY2hlY2tib3hbZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDE4cHg7XFxufVxcbmxhYmVsLmNoZWNrYm94ID4gaW5wdXRbZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgei1pbmRleDogLTE7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIG1hcmdpbjogMDtcXG59XFxubGFiZWwuY2hlY2tib3ggPiAuaWNvbltkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogLjJyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICBsaW5lLWhlaWdodDoxcmVtO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBib3JkZXItcmFkaXVzOiAuMzVyZW07XFxyXFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTtcXG59XFxubGFiZWwuY2hlY2tib3g6bm90KC5hY3RpdmUpID4gLmljb25bZGF0YS12LTY5MjJiZjI0XSB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2JiYjtcXG59XFxubGFiZWwuY2hlY2tib3ggPiBpbnB1dDpmb2N1cyB+IC5pY29uW2RhdGEtdi02OTIyYmYyNF0ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcbn1cXG5sYWJlbC5jaGVja2JveC5hY3RpdmUgPiAuaWNvbltkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogMXJlbSAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqeHpkbWNnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUIzYVdSMGFEMGlOeUlnYUdWcFoyaDBQU0kzSWo0OGNHRjBhQ0JtYVd4c1BTSWpabVptSWlCa1BTSnROUzQzTXl3d0xqVXliQzB6TGpFeU5ESXlMRE11TXpReE5qRnNMVEV1TXpNNE9UVXNMVEV1TkRNeU1USnNMVEV1TWpRNU5qa3NNUzR6TXpZMk5Xd3lMalU0T0RZekxESXVOelk0Tnpac05DNHpOek01TEMwMExqWTNPREkyYkMweExqSTBPVFk1TEMweExqTXpOalkxYkRBc01Hd3dMakF3TURBeUxEQXVNREF3TURGNklpOCtQQzl6ZG1jKyk7XFxufVxcbmxhYmVsLmNoZWNrYm94LmFjdGl2ZSAuYnRuLWRlZmF1bHRbZGF0YS12LTY5MjJiZjI0XSB7IGZpbHRlcjogYnJpZ2h0bmVzcyg3NSUpO1xcbn1cXG5sYWJlbC5jaGVja2JveC5kaXNhYmxlZFtkYXRhLXYtNjkyMmJmMjRdLFxcclxcbmxhYmVsLmNoZWNrYm94LnJlYWRvbmx5W2RhdGEtdi02OTIyYmYyNF0sXFxyXFxuLmJ0bi5yZWFkb25seVtkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcbn1cXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPWNoZWNrYm94XVtkYXRhLXYtNjkyMmJmMjRdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9DaGVja2JveC52dWU/MWMwNDQxMGJcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQXlGQTtFQUNBLG1CQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsdUJBQUE7RUFDQSxtQkFBQTtFQUNBLFlBQUE7RUFDQSxXQUFBO0VBQ0EsV0FBQTtFQUNBLFVBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsUUFBQTtFQUNBLGVBQUE7RUFDQSxjQUFBO0VBQ0EsZUFBQTtFQUNBLGlCQUFBO0VBQ0EsbUJBQUE7RUFDQSxrQkFBQTtFQUNBLHNCQUFBO0VBQ0EsNkJBQUE7RUFDQSxtQ0FBQTtFQUNBLHlCQUFBO0NBQ0E7QUFDQTtFQUNBLHVCQUFBO0VBQ0EsdUJBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtFQUNBLDBCQUFBO0VBQ0EsMEVBQUE7Q0FDQTtBQUNBO0VBQ0EsMkJBQUE7RUFDQSxrWkFBQTtDQUNBO0FBQ0Esc0RBQUEsd0JBQUE7Q0FBQTtBQUVBOzs7RUFHQSwwQkFBQTtFQUNBLGlCQUFBO0VBQ0EsYUFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLG9CQUFBO0VBQ0EscUJBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiQ2hlY2tib3gudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxhIDppcz1cXFwiaXNCdXR0b24/J2EnOidsYWJlbCdcXFwiIEBjbGljaz1cXFwidG9nZ2xlXFxcIiA6Y2xhc3M9XFxcIltpc0J1dHRvbj8nYnRuIGJ0bi0nK3R5cGVDb2xvcjonb3BlbiBjaGVja2JveCAnK3R5cGVDb2xvcix7YWN0aXZlOmNoZWNrZWQsZGlzYWJsZWQ6ZGlzYWJsZWQscmVhZG9ubHk6cmVhZG9ubHl9XVxcXCI+XFxyXFxuICAgIDxpbnB1dCB2LWlmPVxcXCJuYW1lXFxcIiB0eXBlPVxcXCJoaWRkZW5cXFwiIDpuYW1lPVxcXCJuYW1lXFxcIiA6dmFsdWU9XFxcImNoZWNrZWQ/dHJ1ZVZhbHVlOmZhbHNlVmFsdWVcXFwiIC8+XFxyXFxuICAgIDxzcGFuIHYtaWY9XFxcIiFpc0J1dHRvblxcXCIgY2xhc3M9XFxcImljb24gZHJvcGRvd24tdG9nZ2xlXFxcIiA6Y2xhc3M9XFxcIltjaGVja2VkPydidG4tJyt0eXBlQ29sb3I6Jycse2JnOnR5cGVDb2xvcj09PSdkZWZhdWx0J31dXFxcIj48L3NwYW4+XFxyXFxuICAgIDxzcGFuIHYtaWY9XFxcIiFpc0J1dHRvbiYmY2hlY2tlZCYmdHlwZUNvbG9yPT09J2RlZmF1bHQnXFxcIiBjbGFzcz1cXFwiaWNvblxcXCI+PC9zcGFuPlxcclxcbiAgICA8c2xvdD48L3Nsb3Q+XFxyXFxuICA8L2E+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZGlzYWJsZWQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGZhbHNlVmFsdWU6IHtkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIG5hbWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgdHJ1ZVZhbHVlOiB7ZGVmYXVsdDogdHJ1ZX0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGNoZWNrZWQ6ICh0aGlzLnZhbHVlID09PSB0aGlzLnRydWVWYWx1ZSlcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGlzQnV0dG9uICgpIHsgcmV0dXJuIHRoaXMuYnV0dG9uIHx8ICh0aGlzLl9pbkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zKSB9LFxcclxcbiAgICBpc0ZhbHNlICgpIHsgcmV0dXJuIHRoaXMudmFsdWUgPT09IHRoaXMuZmFsc2VWYWx1ZSB9LFxcclxcbiAgICBpc1RydWUgKCkgeyByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWUgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKCkgeyByZXR1cm4gdGhpcy5faW5ncm91cCAmJiB0aGlzLiRwYXJlbnQudmFsIH0sXFxyXFxuICAgIHR5cGVDb2xvciAoKSB7IHJldHVybiAodGhpcy50eXBlIHx8ICh0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUpKSB8fCAnZGVmYXVsdCcgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIGNoZWNrZWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdmFyIHZhbHVlID0gdmFsID8gdGhpcy50cnVlVmFsdWUgOiB0aGlzLmZhbHNlVmFsdWVcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdjaGVja2VkJywgdmFsKVxcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpXFxyXFxuICAgICAgdGhpcy5ldmFsKClcXHJcXG4gICAgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWRcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcXHJcXG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWRcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9idG5Hcm91cCAmJiAhcGFyZW50Ll9yYWRpb0dyb3VwKSB7XFxyXFxuICAgICAgdGhpcy5faW5Hcm91cCA9IHRydWVcXHJcXG4gICAgICBwYXJlbnQuX2NoZWNrYm94R3JvdXAgPSB0cnVlXFxyXFxuICAgICAgaWYgKCEocGFyZW50LnZhbCBpbnN0YW5jZW9mIEFycmF5KSkgeyBwYXJlbnQudmFsID0gW10gfVxcclxcbiAgICAgIHRoaXMuZXZhbCgpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgaWYgKCF0aGlzLiRwYXJlbnQuX2NoZWNrYm94R3JvdXAgfHwgdHlwZW9mIHRoaXMudmFsdWUgPT09ICdib29sZWFuJykgeyByZXR1cm4gfVxcclxcbiAgICBpZiAodGhpcy4kcGFyZW50LnZhbC5sZW5ndGgpIHtcXHJcXG4gICAgICAvLyB0aGlzLmNoZWNrZWQgPSB+dGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudmFsdWUpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnY2hlY2tlZCcsIH50aGlzLiRwYXJlbnQudmFsLmluZGV4T2YodGhpcy52YWx1ZSkpXFxyXFxuICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2VkKSB7XFxyXFxuICAgICAgdGhpcy4kcGFyZW50LnZhbC5wdXNoKHRoaXMudmFsdWUpXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIGV2YWwgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLl9pbkdyb3VwKSB7XFxyXFxuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmNoZWNrZWQgPyB0aGlzLmlzVHJ1ZSA6IHRoaXMuaXNGYWxzZVxcclxcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHZhbHVlKVxcclxcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tlZCAmJiAhfmluZGV4KSB0aGlzLiRwYXJlbnQudmFsLnB1c2godmFsdWUpXFxyXFxuICAgICAgICBpZiAoIXRoaXMuY2hlY2tlZCAmJiB+aW5kZXgpIHRoaXMuJHBhcmVudC52YWwuc3BsaWNlKGluZGV4LCAxKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdG9nZ2xlICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7IHJldHVybiB9XFxyXFxuICAgICAgdGhpcy5jaGVja2VkID0gIXRoaXMuY2hlY2tlZFxcclxcbiAgICB9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZSBzY29wZWQ+XFxyXFxubGFiZWwuY2hlY2tib3gge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgcGFkZGluZy1sZWZ0OiAxOHB4O1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveCA+IGlucHV0IHtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB6LWluZGV4OiAtMTtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBvcGFjaXR5OiAwO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbn1cXHJcXG5sYWJlbC5jaGVja2JveCA+IC5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogLjJyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICBsaW5lLWhlaWdodDoxcmVtO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XFxyXFxuICBib3JkZXItcmFkaXVzOiAuMzVyZW07XFxyXFxuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xcclxcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogNTAlIDUwJTtcXHJcXG59XFxyXFxubGFiZWwuY2hlY2tib3g6bm90KC5hY3RpdmUpID4gLmljb24ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNiYmI7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94ID4gaW5wdXQ6Zm9jdXMgfiAuaWNvbiB7XFxyXFxuICBvdXRsaW5lOiAwO1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgIzY2YWZlOTtcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLDAgMCA4cHggcmdiYSgxMDIsMTc1LDIzMywuNik7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94LmFjdGl2ZSA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtc2l6ZTogMXJlbSAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0TkNqeHpkbWNnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUIzYVdSMGFEMGlOeUlnYUdWcFoyaDBQU0kzSWo0OGNHRjBhQ0JtYVd4c1BTSWpabVptSWlCa1BTSnROUzQzTXl3d0xqVXliQzB6TGpFeU5ESXlMRE11TXpReE5qRnNMVEV1TXpNNE9UVXNMVEV1TkRNeU1USnNMVEV1TWpRNU5qa3NNUzR6TXpZMk5Xd3lMalU0T0RZekxESXVOelk0Tnpac05DNHpOek01TEMwMExqWTNPREkyYkMweExqSTBPVFk1TEMweExqTXpOalkxYkRBc01Hd3dMakF3TURBeUxEQXVNREF3TURGNklpOCtQQzl6ZG1jKyk7XFxyXFxufVxcclxcbmxhYmVsLmNoZWNrYm94LmFjdGl2ZSAuYnRuLWRlZmF1bHQgeyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTsgfVxcclxcblxcclxcbmxhYmVsLmNoZWNrYm94LmRpc2FibGVkLFxcclxcbmxhYmVsLmNoZWNrYm94LnJlYWRvbmx5LFxcclxcbi5idG4ucmVhZG9ubHkge1xcclxcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1KTtcXHJcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICBvcGFjaXR5OiAuNjU7XFxyXFxufVxcclxcbmxhYmVsLmJ0biA+IGlucHV0W3R5cGU9Y2hlY2tib3hdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDk4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgYnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZmFsc2VWYWx1ZTogeyBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICB0cnVlVmFsdWU6IHsgZGVmYXVsdDogdHJ1ZSB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiB7IGRlZmF1bHQ6IGZhbHNlIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjaGVja2VkOiB0aGlzLnZhbHVlID09PSB0aGlzLnRydWVWYWx1ZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgaXNCdXR0b246IGZ1bmN0aW9uIGlzQnV0dG9uKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5idXR0b24gfHwgdGhpcy5faW5Hcm91cCAmJiB0aGlzLiRwYXJlbnQuYnV0dG9ucztcblx0ICAgIH0sXG5cdCAgICBpc0ZhbHNlOiBmdW5jdGlvbiBpc0ZhbHNlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy5mYWxzZVZhbHVlO1xuXHQgICAgfSxcblx0ICAgIGlzVHJ1ZTogZnVuY3Rpb24gaXNUcnVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gdGhpcy50cnVlVmFsdWU7XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5faW5ncm91cCAmJiB0aGlzLiRwYXJlbnQudmFsO1xuXHQgICAgfSxcblx0ICAgIHR5cGVDb2xvcjogZnVuY3Rpb24gdHlwZUNvbG9yKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50eXBlIHx8IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSB8fCAnZGVmYXVsdCc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgY2hlY2tlZDogZnVuY3Rpb24gY2hlY2tlZCh2YWwsIG9sZCkge1xuXHQgICAgICB2YXIgdmFsdWUgPSB2YWwgPyB0aGlzLnRydWVWYWx1ZSA6IHRoaXMuZmFsc2VWYWx1ZTtcblx0ICAgICAgdGhpcy4kZW1pdCgnY2hlY2tlZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsdWUpO1xuXHQgICAgICB0aGlzLmV2YWwoKTtcblx0ICAgIH0sXG5cdCAgICBwYXJlbnRWYWx1ZTogZnVuY3Rpb24gcGFyZW50VmFsdWUodmFsKSB7XG5cdCAgICAgIHZhciBjaGVja2VkID0gdmFsID09PSB0aGlzLnRydWVWYWx1ZTtcblx0ICAgICAgaWYgKHRoaXMuY2hlY2tlZCAhPT0gY2hlY2tlZCkge1xuXHQgICAgICAgIHRoaXMuY2hlY2tlZCA9IGNoZWNrZWQ7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIGNoZWNrZWQgPSB2YWwgPT09IHRoaXMudHJ1ZVZhbHVlO1xuXHQgICAgICBpZiAodGhpcy5jaGVja2VkICE9PSBjaGVja2VkKSB7XG5cdCAgICAgICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fYnRuR3JvdXAgJiYgIXBhcmVudC5fcmFkaW9Hcm91cCkge1xuXHQgICAgICB0aGlzLl9pbkdyb3VwID0gdHJ1ZTtcblx0ICAgICAgcGFyZW50Ll9jaGVja2JveEdyb3VwID0gdHJ1ZTtcblx0ICAgICAgaWYgKCEocGFyZW50LnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xuXHQgICAgICAgIHBhcmVudC52YWwgPSBbXTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLmV2YWwoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICBpZiAoIXRoaXMuJHBhcmVudC5fY2hlY2tib3hHcm91cCB8fCB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG5cdCAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLiRwYXJlbnQudmFsLmxlbmd0aCkge1xuXHQgICAgICAvLyB0aGlzLmNoZWNrZWQgPSB+dGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudmFsdWUpXG5cdCAgICAgIHRoaXMuJGVtaXQoJ2NoZWNrZWQnLCB+dGhpcy4kcGFyZW50LnZhbC5pbmRleE9mKHRoaXMudmFsdWUpKTtcblx0ICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2VkKSB7XG5cdCAgICAgIHRoaXMuJHBhcmVudC52YWwucHVzaCh0aGlzLnZhbHVlKTtcblx0ICAgIH1cblx0ICB9LFxuXHRcblx0ICBtZXRob2RzOiB7XG5cdCAgICBldmFsOiBmdW5jdGlvbiBfZXZhbCgpIHtcblx0ICAgICAgaWYgKHRoaXMuX2luR3JvdXApIHtcblx0ICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmNoZWNrZWQgPyB0aGlzLmlzVHJ1ZSA6IHRoaXMuaXNGYWxzZTtcblx0ICAgICAgICB2YXIgaW5kZXggPSB0aGlzLiRwYXJlbnQudmFsLmluZGV4T2YodmFsdWUpO1xuXHQgICAgICAgIGlmICh0aGlzLmNoZWNrZWQgJiYgIX5pbmRleCkgdGhpcy4kcGFyZW50LnZhbC5wdXNoKHZhbHVlKTtcblx0ICAgICAgICBpZiAoIXRoaXMuY2hlY2tlZCAmJiB+aW5kZXgpIHRoaXMuJHBhcmVudC52YWwuc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogOTkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYyhfdm0uaXNCdXR0b24gPyAnYScgOiAnbGFiZWwnLCB7XG5cdCAgICB0YWc6IFwiYVwiLFxuXHQgICAgY2xhc3M6IFtfdm0uaXNCdXR0b24gPyAnYnRuIGJ0bi0nICsgX3ZtLnR5cGVDb2xvciA6ICdvcGVuIGNoZWNrYm94ICcgKyBfdm0udHlwZUNvbG9yLCB7XG5cdCAgICAgIGFjdGl2ZTogX3ZtLmNoZWNrZWQsXG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIHJlYWRvbmx5OiBfdm0ucmVhZG9ubHlcblx0ICAgIH1dLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlXG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ubmFtZSkgPyBfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiaGlkZGVuXCIsXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZVxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLmNoZWNrZWQgPyBfdm0udHJ1ZVZhbHVlIDogX3ZtLmZhbHNlVmFsdWVcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoIV92bS5pc0J1dHRvbikgPyBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVwiLFxuXHQgICAgY2xhc3M6IFtfdm0uY2hlY2tlZCA/ICdidG4tJyArIF92bS50eXBlQ29sb3IgOiAnJywge1xuXHQgICAgICBiZzogX3ZtLnR5cGVDb2xvciA9PT0gJ2RlZmF1bHQnXG5cdCAgICB9XVxuXHQgIH0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksICghX3ZtLmlzQnV0dG9uICYmIF92bS5jaGVja2VkICYmIF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0JykgPyBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uXCJcblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNjkyMmJmMjRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTAxKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTAzKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxEYXRlcGlja2VyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi00NzdiOGU1ZFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNDc3YjhlNWRcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBEYXRlcGlja2VyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEwMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTAyKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi00NzdiOGU1ZCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vRGF0ZXBpY2tlci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQ3N2I4ZTVkIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9EYXRlcGlja2VyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEwMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZGF0ZXBpY2tlciB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxufVxcbmlucHV0LmRhdGVwaWNrZXItaW5wdXQud2l0aC1yZXNldC1idXR0b24ge1xcclxcbiAgcGFkZGluZy1yaWdodDogMjVweDtcXG59XFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2U6Zm9jdXMge1xcclxcbiAgb3BhY2l0eTogLjI7XFxufVxcbi5kYXRlcGlja2VyLXBvcHVwIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgbWFyZ2luLXRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwMDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLDAsMCwwLjE3NSk7XFxufVxcbi5kYXRlcGlja2VyLWlubmVyIHtcXHJcXG4gIHdpZHRoOiAyMThweDtcXG59XFxuLmRhdGVwaWNrZXItYm9keSB7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHg7XFxufVxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHdpZHRoOiAyOHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI4cHg7XFxyXFxuICBoZWlnaHQ6IDI4cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxufVxcbi5kYXRlcGlja2VyLWN0cmwgcCB7XFxyXFxuICB3aWR0aDogNjUlO1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbn1cXG4uZGF0ZXBpY2tlci1ib2R5IHNwYW4ge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4ge1xcclxcbiAgd2lkdGg6IDQ4cHg7XFxyXFxuICBoZWlnaHQ6IDUwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogNDVweDtcXG59XFxuLmRhdGVwaWNrZXItaXRlbS1kaXNhYmxlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG4gIGN1cnNvcjogbm90LWFsbG93ZWQhaW1wb3J0YW50O1xcbn1cXG4uZGVjYWRlUmFuZ2Ugc3BhbjpmaXJzdC1jaGlsZCxcXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpsYXN0LWNoaWxkLFxcclxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWdyYXkge1xcclxcbiAgY29sb3I6ICM5OTk7XFxufVxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZTpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUge1xcclxcbiAgYmFja2dyb3VuZDogcmdiKDUwLCAxMTgsIDE3NykhaW1wb3J0YW50O1xcclxcbiAgY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXG59XFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAxMHB4XFxufVxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3BhbixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBwLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcDpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIGk6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlIHNwYW46aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0taG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvciA6ICNlZWVlZWU7XFxufVxcbi5kYXRlcGlja2VyLXdlZWtSYW5nZSBzcGFuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcbn1cXG4uZGF0ZXBpY2tlci1sYWJlbCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXHJcXG4gIHBhZGRpbmc6IDdweCAwO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcbn1cXG4uZGF0ZXBpY2tlci1jdHJsIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGhlaWdodDogMzBweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxufVxcbi5tb250aC1idG4ge1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbW96LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbXMtdXNlci1zZWxlY3Q6bm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0Om5vbmU7XFxufVxcbi5kYXRlcGlja2VyLXByZUJ0biB7XFxyXFxuICBsZWZ0OiAycHg7XFxufVxcbi5kYXRlcGlja2VyLW5leHRCdG4ge1xcclxcbiAgcmlnaHQ6IDJweDtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9EYXRlcGlja2VyLnZ1ZT8yMjAwZTRjYVwiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiO0FBc1ZBO0VBQ0EsbUJBQUE7RUFDQSxzQkFBQTtDQUNBO0FBQ0E7RUFDQSxvQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsY0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLG1CQUFBO0VBQ0EsaUJBQUE7RUFDQSxnQkFBQTtFQUNBLGNBQUE7RUFDQSx5Q0FBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTs7O0VBR0Esc0JBQUE7RUFDQSxZQUFBO0VBQ0Esa0JBQUE7RUFDQSxhQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0EsV0FBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGtCQUFBO0NBQ0E7QUFDQTtFQUNBLGtDQUFBO0VBQ0EsOEJBQUE7Q0FDQTtBQUNBOzs7O0VBSUEsWUFBQTtDQUNBO0FBRUE7O0VBRUEsd0NBQUE7RUFDQSx1QkFBQTtDQUNBO0FBQ0E7RUFDQSxnQkFBQTtDQUNBO0FBQ0E7Ozs7RUFJQSxnQkFBQTtDQUNBO0FBQ0E7Ozs7O0VBS0EsMkJBQUE7Q0FDQTtBQUNBO0VBQ0Esa0JBQUE7Q0FDQTtBQUNBO0VBQ0EsMEJBQUE7RUFDQSxpQkFBQTtFQUNBLGVBQUE7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBO0VBQ0Esa0JBQUE7RUFDQSx5QkFBQTtFQUNBLHNCQUFBO0VBQ0EscUJBQUE7RUFDQSxpQkFBQTtDQUNBO0FBQ0E7RUFDQSxVQUFBO0NBQ0E7QUFDQTtFQUNBLFdBQUE7Q0FDQVwiLFwiZmlsZVwiOlwiRGF0ZXBpY2tlci52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlclxcXCI+XFxyXFxuICAgIDxpbnB1dCBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGRhdGVwaWNrZXItaW5wdXRcXFwiIDpjbGFzcz1cXFwieyd3aXRoLXJlc2V0LWJ1dHRvbic6IGNsZWFyQnV0dG9ufVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgOnBsYWNlaG9sZGVyPVxcXCJwbGFjZWhvbGRlclxcXCJcXHJcXG4gICAgICAgIDpzdHlsZT1cXFwie3dpZHRoOndpZHRofVxcXCJcXHJcXG4gICAgICAgIDp2YWx1ZT1cXFwidmFsdWVcXFwiXFxyXFxuICAgICAgICBAY2xpY2s9XFxcImlucHV0Q2xpY2tcXFwiXFxyXFxuICAgICAgICBAaW5wdXQ9XFxcIiRlbWl0KCdpbnB1dCcsJGV2ZW50LnRhcmdldC52YWx1ZSlcXFwiIC8+XFxyXFxuICAgIDxidXR0b24gdi1pZj1cXFwiY2xlYXJCdXR0b24gJiYgdmFsdWVcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcIiRlbWl0KCdpbnB1dCcsICcnKVxcXCI+XFxyXFxuICAgICAgPHNwYW4+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgPC9idXR0b24+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItcG9wdXBcXFwiIHYtc2hvdz1cXFwiZGlzcGxheURheVZpZXdcXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItaW5uZXJcXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1ib2R5XFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1jdHJsXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiA6Y2xhc3M9XFxcInByZUJ0bkNsYXNzZXNcXFwiIGFyaWEtaGlkZGVuPVxcXCJ0cnVlXFxcIiBAY2xpY2s9XFxcInByZU5leHRNb250aENsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dE1vbnRoQ2xpY2soMSlcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgICA8cCBAY2xpY2s9XFxcInN3aXRjaE1vbnRoVmlld1xcXCI+e3tzdHJpbmdpZnlEYXlIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXdlZWtSYW5nZVxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gdi1mb3I9XFxcIncgaW4gdGV4dC5kYXlzT2ZXZWVrXFxcIj57e3d9fTwvc3Bhbj5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItZGF0ZVJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICA8c3BhbiB2LWZvcj1cXFwiZCBpbiBkYXRlUmFuZ2VcXFwiIDpjbGFzcz1cXFwiZC5zY2xhc3NcXFwiIEBjbGljaz1cXFwiZGF5U2VsZWN0KGQpXFxcIj57e2QudGV4dH19PC9zcGFuPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgIDwvZGl2PlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICA8L2Rpdj5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1wb3B1cFxcXCIgdi1zaG93PVxcXCJkaXNwbGF5TW9udGhWaWV3XFxcIj5cXHJcXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWlubmVyXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItYm9keVxcXCI+XFxyXFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRhdGVwaWNrZXItY3RybFxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJwcmVCdG5DbGFzc2VzXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgQGNsaWNrPVxcXCJwcmVOZXh0WWVhckNsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dFllYXJDbGljaygxKVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxwIEBjbGljaz1cXFwic3dpdGNoRGVjYWRlVmlld1xcXCI+e3tzdHJpbmdpZnlZZWFySGVhZGVyKGN1cnJEYXRlKX19PC9wPlxcclxcbiAgICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1tb250aFJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1mb3I9XFxcIihtLCBpbmRleCkgaW4gdGV4dC5tb250aHNcXFwiPlxcclxcbiAgICAgICAgICAgICAgPHNwYW4gICA6Y2xhc3M9XFxcInsnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOlxcclxcbiAgICAgICAgICAgICAgICAgICh0ZXh0Lm1vbnRoc1twYXJzZSh2YWx1ZSkuZ2V0TW9udGgoKV0gID09PSBtKSAmJlxcclxcbiAgICAgICAgICAgICAgICAgIGN1cnJEYXRlLmdldEZ1bGxZZWFyKCkgPT09IHBhcnNlKHZhbHVlKS5nZXRGdWxsWWVhcigpfVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgICBAY2xpY2s9XFxcIm1vbnRoU2VsZWN0KGluZGV4KVxcXCJcXHJcXG4gICAgICAgICAgICAgICAgPnt7bS5zdWJzdHIoMCwzKX19PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLXBvcHVwXFxcIiB2LXNob3c9XFxcImRpc3BsYXlZZWFyVmlld1xcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0ZXBpY2tlci1pbm5lclxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWJvZHlcXFwiPlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLWN0cmxcXFwiPlxcclxcbiAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwicHJlQnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDApXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHNwYW4gOmNsYXNzPVxcXCJuZXh0QnRuQ2xhc3Nlc1xcXCIgYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIEBjbGljaz1cXFwicHJlTmV4dERlY2FkZUNsaWNrKDEpXFxcIj48L3NwYW4+XFxyXFxuICAgICAgICAgICAgPHA+e3tzdHJpbmdpZnlEZWNhZGVIZWFkZXIoY3VyckRhdGUpfX08L3A+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRlcGlja2VyLW1vbnRoUmFuZ2UgZGVjYWRlUmFuZ2VcXFwiPlxcclxcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWZvcj1cXFwiZGVjYWRlIGluIGRlY2FkZVJhbmdlXFxcIj5cXHJcXG4gICAgICAgICAgICAgIDxzcGFuIDpjbGFzcz1cXFwieydkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSc6cGFyc2UodGhpcy52YWx1ZSkuZ2V0RnVsbFllYXIoKSA9PT0gZGVjYWRlLnRleHR9XFxcIlxcclxcbiAgICAgICAgICAgICAgICBAY2xpY2suc3RvcD1cXFwieWVhclNlbGVjdChkZWNhZGUudGV4dClcXFwiXFxyXFxuICAgICAgICAgICAgICA+e3tkZWNhZGUudGV4dH19PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgICAgICAgIDwvZGl2PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7dHJhbnNsYXRpb25zfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xcclxcbi8vIGltcG9ydCAkIGZyb20gJy4vdXRpbHMvTm9kZUxpc3QuanMnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgdmFsdWU6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBmb3JtYXQ6IHtkZWZhdWx0OiAnTU0vZGQveXl5eSd9LFxcclxcbiAgICBkaXNhYmxlZERheXNPZldlZWs6IHt0eXBlOiBBcnJheSwgZGVmYXVsdCAoKSB7IHJldHVybiBbXSB9fSxcXHJcXG4gICAgd2lkdGg6IHt0eXBlOiBTdHJpbmcvKiwgZGVmYXVsdDogJzIwMHB4JyovfSxcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGxhbmc6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZX0sXFxyXFxuICAgIHBsYWNlaG9sZGVyOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgaWNvbnNGb250OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZ2x5cGhpY29uJ31cXHJcXG4gIH0sXFxyXFxuICBkYXRhICgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBjdXJyRGF0ZTogbmV3IERhdGUoKSxcXHJcXG4gICAgICBkYXRlUmFuZ2U6IFtdLFxcclxcbiAgICAgIGRlY2FkZVJhbmdlOiBbXSxcXHJcXG4gICAgICBkaXNwbGF5RGF5VmlldzogZmFsc2UsXFxyXFxuICAgICAgZGlzcGxheU1vbnRoVmlldzogZmFsc2UsXFxyXFxuICAgICAgZGlzcGxheVllYXJWaWV3OiBmYWxzZSxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIGN1cnJEYXRlICgpIHtcXHJcXG4gICAgICB0aGlzLmdldERhdGVSYW5nZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIGZvcm1hdCAoKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKSlcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIHRleHQgKCkge1xcclxcbiAgICAgIHJldHVybiB0cmFuc2xhdGlvbnModGhpcy5sYW5nKVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVCdG5DbGFzc2VzICgpIHtcXHJcXG4gICAgICByZXR1cm4gYGRhdGVwaWNrZXItcHJlQnRuICR7dGhpcy5pY29uc0ZvbnR9ICR7dGhpcy5pY29uc0ZvbnR9LWNoZXZyb24tbGVmdGBcXHJcXG4gICAgfSxcXHJcXG4gICAgbmV4dEJ0bkNsYXNzZXMgKCkge1xcclxcbiAgICAgIHJldHVybiBgZGF0ZXBpY2tlci1uZXh0QnRuICR7dGhpcy5pY29uc0ZvbnR9ICR7dGhpcy5pY29uc0ZvbnR9LWNoZXZyb24tcmlnaHRgXFxyXFxuICAgIH0sXFxyXFxuICAgIGRpc2FibGVkRGF5c0FycmF5ICgpIHtcXHJcXG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERheXNPZldlZWsubWFwKGQgPT4gcGFyc2VJbnQoZCwgMTApKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBjbG9zZSAoKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRoaXMuZGlzcGxheVllYXJWaWV3ID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgaW5wdXRDbGljayAoKSB7XFxyXFxuICAgICAgdGhpcy5jdXJyRGF0ZSA9IHRoaXMucGFyc2UodGhpcy52YWx1ZSkgfHwgdGhpcy5wYXJzZShuZXcgRGF0ZSgpKVxcclxcbiAgICAgIGlmICh0aGlzLmRpc3BsYXlNb250aFZpZXcgfHwgdGhpcy5kaXNwbGF5WWVhclZpZXcpIHtcXHJcXG4gICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gIXRoaXMuZGlzcGxheURheVZpZXdcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHByZU5leHREZWNhZGVDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKClcXHJcXG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKClcXHJcXG5cXHJcXG4gICAgICBpZiAoZmxhZyA9PT0gMCkge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgLSAxMCwgbW9udGhzLCBkYXRlKVxcclxcbiAgICAgIH0gZWxzZSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEwLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0TW9udGhDbGljayAoZmxhZykge1xcclxcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKClcXHJcXG4gICAgICBjb25zdCBtb250aCA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICBjb25zdCBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSlcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZShwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aCwgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgY29uc3QgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKVxcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBwcmVOZXh0WWVhckNsaWNrIChmbGFnKSB7XFxyXFxuICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VyckRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICAgIGNvbnN0IG1vbnRocyA9IHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKVxcclxcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcblxcclxcbiAgICAgIGlmIChmbGFnID09PSAwKSB7XFxyXFxuICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciAtIDEsIG1vbnRocywgZGF0ZSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxLCBtb250aHMsIGRhdGUpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICB5ZWFyU2VsZWN0ICh5ZWFyKSB7XFxyXFxuICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSlcXHJcXG4gICAgfSxcXHJcXG4gICAgZGF5U2VsZWN0IChkYXkpIHtcXHJcXG4gICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIHRoaXMuY3VyckRhdGUgPSBkYXkuZGF0ZVxcclxcbiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKSlcXHJcXG4gICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgc3dpdGNoTW9udGhWaWV3ICgpIHtcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gZmFsc2VcXHJcXG4gICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIHN3aXRjaERlY2FkZVZpZXcgKCkge1xcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIG1vbnRoU2VsZWN0IChpbmRleCkge1xcclxcbiAgICAgIHRoaXMuZGlzcGxheU1vbnRoVmlldyA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IHRydWVcXHJcXG4gICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUodGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpLCBpbmRleCwgdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCkpXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldFllYXJNb250aCAoeWVhciwgbW9udGgpIHtcXHJcXG4gICAgICBpZiAobW9udGggPiAxMSkge1xcclxcbiAgICAgICAgeWVhcisrXFxyXFxuICAgICAgICBtb250aCA9IDBcXHJcXG4gICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkge1xcclxcbiAgICAgICAgeWVhci0tXFxyXFxuICAgICAgICBtb250aCA9IDExXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiB7eWVhcjogeWVhciwgbW9udGg6IG1vbnRofVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnlEZWNhZGVIZWFkZXIgKGRhdGUpIHtcXHJcXG4gICAgICBjb25zdCB5ZWFyU3RyID0gZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKClcXHJcXG4gICAgICBjb25zdCBmaXJzdFllYXJPZkRlY2FkZSA9IHllYXJTdHIuc3Vic3RyaW5nKDAsIHllYXJTdHIubGVuZ3RoIC0gMSkgKyAwXFxyXFxuICAgICAgY29uc3QgbGFzdFllYXJPZkRlY2FkZSA9IHBhcnNlSW50KGZpcnN0WWVhck9mRGVjYWRlLCAxMCkgKyAxMFxcclxcbiAgICAgIHJldHVybiBmaXJzdFllYXJPZkRlY2FkZSArICctJyArIGxhc3RZZWFyT2ZEZWNhZGVcXHJcXG4gICAgfSxcXHJcXG4gICAgc3RyaW5naWZ5RGF5SGVhZGVyIChkYXRlKSB7XFxyXFxuICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXSArICcgJyArIGRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJzZU1vbnRoIChkYXRlKSB7XFxyXFxuICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnlZZWFySGVhZGVyIChkYXRlKSB7XFxyXFxuICAgICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKVxcclxcbiAgICB9LFxcclxcbiAgICBzdHJpbmdpZnkgKGRhdGUsIGZvcm1hdCA9IHRoaXMuZm9ybWF0KSB7XFxyXFxuICAgICAgaWYgKCFkYXRlKSBkYXRlID0gdGhpcy5wYXJzZSgpXFxyXFxuICAgICAgaWYgKCFkYXRlKSByZXR1cm4gJydcXHJcXG4gICAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpXFxyXFxuICAgICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxXFxyXFxuICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKClcXHJcXG4gICAgICBjb25zdCBtb250aE5hbWUgPSB0aGlzLnBhcnNlTW9udGgoZGF0ZSlcXHJcXG5cXHJcXG4gICAgICByZXR1cm4gZm9ybWF0XFxyXFxuICAgICAgLnJlcGxhY2UoL3l5eXkvZywgeWVhcilcXHJcXG4gICAgICAucmVwbGFjZSgvTU1NTS9nLCBtb250aE5hbWUpXFxyXFxuICAgICAgLnJlcGxhY2UoL01NTS9nLCBtb250aE5hbWUuc3Vic3RyaW5nKDAsIDMpKVxcclxcbiAgICAgIC5yZXBsYWNlKC9NTS9nLCAoJzAnICsgbW9udGgpLnNsaWNlKC0yKSlcXHJcXG4gICAgICAucmVwbGFjZSgvZGQvZywgKCcwJyArIGRheSkuc2xpY2UoLTIpKVxcclxcbiAgICAgIC5yZXBsYWNlKC95eS9nLCB5ZWFyKVxcclxcbiAgICAgIC5yZXBsYWNlKC9NKD8hYSkvZywgbW9udGgpXFxyXFxuICAgICAgLnJlcGxhY2UoL2QvZywgZGF5KVxcclxcbiAgICB9LFxcclxcbiAgICBwYXJzZSAoc3RyID0gdGhpcy52YWx1ZSkge1xcclxcbiAgICAgIGxldCBkYXRlXFxyXFxuICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDEwICYmICh0aGlzLmZvcm1hdCA9PT0gJ2RkLU1NLXl5eXknIHx8IHRoaXMuZm9ybWF0ID09PSAnZGQvTU0veXl5eScpKSB7XFxyXFxuICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RyLnN1YnN0cmluZyg2LCAxMCksIHN0ci5zdWJzdHJpbmcoMywgNSktMSwgc3RyLnN1YnN0cmluZygwLCAyKSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHN0cilcXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIGlzTmFOKGRhdGUuZ2V0RnVsbFllYXIoKSkgPyBuZXcgRGF0ZSgpIDogZGF0ZVxcclxcbiAgICB9LFxcclxcbiAgICBnZXREYXlDb3VudCAoeWVhciwgbW9udGgpIHtcXHJcXG4gICAgICBjb25zdCBkaWN0ID0gWzMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdXFxyXFxuICAgICAgaWYgKG1vbnRoID09PSAxKSB7XFxyXFxuICAgICAgICBpZiAoKHllYXIgJSA0MDAgPT09IDApIHx8ICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSkge1xcclxcbiAgICAgICAgICByZXR1cm4gMjlcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgICAgcmV0dXJuIGRpY3RbbW9udGhdXFxyXFxuICAgIH0sXFxyXFxuICAgIGdldERhdGVSYW5nZSAoKSB7XFxyXFxuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIHRoaXMuZGVjYWRlUmFuZ2UgPSBbXVxcclxcbiAgICAgIGNvbnN0IHRpbWUgPSB7XFxyXFxuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksXFxyXFxuICAgICAgICBtb250aDogdGhpcy5jdXJyRGF0ZS5nZXRNb250aCgpLFxcclxcbiAgICAgICAgZGF5OiB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBjb25zdCB5ZWFyU3RyID0gdGltZS55ZWFyLnRvU3RyaW5nKClcXHJcXG4gICAgICBjb25zdCBmaXJzdFllYXJPZkRlY2FkZSA9ICh5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMCkgLSAxXFxyXFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XFxyXFxuICAgICAgICB0aGlzLmRlY2FkZVJhbmdlLnB1c2goe1xcclxcbiAgICAgICAgICB0ZXh0OiBmaXJzdFllYXJPZkRlY2FkZSArIGlcXHJcXG4gICAgICAgIH0pXFxyXFxuICAgICAgfVxcclxcblxcclxcbiAgICAgIGNvbnN0IGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCAxKVxcclxcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcXHJcXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XFxyXFxuICAgICAgICBmaXJzdERheVdlZWsgPSA3XFxyXFxuICAgICAgfVxcclxcbiAgICAgIGNvbnN0IGRheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudCh0aW1lLnllYXIsIHRpbWUubW9udGgpXFxyXFxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA+IDEpIHtcXHJcXG4gICAgICAgIGNvbnN0IHByZU1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgodGltZS55ZWFyLCB0aW1lLm1vbnRoIC0gMSlcXHJcXG4gICAgICAgIGNvbnN0IHByZXZNb250aERheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudChwcmVNb250aC55ZWFyLCBwcmVNb250aC5tb250aClcXHJcXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF5VGV4dCA9IHByZXZNb250aERheUNvdW50IC0gZmlyc3REYXlXZWVrICsgaSArIDFcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXlUZXh0KVxcclxcbiAgICAgICAgICBsZXQgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1ncmF5J1xcclxcbiAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcXHJcXG4gICAgICAgICAgICBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWRpc2FibGUnXFxyXFxuICAgICAgICAgIH1cXHJcXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XFxyXFxuICAgICAgICAgICAgdGV4dDogZGF5VGV4dCxcXHJcXG4gICAgICAgICAgICBkYXRlOiBkYXRlLFxcclxcbiAgICAgICAgICAgIHNjbGFzczogJ2RhdGVwaWNrZXItaXRlbS1ncmF5J1xcclxcbiAgICAgICAgICB9KVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgIH1cXHJcXG5cXHJcXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkYXlDb3VudDsgaSsrKSB7XFxyXFxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCBpKVxcclxcbiAgICAgICAgbGV0IHNjbGFzcyA9ICcnXFxyXFxuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKGRhdGUuZ2V0RGF5KCkpID4gLTEpIHtcXHJcXG4gICAgICAgICAgc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJ1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgaWYgKGkgPT0gdGltZS5kYXkgJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09IHRpbWUueWVhciAmJiBkYXRlLmdldE1vbnRoKCkgPT0gdGltZS5tb250aCl7XFxyXFxuICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZSdcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xcclxcbiAgICAgICAgICB0ZXh0OiBpLFxcclxcbiAgICAgICAgICBkYXRlOiBkYXRlLFxcclxcbiAgICAgICAgICBzY2xhc3M6IHNjbGFzc1xcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICB9XFxyXFxuXFxyXFxuICAgICAgaWYgKHRoaXMuZGF0ZVJhbmdlLmxlbmd0aCA8IDQyKSB7XFxyXFxuICAgICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcXHJcXG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCArIDEpXFxyXFxuXFxyXFxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuZXh0TW9udGhOZWVkOyBpKyspIHtcXHJcXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXFxyXFxuICAgICAgICAgIGxldCBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWdyYXknXFxyXFxuICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoZGF0ZS5nZXREYXkoKSkgPiAtMSkge1xcclxcbiAgICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSdcXHJcXG4gICAgICAgICAgfVxcclxcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcXHJcXG4gICAgICAgICAgICB0ZXh0OiBpLFxcclxcbiAgICAgICAgICAgIGRhdGU6IGRhdGUsXFxyXFxuICAgICAgICAgICAgc2NsYXNzOiBzY2xhc3NcXHJcXG4gICAgICAgICAgfSlcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtb3VudGVkICgpIHtcXHJcXG4gICAgbGV0IGVsID0gdGhpcy4kZWxcXHJcXG4gICAgdGhpcy5fYmx1ciA9IGUgPT4ge1xcclxcbiAgICAgIGlmICghZWwuY29udGFpbnMoZS50YXJnZXQpKVxcclxcbiAgICAgICAgdGhpcy5jbG9zZSgpXFxyXFxuICAgIH1cXHJcXG4gICAgdGhpcy4kZW1pdCgnY2hpbGQtY3JlYXRlZCcsIHRoaXMpXFxyXFxuICAgIHRoaXMuY3VyckRhdGUgPSB0aGlzLnBhcnNlKHRoaXMudmFsdWUpIHx8IHRoaXMucGFyc2UobmV3IERhdGUoKSlcXHJcXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XFxyXFxuICB9LFxcclxcbiAgYmVmb3JlRGVzdHJveSAoKSB7XFxyXFxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JsdXIpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uZGF0ZXBpY2tlciB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxufVxcclxcbmlucHV0LmRhdGVwaWNrZXItaW5wdXQud2l0aC1yZXNldC1idXR0b24ge1xcclxcbiAgcGFkZGluZy1yaWdodDogMjVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2Uge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAwO1xcclxcbiAgcmlnaHQ6IDA7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXIgPiBidXR0b24uY2xvc2U6Zm9jdXMge1xcclxcbiAgb3BhY2l0eTogLjI7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXBvcHVwIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7XFxyXFxuICBib3JkZXItcmFkaXVzOiA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgbWFyZ2luLXRvcDogMnB4O1xcclxcbiAgei1pbmRleDogMTAwMDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNnB4IDEycHggcmdiYSgwLDAsMCwwLjE3NSk7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWlubmVyIHtcXHJcXG4gIHdpZHRoOiAyMThweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItYm9keSB7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCxcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItYm9keSBzcGFuIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHdpZHRoOiAyOHB4O1xcclxcbiAgbGluZS1oZWlnaHQ6IDI4cHg7XFxyXFxuICBoZWlnaHQ6IDI4cHg7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLWN0cmwgcCB7XFxyXFxuICB3aWR0aDogNjUlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1ib2R5IHNwYW4ge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1tb250aFJhbmdlIHNwYW4ge1xcclxcbiAgd2lkdGg6IDQ4cHg7XFxyXFxuICBoZWlnaHQ6IDUwcHg7XFxyXFxuICBsaW5lLWhlaWdodDogNDVweDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItaXRlbS1kaXNhYmxlIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG4gIGN1cnNvcjogbm90LWFsbG93ZWQhaW1wb3J0YW50O1xcclxcbn1cXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpmaXJzdC1jaGlsZCxcXHJcXG4uZGVjYWRlUmFuZ2Ugc3BhbjpsYXN0LWNoaWxkLFxcclxcbi5kYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSxcXHJcXG4uZGF0ZXBpY2tlci1pdGVtLWdyYXkge1xcclxcbiAgY29sb3I6ICM5OTk7XFxyXFxufVxcclxcblxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZS1pdGVtLWFjdGl2ZTpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUge1xcclxcbiAgYmFja2dyb3VuZDogcmdiKDUwLCAxMTgsIDE3NykhaW1wb3J0YW50O1xcclxcbiAgY29sb3I6IHdoaXRlIWltcG9ydGFudDtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSB7XFxyXFxuICBtYXJnaW4tdG9wOiAxMHB4XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW1vbnRoUmFuZ2Ugc3BhbixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHNwYW4sXFxyXFxuLmRhdGVwaWNrZXItY3RybCBwLFxcclxcbi5kYXRlcGlja2VyLWRhdGVSYW5nZSBzcGFuIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuLmRhdGVwaWNrZXItbW9udGhSYW5nZSBzcGFuOmhvdmVyLFxcclxcbi5kYXRlcGlja2VyLWN0cmwgcDpob3ZlcixcXHJcXG4uZGF0ZXBpY2tlci1jdHJsIGk6aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlIHNwYW46aG92ZXIsXFxyXFxuLmRhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0taG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvciA6ICNlZWVlZWU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXdlZWtSYW5nZSBzcGFuIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1sYWJlbCB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXHJcXG4gIHBhZGRpbmc6IDdweCAwO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG4uZGF0ZXBpY2tlci1jdHJsIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGhlaWdodDogMzBweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcbi5tb250aC1idG4ge1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICAtd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbW96LXVzZXItc2VsZWN0Om5vbmU7XFxyXFxuICAtbXMtdXNlci1zZWxlY3Q6bm9uZTtcXHJcXG4gIHVzZXItc2VsZWN0Om5vbmU7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLXByZUJ0biB7XFxyXFxuICBsZWZ0OiAycHg7XFxyXFxufVxcclxcbi5kYXRlcGlja2VyLW5leHRCdG4ge1xcclxcbiAgcmlnaHQ6IDJweDtcXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDEwMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHQvLyBpbXBvcnQgJCBmcm9tICcuL3V0aWxzL05vZGVMaXN0LmpzJ1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICB2YWx1ZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGZvcm1hdDogeyBkZWZhdWx0OiAnTU0vZGQveXl5eScgfSxcblx0ICAgIGRpc2FibGVkRGF5c09mV2VlazogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogZnVuY3Rpb24gX2RlZmF1bHQoKSB7XG5cdCAgICAgICAgcmV0dXJuIFtdO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgd2lkdGg6IHsgdHlwZTogU3RyaW5nIC8qLCBkZWZhdWx0OiAnMjAwcHgnKi8gfSxcblx0ICAgIGNsZWFyQnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBsYW5nOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbmF2aWdhdG9yLmxhbmd1YWdlIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGljb25zRm9udDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdnbHlwaGljb24nIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjdXJyRGF0ZTogbmV3IERhdGUoKSxcblx0ICAgICAgZGF0ZVJhbmdlOiBbXSxcblx0ICAgICAgZGVjYWRlUmFuZ2U6IFtdLFxuXHQgICAgICBkaXNwbGF5RGF5VmlldzogZmFsc2UsXG5cdCAgICAgIGRpc3BsYXlNb250aFZpZXc6IGZhbHNlLFxuXHQgICAgICBkaXNwbGF5WWVhclZpZXc6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBjdXJyRGF0ZTogZnVuY3Rpb24gY3VyckRhdGUoKSB7XG5cdCAgICAgIHRoaXMuZ2V0RGF0ZVJhbmdlKCk7XG5cdCAgICB9LFxuXHQgICAgZm9ybWF0OiBmdW5jdGlvbiBmb3JtYXQoKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdGhpcy5zdHJpbmdpZnkodGhpcy5jdXJyRGF0ZSkpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHRleHQ6IGZ1bmN0aW9uIHRleHQoKSB7XG5cdCAgICAgIHJldHVybiAoMCwgX3V0aWxzLnRyYW5zbGF0aW9ucykodGhpcy5sYW5nKTtcblx0ICAgIH0sXG5cdCAgICBwcmVCdG5DbGFzc2VzOiBmdW5jdGlvbiBwcmVCdG5DbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gJ2RhdGVwaWNrZXItcHJlQnRuICcgKyB0aGlzLmljb25zRm9udCArICcgJyArIHRoaXMuaWNvbnNGb250ICsgJy1jaGV2cm9uLWxlZnQnO1xuXHQgICAgfSxcblx0ICAgIG5leHRCdG5DbGFzc2VzOiBmdW5jdGlvbiBuZXh0QnRuQ2xhc3NlcygpIHtcblx0ICAgICAgcmV0dXJuICdkYXRlcGlja2VyLW5leHRCdG4gJyArIHRoaXMuaWNvbnNGb250ICsgJyAnICsgdGhpcy5pY29uc0ZvbnQgKyAnLWNoZXZyb24tcmlnaHQnO1xuXHQgICAgfSxcblx0ICAgIGRpc2FibGVkRGF5c0FycmF5OiBmdW5jdGlvbiBkaXNhYmxlZERheXNBcnJheSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWREYXlzT2ZXZWVrLm1hcChmdW5jdGlvbiAoZCkge1xuXHQgICAgICAgIHJldHVybiBwYXJzZUludChkLCAxMCk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICB0aGlzLmRpc3BsYXlEYXlWaWV3ID0gdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZTtcblx0ICAgIH0sXG5cdCAgICBpbnB1dENsaWNrOiBmdW5jdGlvbiBpbnB1dENsaWNrKCkge1xuXHQgICAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbHVlKSB8fCB0aGlzLnBhcnNlKG5ldyBEYXRlKCkpO1xuXHQgICAgICBpZiAodGhpcy5kaXNwbGF5TW9udGhWaWV3IHx8IHRoaXMuZGlzcGxheVllYXJWaWV3KSB7XG5cdCAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSAhdGhpcy5kaXNwbGF5RGF5Vmlldztcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHREZWNhZGVDbGljazogZnVuY3Rpb24gcHJlTmV4dERlY2FkZUNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMTAsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIgKyAxMCwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHByZU5leHRNb250aENsaWNrOiBmdW5jdGlvbiBwcmVOZXh0TW9udGhDbGljayhmbGFnKSB7XG5cdCAgICAgIHZhciB5ZWFyID0gdGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpO1xuXHQgICAgICB2YXIgbW9udGggPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHZhciBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoIC0gMSk7XG5cdCAgICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB2YXIgbmV4dE1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggKyAxKTtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUobmV4dE1vbnRoLnllYXIsIG5leHRNb250aC5tb250aCwgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwcmVOZXh0WWVhckNsaWNrOiBmdW5jdGlvbiBwcmVOZXh0WWVhckNsaWNrKGZsYWcpIHtcblx0ICAgICAgdmFyIHllYXIgPSB0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aHMgPSB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCk7XG5cdCAgICAgIHZhciBkYXRlID0gdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCk7XG5cdFxuXHQgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuXHQgICAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh5ZWFyIC0gMSwgbW9udGhzLCBkYXRlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gbmV3IERhdGUoeWVhciArIDEsIG1vbnRocywgZGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB5ZWFyU2VsZWN0OiBmdW5jdGlvbiB5ZWFyU2VsZWN0KHllYXIpIHtcblx0ICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jdXJyRGF0ZSA9IG5ldyBEYXRlKHllYXIsIHRoaXMuY3VyckRhdGUuZ2V0TW9udGgoKSwgdGhpcy5jdXJyRGF0ZS5nZXREYXRlKCkpO1xuXHQgICAgfSxcblx0ICAgIGRheVNlbGVjdDogZnVuY3Rpb24gZGF5U2VsZWN0KGRheSkge1xuXHQgICAgICBpZiAoZGF5LnNjbGFzcyA9PT0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJykge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLmN1cnJEYXRlID0gZGF5LmRhdGU7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB0aGlzLnN0cmluZ2lmeSh0aGlzLmN1cnJEYXRlKSk7XG5cdCAgICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc3dpdGNoTW9udGhWaWV3OiBmdW5jdGlvbiBzd2l0Y2hNb250aFZpZXcoKSB7XG5cdCAgICAgIHRoaXMuZGlzcGxheURheVZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5TW9udGhWaWV3ID0gdHJ1ZTtcblx0ICAgIH0sXG5cdCAgICBzd2l0Y2hEZWNhZGVWaWV3OiBmdW5jdGlvbiBzd2l0Y2hEZWNhZGVWaWV3KCkge1xuXHQgICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5WWVhclZpZXcgPSB0cnVlO1xuXHQgICAgfSxcblx0ICAgIG1vbnRoU2VsZWN0OiBmdW5jdGlvbiBtb250aFNlbGVjdChpbmRleCkge1xuXHQgICAgICB0aGlzLmRpc3BsYXlNb250aFZpZXcgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5kaXNwbGF5RGF5VmlldyA9IHRydWU7XG5cdCAgICAgIHRoaXMuY3VyckRhdGUgPSBuZXcgRGF0ZSh0aGlzLmN1cnJEYXRlLmdldEZ1bGxZZWFyKCksIGluZGV4LCB0aGlzLmN1cnJEYXRlLmdldERhdGUoKSk7XG5cdCAgICB9LFxuXHQgICAgZ2V0WWVhck1vbnRoOiBmdW5jdGlvbiBnZXRZZWFyTW9udGgoeWVhciwgbW9udGgpIHtcblx0ICAgICAgaWYgKG1vbnRoID4gMTEpIHtcblx0ICAgICAgICB5ZWFyKys7XG5cdCAgICAgICAgbW9udGggPSAwO1xuXHQgICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMCkge1xuXHQgICAgICAgIHllYXItLTtcblx0ICAgICAgICBtb250aCA9IDExO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB7IHllYXI6IHllYXIsIG1vbnRoOiBtb250aCB9O1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeURlY2FkZUhlYWRlcjogZnVuY3Rpb24gc3RyaW5naWZ5RGVjYWRlSGVhZGVyKGRhdGUpIHtcblx0ICAgICAgdmFyIHllYXJTdHIgPSBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcblx0ICAgICAgdmFyIGZpcnN0WWVhck9mRGVjYWRlID0geWVhclN0ci5zdWJzdHJpbmcoMCwgeWVhclN0ci5sZW5ndGggLSAxKSArIDA7XG5cdCAgICAgIHZhciBsYXN0WWVhck9mRGVjYWRlID0gcGFyc2VJbnQoZmlyc3RZZWFyT2ZEZWNhZGUsIDEwKSArIDEwO1xuXHQgICAgICByZXR1cm4gZmlyc3RZZWFyT2ZEZWNhZGUgKyAnLScgKyBsYXN0WWVhck9mRGVjYWRlO1xuXHQgICAgfSxcblx0ICAgIHN0cmluZ2lmeURheUhlYWRlcjogZnVuY3Rpb24gc3RyaW5naWZ5RGF5SGVhZGVyKGRhdGUpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXSArICcgJyArIGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0ICAgIH0sXG5cdCAgICBwYXJzZU1vbnRoOiBmdW5jdGlvbiBwYXJzZU1vbnRoKGRhdGUpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGV4dC5tb250aHNbZGF0ZS5nZXRNb250aCgpXTtcblx0ICAgIH0sXG5cdCAgICBzdHJpbmdpZnlZZWFySGVhZGVyOiBmdW5jdGlvbiBzdHJpbmdpZnlZZWFySGVhZGVyKGRhdGUpIHtcblx0ICAgICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKTtcblx0ICAgIH0sXG5cdCAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShkYXRlKSB7XG5cdCAgICAgIHZhciBmb3JtYXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRoaXMuZm9ybWF0O1xuXHRcblx0ICAgICAgaWYgKCFkYXRlKSBkYXRlID0gdGhpcy5wYXJzZSgpO1xuXHQgICAgICBpZiAoIWRhdGUpIHJldHVybiAnJztcblx0ICAgICAgdmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cdCAgICAgIHZhciBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XG5cdCAgICAgIHZhciBkYXkgPSBkYXRlLmdldERhdGUoKTtcblx0ICAgICAgdmFyIG1vbnRoTmFtZSA9IHRoaXMucGFyc2VNb250aChkYXRlKTtcblx0XG5cdCAgICAgIHJldHVybiBmb3JtYXQucmVwbGFjZSgveXl5eS9nLCB5ZWFyKS5yZXBsYWNlKC9NTU1NL2csIG1vbnRoTmFtZSkucmVwbGFjZSgvTU1NL2csIG1vbnRoTmFtZS5zdWJzdHJpbmcoMCwgMykpLnJlcGxhY2UoL01NL2csICgnMCcgKyBtb250aCkuc2xpY2UoLTIpKS5yZXBsYWNlKC9kZC9nLCAoJzAnICsgZGF5KS5zbGljZSgtMikpLnJlcGxhY2UoL3l5L2csIHllYXIpLnJlcGxhY2UoL00oPyFhKS9nLCBtb250aCkucmVwbGFjZSgvZC9nLCBkYXkpO1xuXHQgICAgfSxcblx0ICAgIHBhcnNlOiBmdW5jdGlvbiBwYXJzZSgpIHtcblx0ICAgICAgdmFyIHN0ciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy52YWx1ZTtcblx0XG5cdCAgICAgIHZhciBkYXRlID0gdm9pZCAwO1xuXHQgICAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMTAgJiYgKHRoaXMuZm9ybWF0ID09PSAnZGQtTU0teXl5eScgfHwgdGhpcy5mb3JtYXQgPT09ICdkZC9NTS95eXl5JykpIHtcblx0ICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RyLnN1YnN0cmluZyg2LCAxMCksIHN0ci5zdWJzdHJpbmcoMywgNSkgLSAxLCBzdHIuc3Vic3RyaW5nKDAsIDIpKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RyKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gaXNOYU4oZGF0ZS5nZXRGdWxsWWVhcigpKSA/IG5ldyBEYXRlKCkgOiBkYXRlO1xuXHQgICAgfSxcblx0ICAgIGdldERheUNvdW50OiBmdW5jdGlvbiBnZXREYXlDb3VudCh5ZWFyLCBtb250aCkge1xuXHQgICAgICB2YXIgZGljdCA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcblx0ICAgICAgaWYgKG1vbnRoID09PSAxKSB7XG5cdCAgICAgICAgaWYgKHllYXIgJSA0MDAgPT09IDAgfHwgeWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCkge1xuXHQgICAgICAgICAgcmV0dXJuIDI5O1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gZGljdFttb250aF07XG5cdCAgICB9LFxuXHQgICAgZ2V0RGF0ZVJhbmdlOiBmdW5jdGlvbiBnZXREYXRlUmFuZ2UoKSB7XG5cdCAgICAgIHRoaXMuZGF0ZVJhbmdlID0gW107XG5cdCAgICAgIHRoaXMuZGVjYWRlUmFuZ2UgPSBbXTtcblx0ICAgICAgdmFyIHRpbWUgPSB7XG5cdCAgICAgICAgeWVhcjogdGhpcy5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpLFxuXHQgICAgICAgIG1vbnRoOiB0aGlzLmN1cnJEYXRlLmdldE1vbnRoKCksXG5cdCAgICAgICAgZGF5OiB0aGlzLmN1cnJEYXRlLmdldERhdGUoKVxuXHQgICAgICB9O1xuXHQgICAgICB2YXIgeWVhclN0ciA9IHRpbWUueWVhci50b1N0cmluZygpO1xuXHQgICAgICB2YXIgZmlyc3RZZWFyT2ZEZWNhZGUgPSB5ZWFyU3RyLnN1YnN0cmluZygwLCB5ZWFyU3RyLmxlbmd0aCAtIDEpICsgMCAtIDE7XG5cdCAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTI7IGkrKykge1xuXHQgICAgICAgIHRoaXMuZGVjYWRlUmFuZ2UucHVzaCh7XG5cdCAgICAgICAgICB0ZXh0OiBmaXJzdFllYXJPZkRlY2FkZSArIGlcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUodGltZS55ZWFyLCB0aW1lLm1vbnRoLCAxKTtcblx0ICAgICAgdmFyIGZpcnN0RGF5V2VlayA9IGN1cnJNb250aEZpcnN0RGF5LmdldERheSgpICsgMTtcblx0ICAgICAgaWYgKGZpcnN0RGF5V2VlayA9PT0gMCkge1xuXHQgICAgICAgIGZpcnN0RGF5V2VlayA9IDc7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIGRheUNvdW50ID0gdGhpcy5nZXREYXlDb3VudCh0aW1lLnllYXIsIHRpbWUubW9udGgpO1xuXHQgICAgICBpZiAoZmlyc3REYXlXZWVrID4gMSkge1xuXHQgICAgICAgIHZhciBwcmVNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCAtIDEpO1xuXHQgICAgICAgIHZhciBwcmV2TW9udGhEYXlDb3VudCA9IHRoaXMuZ2V0RGF5Q291bnQocHJlTW9udGgueWVhciwgcHJlTW9udGgubW9udGgpO1xuXHQgICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBmaXJzdERheVdlZWs7IF9pKyspIHtcblx0ICAgICAgICAgIHZhciBkYXlUZXh0ID0gcHJldk1vbnRoRGF5Q291bnQgLSBmaXJzdERheVdlZWsgKyBfaSArIDE7XG5cdCAgICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHByZU1vbnRoLnllYXIsIHByZU1vbnRoLm1vbnRoLCBkYXlUZXh0KTtcblx0ICAgICAgICAgIHZhciBzY2xhc3MgPSAnZGF0ZXBpY2tlci1pdGVtLWdyYXknO1xuXHQgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWREYXlzQXJyYXkuaW5kZXhPZihkYXRlLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICAgIHNjbGFzcyA9ICdkYXRlcGlja2VyLWl0ZW0tZGlzYWJsZSc7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcblx0ICAgICAgICAgICAgdGV4dDogZGF5VGV4dCxcblx0ICAgICAgICAgICAgZGF0ZTogZGF0ZSxcblx0ICAgICAgICAgICAgc2NsYXNzOiAnZGF0ZXBpY2tlci1pdGVtLWdyYXknXG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGZvciAodmFyIF9pMiA9IDE7IF9pMiA8PSBkYXlDb3VudDsgX2kyKyspIHtcblx0ICAgICAgICB2YXIgX2RhdGUgPSBuZXcgRGF0ZSh0aW1lLnllYXIsIHRpbWUubW9udGgsIF9pMik7XG5cdCAgICAgICAgdmFyIF9zY2xhc3MgPSAnJztcblx0ICAgICAgICBpZiAodGhpcy5kaXNhYmxlZERheXNBcnJheS5pbmRleE9mKF9kYXRlLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICBfc2NsYXNzID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKF9pMiA9PSB0aW1lLmRheSAmJiBfZGF0ZS5nZXRGdWxsWWVhcigpID09IHRpbWUueWVhciAmJiBfZGF0ZS5nZXRNb250aCgpID09IHRpbWUubW9udGgpIHtcblx0ICAgICAgICAgIF9zY2xhc3MgPSAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcblx0ICAgICAgICAgIHRleHQ6IF9pMixcblx0ICAgICAgICAgIGRhdGU6IF9kYXRlLFxuXHQgICAgICAgICAgc2NsYXNzOiBfc2NsYXNzXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGlmICh0aGlzLmRhdGVSYW5nZS5sZW5ndGggPCA0Mikge1xuXHQgICAgICAgIHZhciBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGg7XG5cdCAgICAgICAgdmFyIG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHRpbWUueWVhciwgdGltZS5tb250aCArIDEpO1xuXHRcblx0ICAgICAgICBmb3IgKHZhciBfaTMgPSAxOyBfaTMgPD0gbmV4dE1vbnRoTmVlZDsgX2kzKyspIHtcblx0ICAgICAgICAgIHZhciBfZGF0ZTIgPSBuZXcgRGF0ZShuZXh0TW9udGgueWVhciwgbmV4dE1vbnRoLm1vbnRoLCBfaTMpO1xuXHQgICAgICAgICAgdmFyIF9zY2xhc3MyID0gJ2RhdGVwaWNrZXItaXRlbS1ncmF5Jztcblx0ICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF5c0FycmF5LmluZGV4T2YoX2RhdGUyLmdldERheSgpKSA+IC0xKSB7XG5cdCAgICAgICAgICAgIF9zY2xhc3MyID0gJ2RhdGVwaWNrZXItaXRlbS1kaXNhYmxlJztcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuXHQgICAgICAgICAgICB0ZXh0OiBfaTMsXG5cdCAgICAgICAgICAgIGRhdGU6IF9kYXRlMixcblx0ICAgICAgICAgICAgc2NsYXNzOiBfc2NsYXNzMlxuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICB2YXIgZWwgPSB0aGlzLiRlbDtcblx0ICAgIHRoaXMuX2JsdXIgPSBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBpZiAoIWVsLmNvbnRhaW5zKGUudGFyZ2V0KSkgX3RoaXMuY2xvc2UoKTtcblx0ICAgIH07XG5cdCAgICB0aGlzLiRlbWl0KCdjaGlsZC1jcmVhdGVkJywgdGhpcyk7XG5cdCAgICB0aGlzLmN1cnJEYXRlID0gdGhpcy5wYXJzZSh0aGlzLnZhbHVlKSB8fCB0aGlzLnBhcnNlKG5ldyBEYXRlKCkpO1xuXHQgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fYmx1cik7XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTA0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2lucHV0Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sIGRhdGVwaWNrZXItaW5wdXRcIixcblx0ICAgIGNsYXNzOiB7XG5cdCAgICAgICd3aXRoLXJlc2V0LWJ1dHRvbic6IF92bS5jbGVhckJ1dHRvblxuXHQgICAgfSxcblx0ICAgIHN0eWxlOiAoe1xuXHQgICAgICB3aWR0aDogX3ZtLndpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInRleHRcIixcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0ucGxhY2Vob2xkZXJcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS52YWx1ZVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmlucHV0Q2xpY2ssXG5cdCAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLiRlbWl0KCdpbnB1dCcsICRldmVudC50YXJnZXQudmFsdWUpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgKF92bS5jbGVhckJ1dHRvbiAmJiBfdm0udmFsdWUpID8gX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS4kZW1pdCgnaW5wdXQnLCAnJylcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCBbX3ZtLl92KFwiw5dcIildKV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmRpc3BsYXlEYXlWaWV3KSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJkaXNwbGF5RGF5Vmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHRNb250aENsaWNrKDApXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5uZXh0QnRuQ2xhc3Nlcyxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5wcmVOZXh0TW9udGhDbGljaygxKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygncCcsIHtcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLnN3aXRjaE1vbnRoVmlld1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5zdHJpbmdpZnlEYXlIZWFkZXIoX3ZtLmN1cnJEYXRlKSkpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLXdlZWtSYW5nZVwiXG5cdCAgfSwgX3ZtLl9sKChfdm0udGV4dC5kYXlzT2ZXZWVrKSwgZnVuY3Rpb24odykge1xuXHQgICAgcmV0dXJuIF92bS5fYygnc3BhbicsIFtfdm0uX3YoX3ZtLl9zKHcpKV0pXG5cdCAgfSkpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItZGF0ZVJhbmdlXCJcblx0ICB9LCBfdm0uX2woKF92bS5kYXRlUmFuZ2UpLCBmdW5jdGlvbihkKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgICBjbGFzczogZC5zY2xhc3MsXG5cdCAgICAgIG9uOiB7XG5cdCAgICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAgIF92bS5kYXlTZWxlY3QoZClcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX3YoX3ZtLl9zKGQudGV4dCkpXSlcblx0ICB9KSldKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJzaG93XCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1zaG93XCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmRpc3BsYXlNb250aFZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlNb250aFZpZXdcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLXBvcHVwXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLWlubmVyXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkYXRlcGlja2VyLWJvZHlcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItY3RybFwiXG5cdCAgfSwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBfdm0ucHJlQnRuQ2xhc3Nlcyxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5wcmVOZXh0WWVhckNsaWNrKDApXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5uZXh0QnRuQ2xhc3Nlcyxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5wcmVOZXh0WWVhckNsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywge1xuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uc3dpdGNoRGVjYWRlVmlld1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5zdHJpbmdpZnlZZWFySGVhZGVyKF92bS5jdXJyRGF0ZSkpKV0pXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1tb250aFJhbmdlXCJcblx0ICB9LCBbX3ZtLl9sKChfdm0udGV4dC5tb250aHMpLCBmdW5jdGlvbihtLCBpbmRleCkge1xuXHQgICAgcmV0dXJuIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGNsYXNzOiB7XG5cdCAgICAgICAgJ2RhdGVwaWNrZXItZGF0ZVJhbmdlLWl0ZW0tYWN0aXZlJzpcblx0ICAgICAgICAoX3ZtLnRleHQubW9udGhzW192bS5wYXJzZShfdm0udmFsdWUpLmdldE1vbnRoKCldID09PSBtKSAmJlxuXHQgICAgICAgIF92bS5jdXJyRGF0ZS5nZXRGdWxsWWVhcigpID09PSBfdm0ucGFyc2UoX3ZtLnZhbHVlKS5nZXRGdWxsWWVhcigpXG5cdCAgICAgIH0sXG5cdCAgICAgIG9uOiB7XG5cdCAgICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAgIF92bS5tb250aFNlbGVjdChpbmRleClcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX3YoX3ZtLl9zKG0uc3Vic3RyKDAsIDMpKSldKV1cblx0ICB9KV0sIDIpXSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5kaXNwbGF5WWVhclZpZXcpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImRpc3BsYXlZZWFyVmlld1wiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItcG9wdXBcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItaW5uZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItYm9keVwiXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZGF0ZXBpY2tlci1jdHJsXCJcblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IF92bS5wcmVCdG5DbGFzc2VzLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnByZU5leHREZWNhZGVDbGljaygwKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBfdm0ubmV4dEJ0bkNsYXNzZXMsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0ucHJlTmV4dERlY2FkZUNsaWNrKDEpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdwJywgW192bS5fdihfdm0uX3MoX3ZtLnN0cmluZ2lmeURlY2FkZUhlYWRlcihfdm0uY3VyckRhdGUpKSldKV0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRhdGVwaWNrZXItbW9udGhSYW5nZSBkZWNhZGVSYW5nZVwiXG5cdCAgfSwgW192bS5fbCgoX3ZtLmRlY2FkZVJhbmdlKSwgZnVuY3Rpb24oZGVjYWRlKSB7XG5cdCAgICByZXR1cm4gW192bS5fYygnc3BhbicsIHtcblx0ICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAnZGF0ZXBpY2tlci1kYXRlUmFuZ2UtaXRlbS1hY3RpdmUnOiBfdm0ucGFyc2UodGhpcy52YWx1ZSkuZ2V0RnVsbFllYXIoKSA9PT0gZGVjYWRlLnRleHRcblx0ICAgICAgfSxcblx0ICAgICAgb246IHtcblx0ICAgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICAgX3ZtLnllYXJTZWxlY3QoZGVjYWRlLnRleHQpXG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl92KF92bS5fcyhkZWNhZGUudGV4dCkpXSldXG5cdCAgfSldLCAyKV0pXSldKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTQ3N2I4ZTVkXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTA1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMDcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcRHJvcGRvd24udnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTM5YmUxMDcyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zOWJlMTA3MlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIERyb3Bkb3duLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEwNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY2KTtcblx0XG5cdHZhciBfQ2xpY2tPdXRzaWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsaWNrT3V0c2lkZSk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBkaXJlY3RpdmVzOiB7XG5cdCAgICBDbGlja091dHNpZGU6IF9DbGlja091dHNpZGUyLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2l6ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2RlZmF1bHQnIH0sXG5cdCAgICB2YWx1ZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIHNob3cgPSB0aGlzLnZhbHVlO1xuXHQgICAgcmV0dXJuIHsgc2hvdzogc2hvdyB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KHZhbCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICB0aGlzLnNob3cgPSB2YWw7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYnV0dG9uU2l6ZTogZnVuY3Rpb24gYnV0dG9uU2l6ZSgpIHtcblx0ICAgICAgcmV0dXJuIH5bJ2xnJywgJ3NtJywgJ3hzJ10uaW5kZXhPZih0aGlzLnNpemUpID8gJ2J0bi0nICsgdGhpcy5zaXplIDogJyc7XG5cdCAgICB9LFxuXHQgICAgaW5JbnB1dDogZnVuY3Rpb24gaW5JbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgaXNMaTogZnVuY3Rpb24gaXNMaSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faXNUYWJzIHx8IHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51O1xuXHQgICAgfSxcblx0ICAgIG1lbnU6IGZ1bmN0aW9uIG1lbnUoKSB7XG5cdCAgICAgIHJldHVybiAhdGhpcy4kcGFyZW50IHx8IHRoaXMuJHBhcmVudC5uYXZiYXI7XG5cdCAgICB9LFxuXHQgICAgc2xvdHM6IGZ1bmN0aW9uIHNsb3RzKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc2xvdENvbnRlbnRzO1xuXHQgICAgfSxcblx0ICAgIHN1Ym1lbnU6IGZ1bmN0aW9uIHN1Ym1lbnUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQgJiYgKHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5zdWJtZW51KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcblx0ICAgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgndWwnLCB0aGlzLiRlbCkub24oJ2NsaWNrJywgJ2xpPmEnLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICBfdGhpcy5zaG93ID0gZmFsc2U7XG5cdCAgICB9KTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgndWwnLCB0aGlzLiRlbCkub2ZmKCk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTA3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoX3ZtLmlzTGkgPyAnbGknIDogJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwiY2xpY2stb3V0c2lkZVwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtY2xpY2stb3V0c2lkZVwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5ibHVyKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJibHVyXCJcblx0ICAgIH1dLFxuXHQgICAgdGFnOiBcImRpdlwiLFxuXHQgICAgY2xhc3M6IFt7XG5cdCAgICAgIG9wZW46IF92bS5zaG93LFxuXHQgICAgICBkaXNhYmxlZDogX3ZtLmRpc2FibGVkLFxuXHQgICAgICBkcm9wZG93bjogX3ZtLmlzTGksXG5cdCAgICAgICdpbnB1dC1ncm91cC1idG4nOiBfdm0uaW5JbnB1dCxcblx0ICAgICAgJ2J0bi1ncm91cCc6ICFfdm0uaXNMaSAmJiAhX3ZtLmluSW5wdXRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fdChcImJlZm9yZVwiKSwgX3ZtLl92KFwiIFwiKSwgKF92bS5pc0xpKSA/IF92bS5fYygnYScsIHtcblx0ICAgIGNsYXNzOiBbJ2Ryb3Bkb3duLXRvZ2dsZScsIF92bS5idXR0b25TaXplLCB7XG5cdCAgICAgIGRpc2FibGVkOiBfdm0uZGlzYWJsZWRcblx0ICAgIH1dLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZXNjXCIsIDI3KSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0uc2hvdyA9IGZhbHNlXG5cdCAgICAgIH0sXG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgX3ZtLnRvZ2dsZSgkZXZlbnQpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiYnV0dG9uXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50ZXh0KSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2FyZXRcIlxuXHQgIH0pXSwgMikgOiBfdm0uX2MoJ2J1dHRvbicsIHtcblx0ICAgIGNsYXNzOiBbJ2J0biBidG4tJyArIF92bS50eXBlLCBfdm0uYnV0dG9uU2l6ZSwgJ2Ryb3Bkb3duLXRvZ2dsZSddLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCIsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnNob3cgPSBmYWxzZVxuXHQgICAgICB9LFxuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS50b2dnbGUoJGV2ZW50KVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgW192bS5fdChcImJ1dHRvblwiLCBbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNhcmV0XCJcblx0ICB9KV0sIDIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkcm9wZG93bi1tZW51XCIsIFtfdm0uX2MoJ3VsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZHJvcGRvd24tbWVudVwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzliZTEwNzJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMDggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTA5KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxGb3JtR3JvdXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTc5ZWI0MDBhXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi03OWViNDAwYVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIEZvcm1Hcm91cC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvLyBsZXQgY29lcmNlID0ge1xuXHQvLyAgICAgZW50ZXJTdWJtaXQ6ICdib29sZWFuJyxcblx0Ly8gICAgIGljb246ICdib29sZWFuJ1xuXHQvLyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGVudGVyU3VibWl0OiB7XG5cdCAgICAgIHR5cGU6IEJvb2xlYW4sXG5cdCAgICAgIGRlZmF1bHQ6IGZhbHNlXG5cdCAgICB9LFxuXHQgICAgaWNvbjoge1xuXHQgICAgICB0eXBlOiBCb29sZWFuLFxuXHQgICAgICBkZWZhdWx0OiBmYWxzZVxuXHQgICAgfSxcblx0ICAgIGxhbmc6IHtcblx0ICAgICAgdHlwZTogU3RyaW5nLFxuXHQgICAgICBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2Vcblx0ICAgIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBjaGlsZHJlbjogW10sXG5cdCAgICAgIHZhbGlkOiBudWxsLFxuXHQgICAgICB0aW1lb3V0OiBudWxsXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQgJiYgdGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgdmFyIHZhbGlkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5jaGlsZHJlbi5zb21lKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHZhciB2ID0gZWwudmFsaWRhdGUgPyBlbC52YWxpZGF0ZSgpIDogZWwudmFsaWQgIT09IHVuZGVmaW5lZCA/IGVsLnZhbGlkIDogZWwucmVxdWlyZWQgJiYgIX5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZihlbC52YWx1ZSk7XG5cdCAgICAgICAgaWYgKCF2KSB2YWxpZCA9IGZhbHNlO1xuXHQgICAgICAgIHJldHVybiAhdmFsaWQ7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLnZhbGlkID0gdmFsaWQ7XG5cdCAgICAgIHJldHVybiB2YWxpZCA9PT0gdHJ1ZTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9mb3JtR3JvdXAgPSB0cnVlO1xuXHQgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcblx0ICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5fZm9ybUdyb3VwKSB7XG5cdCAgICAgIHBhcmVudCA9IHBhcmVudC4kcGFyZW50O1xuXHQgICAgfVxuXHQgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuX2Zvcm1Hcm91cCkge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHRoaXMudmFsaWRhdGUoKTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxMTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnc3BhbicsIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNzllYjQwMGFcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTEyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExMylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxGb3JtVmFsaWRhdG9yLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1iOWY1N2M0NlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtYjlmNTdjNDZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBGb3JtVmFsaWRhdG9yLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDExMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZW50ZXJTdWJtaXQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGljb246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhbmc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2UgfSxcblx0ICAgIHZhbHVlOiBudWxsXG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgY2hpbGRyZW46IFtdLFxuXHQgICAgICB2YWxpZDogbnVsbCxcblx0ICAgICAgdGltZW91dDogbnVsbFxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICB3YXRjaDoge1xuXHQgICAgdmFsaWQ6IGZ1bmN0aW9uIHZhbGlkKHZhbCwgb2xkKSB7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lzdmFsaWQnLCB2YWwpO1xuXHQgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQgJiYgdGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgdmFyIGludmFsaWQgPSAhdGhpcy5jaGlsZHJlbi5ldmVyeShmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwudmFsaWRhdGUgPyBlbC52YWxpZGF0ZSgpIDogZWwudmFsaWQgIT09IHVuZGVmaW5lZCA/IGVsLnZhbGlkIDogZWwucmVxdWlyZWQgJiYgIX5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZihlbC52YWx1ZSk7XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLnZhbGlkID0gIWludmFsaWQ7XG5cdCAgICAgIHJldHVybiAhaW52YWxpZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9mb3JtVmFsaWRhdG9yID0gdHJ1ZTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHRoaXMudmFsaWRhdGUoKTtcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07IC8vXG5cdC8vXG5cbi8qKiovIH0sXG4vKiAxMTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnc3BhbicsIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtYjlmNTdjNDZcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTE1KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTE3KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExOClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxJbnB1dC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdF9fdnVlX29wdGlvbnNfXy5fc2NvcGVJZCA9IFwiZGF0YS12LTY1MmFkN2I5XCJcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi02NTJhZDdiOVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNjUyYWQ3YjlcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBJbnB1dC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMTUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExNik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjUyYWQ3Yjkmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0lucHV0LnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNjUyYWQ3Yjkmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL0lucHV0LnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDExNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uZm9ybS1ncm91cFtkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxubGFiZWx+LmNsb3NlW2RhdGEtdi02NTJhZDdiOV0ge1xcclxcbiAgdG9wOiAyNXB4O1xcbn1cXG4uaW5wdXQtZ3JvdXA+Lmljb25bZGF0YS12LTY1MmFkN2I5XSB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xcclxcbiAgd2lkdGg6MDtcXHJcXG4gIHotaW5kZXg6IDM7XFxufVxcbi5jbG9zZVtkYXRhLXYtNjUyYWQ3YjldIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmhhcy1mZWVkYmFjayAuY2xvc2VbZGF0YS12LTY1MmFkN2I5XSB7XFxyXFxuICByaWdodDogMjBweDtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9JbnB1dC52dWU/MmM1NTRkM2RcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTBRQTtFQUNBLG1CQUFBO0NBQ0E7QUFDQTtFQUNBLFVBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxvQkFBQTtFQUNBLFFBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsT0FBQTtFQUNBLFNBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxtQkFBQTtDQUNBO0FBQ0E7RUFDQSxZQUFBO0NBQ0FcIixcImZpbGVcIjpcIklucHV0LnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIiA6Y2xhc3M9XFxcInt2YWxpZGF0ZTpjYW5WYWxpZGF0ZSwnaGFzLWZlZWRiYWNrJzppY29uLCdoYXMtZXJyb3InOmNhblZhbGlkYXRlJiZ2YWxpZD09PWZhbHNlLCdoYXMtc3VjY2Vzcyc6Y2FuVmFsaWRhdGUmJnZhbGlkfVxcXCI+XFxyXFxuICAgIDxzbG90IG5hbWU9XFxcImxhYmVsXFxcIj48bGFiZWwgdi1pZj1cXFwibGFiZWxcXFwiIGNsYXNzPVxcXCJjb250cm9sLWxhYmVsXFxcIiBAY2xpY2s9XFxcImZvY3VzXFxcIj57e2xhYmVsfX08L2xhYmVsPjwvc2xvdD5cXHJcXG4gICAgPGRpdiB2LWlmPVxcXCIkc2xvdHMuYmVmb3JlfHwkc2xvdHMuYWZ0ZXJcXFwiIGNsYXNzPVxcXCJpbnB1dC1ncm91cFxcXCI+XFxyXFxuICAgICAgPHNsb3QgbmFtZT1cXFwiYmVmb3JlXFxcIj48L3Nsb3Q+XFxyXFxuICAgICAgPHRleHRhcmVhIDppcz1cXFwidHlwZT09J3RleHRhcmVhJz90eXBlOidpbnB1dCdcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICA6Y29scz1cXFwiY29sc1xcXCJcXHJcXG4gICAgICAgIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiXFxyXFxuICAgICAgICA6bGlzdD1cXFwiaWRfZGF0YWxpc3RcXFwiXFxyXFxuICAgICAgICA6bWF4PVxcXCJhdHRyKG1heClcXFwiXFxyXFxuICAgICAgICA6bWF4bGVuZ3RoPVxcXCJtYXhsZW5ndGhcXFwiXFxyXFxuICAgICAgICA6bWluPVxcXCJhdHRyKG1pbilcXFwiXFxyXFxuICAgICAgICA6bmFtZT1cXFwibmFtZVxcXCJcXHJcXG4gICAgICAgIDpwbGFjZWhvbGRlcj1cXFwicGxhY2Vob2xkZXJcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOnJlcXVpcmVkPVxcXCJyZXF1aXJlZFxcXCJcXHJcXG4gICAgICAgIDpyb3dzPVxcXCJyb3dzXFxcIlxcclxcbiAgICAgICAgOnN0ZXA9XFxcInN0ZXBcXFwiXFxyXFxuICAgICAgICA6dGl0bGU9XFxcImF0dHIodGl0bGUpXFxcIlxcclxcbiAgICAgICAgOnR5cGU9XFxcInR5cGU9PSd0ZXh0YXJlYSc/bnVsbDp0eXBlXFxcIlxcclxcbiAgICAgICAgdi1tb2RlbD1cXFwidmFsXFxcIlxcclxcbiAgICAgICAgQGJsdXI9XFxcImVtaXRcXFwiIEBmb2N1cz1cXFwiZW1pdFxcXCIgQGlucHV0PVxcXCJlbWl0XFxcIlxcclxcbiAgICAgICAgQGtleXVwLmVudGVyPVxcXCJ0eXBlIT0ndGV4dGFyZWEnJiZlbnRlclN1Ym1pdCYmc3VibWl0KClcXFwiXFxyXFxuICAgICAgPjwvdGV4dGFyZWE+XFxyXFxuICAgICAgPGRpdiB2LWlmPVxcXCJjbGVhckJ1dHRvbiAmJiB2YWx1ZVxcXCIgOmNsYXNzPVxcXCJ7aWNvbjppY29ufVxcXCI+XFxyXFxuICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwidmFsdWUgPSAnJ1xcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgICA8ZGl2IHYtaWY9XFxcImljb25cXFwiIGNsYXNzPVxcXCJpY29uXFxcIj5cXHJcXG4gICAgICAgIDxzcGFuIHYtaWY9XFxcImljb24mJnZhbGlkIT09bnVsbFxcXCIgOmNsYXNzPVxcXCJbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCdnbHlwaGljb24tJysodmFsaWQ/J29rJzoncmVtb3ZlJyldXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcclxcbiAgICAgIDwvZGl2PlxcclxcbiAgICAgIDxzbG90IG5hbWU9XFxcImFmdGVyXFxcIj48L3Nsb3Q+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgICA8dGVtcGxhdGUgdi1lbHNlPlxcclxcbiAgICAgIDx0ZXh0YXJlYSA6aXM9XFxcInR5cGU9PSd0ZXh0YXJlYSc/dHlwZTonaW5wdXQnXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiByZWY9XFxcImlucHV0XFxcIlxcclxcbiAgICAgICAgOmNvbHM9XFxcImNvbHNcXFwiXFxyXFxuICAgICAgICA6ZGlzYWJsZWQ9XFxcImRpc2FibGVkXFxcIlxcclxcbiAgICAgICAgOmxpc3Q9XFxcImlkX2RhdGFsaXN0XFxcIlxcclxcbiAgICAgICAgOm1heD1cXFwiYXR0cihtYXgpXFxcIlxcclxcbiAgICAgICAgOm1heGxlbmd0aD1cXFwibWF4bGVuZ3RoXFxcIlxcclxcbiAgICAgICAgOm1pbj1cXFwiYXR0cihtaW4pXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cGxhY2Vob2xkZXI9XFxcInBsYWNlaG9sZGVyXFxcIlxcclxcbiAgICAgICAgOnJlYWRvbmx5PVxcXCJyZWFkb25seVxcXCJcXHJcXG4gICAgICAgIDpyZXF1aXJlZD1cXFwicmVxdWlyZWRcXFwiXFxyXFxuICAgICAgICA6cm93cz1cXFwicm93c1xcXCJcXHJcXG4gICAgICAgIDpzdGVwPVxcXCJzdGVwXFxcIlxcclxcbiAgICAgICAgOnRpdGxlPVxcXCJhdHRyKHRpdGxlKVxcXCJcXHJcXG4gICAgICAgIDp0eXBlPVxcXCJ0eXBlPT0ndGV4dGFyZWEnP251bGw6dHlwZVxcXCJcXHJcXG4gICAgICAgIHYtbW9kZWw9XFxcInZhbFxcXCJcXHJcXG4gICAgICAgIEBibHVyPVxcXCJlbWl0XFxcIiBAZm9jdXM9XFxcImVtaXRcXFwiIEBpbnB1dD1cXFwiZW1pdFxcXCJcXHJcXG4gICAgICAgIEBrZXl1cC5lbnRlcj1cXFwidHlwZSE9J3RleHRhcmVhJyYmZW50ZXJTdWJtaXQmJnN1Ym1pdCgpXFxcIlxcclxcbiAgICAgID48L3RleHRhcmVhPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImNsZWFyQnV0dG9uICYmIHZhbFxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcInZhbCA9ICcnXFxcIj4mdGltZXM7PC9zcGFuPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImljb24mJnZhbGlkIT09bnVsbFxcXCIgOmNsYXNzPVxcXCJbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCdnbHlwaGljb24tJysodmFsaWQ/J29rJzoncmVtb3ZlJyldXFxcIiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCI+PC9zcGFuPlxcclxcbiAgICA8L3RlbXBsYXRlPlxcclxcbiAgICA8ZGF0YWxpc3Qgdi1pZj1cXFwiaWRfZGF0YWxpc3RcXFwiIDppZD1cXFwiaWRfZGF0YWxpc3RcXFwiPlxcclxcbiAgICAgIDxvcHRpb24gdi1mb3I9XFxcIm9wYyBpbiBvcHRpb25zXFxcIiA6dmFsdWU9XFxcIm9wY1xcXCI+PC9vcHRpb24+XFxyXFxuICAgIDwvZGF0YWxpc3Q+XFxyXFxuICAgIDxkaXYgdi1pZj1cXFwic2hvd0hlbHBcXFwiIGNsYXNzPVxcXCJoZWxwLWJsb2NrXFxcIiBAY2xpY2s9XFxcImZvY3VzXFxcIj57e2hlbHB9fTwvZGl2PlxcclxcbiAgICA8ZGl2IHYtaWY9XFxcInNob3dFcnJvclxcXCIgY2xhc3M9XFxcImhlbHAtYmxvY2sgd2l0aC1lcnJvcnNcXFwiIEBjbGljaz1cXFwiZm9jdXNcXFwiPnt7ZXJyb3JUZXh0fX08L2Rpdj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2NvZXJjZSwgZGVsYXllciwgdHJhbnNsYXRpb25zfSBmcm9tICcuL3V0aWxzL3V0aWxzLmpzJ1xcclxcbmltcG9ydCAkIGZyb20gJy4vdXRpbHMvTm9kZUxpc3QuanMnXFxyXFxuXFxyXFxudmFyIERFTEFZID0gMzAwXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGNvbHM6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBkYXRhbGlzdDoge3R5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgZGlzYWJsZWQ6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGVudGVyU3VibWl0OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBlcnJvcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGhlbHA6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBoaWRlSGVscDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWV9LFxcclxcbiAgICBpY29uOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYWJlbDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxhbmc6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZX0sXFxyXFxuICAgIG1hc2s6IG51bGwsXFxyXFxuICAgIG1hc2tEZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMTAwfSxcXHJcXG4gICAgbWF0Y2g6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtYXg6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtYXhsZW5ndGg6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtaW46IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBtaW5sZW5ndGg6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDB9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcGF0dGVybjoge2RlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBwbGFjZWhvbGRlcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHJlYWRvbmx5OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICByZXF1aXJlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgcm93czoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogM30sXFxyXFxuICAgIHN0ZXA6IHt0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB0eXBlOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGV4dCd9LFxcclxcbiAgICB1cmw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB1cmxNYXA6IHt0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbGlkYXRpb25EZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMjUwfSxcXHJcXG4gICAgdmFsdWU6IHtkZWZhdWx0OiBudWxsfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZVxcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIG9wdGlvbnM6IHRoaXMuZGF0YWxpc3QsXFxyXFxuICAgICAgdmFsLFxcclxcbiAgICAgIHZhbGlkOiBudWxsLFxcclxcbiAgICAgIHRpbWVvdXQ6IG51bGxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGNhblZhbGlkYXRlICgpIHsgcmV0dXJuICF0aGlzLmRpc2FibGVkICYmICF0aGlzLnJlYWRvbmx5ICYmICh0aGlzLnJlcXVpcmVkIHx8IHRoaXMucmVnZXggfHwgdGhpcy5uYXRpdmVWYWxpZGF0ZSB8fCB0aGlzLm1hdGNoICE9PSBudWxsKSB9LFxcclxcbiAgICBlcnJvclRleHQgKCkge1xcclxcbiAgICAgIGxldCB2YWx1ZSA9IHRoaXMudmFsdWVcXHJcXG4gICAgICBsZXQgZXJyb3IgPSBbdGhpcy5lcnJvcl1cXHJcXG4gICAgICBpZiAoIXZhbHVlICYmIHRoaXMucmVxdWlyZWQpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0LnJlcXVpcmVkLnRvTG93ZXJDYXNlKCkgKyAnKScpXFxyXFxuICAgICAgaWYgKHZhbHVlICYmICh2YWx1ZS5sZW5ndGggPCB0aGlzLm1pbmxlbmd0aCkpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0Lm1pbkxlbmd0aC50b0xvd2VyQ2FzZSgpICsgJzogJyArIHRoaXMubWlubGVuZ3RoICsgJyknKVxcclxcbiAgICAgIHJldHVybiBlcnJvci5qb2luKCcgJylcXHJcXG4gICAgfSxcXHJcXG4gICAgaWRfZGF0YWxpc3QgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLnR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdGhpcy5kYXRhbGlzdCBpbnN0YW5jZW9mIEFycmF5KSB7XFxyXFxuICAgICAgICBpZiAoIXRoaXMuX2lkX2RhdGFsaXN0KSB7XFxyXFxuICAgICAgICAgIGlmICghdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCkgeyB0aGlzLiRyb290LmlkX2RhdGFsaXN0ID0gMCB9XFxyXFxuICAgICAgICAgIHRoaXMuX2lkX2RhdGFsaXN0ID0gJ2lucHV0LWRhdGFsaXN0JyArIHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QrK1xcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkX2RhdGFsaXN0XFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiBudWxsXFxyXFxuICAgIH0sXFxyXFxuICAgIGlucHV0ICgpIHsgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXQgfSxcXHJcXG4gICAgbmF0aXZlVmFsaWRhdGUgKCkgeyByZXR1cm4gKHRoaXMuaW5wdXQgfHwge30pLmNoZWNrVmFsaWRpdHkgJiYgKH5bJ3VybCcsICdlbWFpbCddLmluZGV4T2YodGhpcy50eXBlLnRvTG93ZXJDYXNlKCkpIHx8IHRoaXMubWluIHx8IHRoaXMubWF4KSB9LFxcclxcbiAgICByZWdleCAoKSB7IHJldHVybiBjb2VyY2UucGF0dGVybih0aGlzLnBhdHRlcm4pIH0sXFxyXFxuICAgIHNob3dFcnJvciAoKSB7IHJldHVybiB0aGlzLmVycm9yICYmIHRoaXMudmFsaWQgPT09IGZhbHNlIH0sXFxyXFxuICAgIHNob3dIZWxwICgpIHsgcmV0dXJuIHRoaXMuaGVscCAmJiAoIXRoaXMuc2hvd0Vycm9yIHx8ICF0aGlzLmhpZGVIZWxwKSB9LFxcclxcbiAgICB0ZXh0ICgpIHsgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpIH0sXFxyXFxuICAgIHRpdGxlICgpIHsgcmV0dXJuIHRoaXMuZXJyb3JUZXh0IHx8IHRoaXMuaGVscCB8fCAnJyB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgZGF0YWxpc3QgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkICYmIHZhbCBpbnN0YW5jZW9mIEFycmF5KSB7IHRoaXMub3B0aW9ucyA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIG1hdGNoICh2YWwpIHsgdGhpcy5ldmFsKCkgfSxcXHJcXG4gICAgb3B0aW9ucyAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ29wdGlvbnMnLCB2YWwpXFxyXFxuICAgIH0sXFxyXFxuICAgIHVybCAodmFsKSB7XFxyXFxuICAgICAgdGhpcy5fdXJsKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsICh2YWwsIG9sZCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkge1xcclxcbiAgICAgICAgaWYgKHRoaXMubWFzayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XFxyXFxuICAgICAgICAgIHZhbCA9IHRoaXMubWFzayh2YWwgfHwgJycpXFxyXFxuICAgICAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XFxyXFxuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzaylcXHJcXG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0Lm1hc2sgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgICAgIHRoaXMudmFsID0gdmFsXFxyXFxuICAgICAgICAgICAgfSwgaXNOYU4odGhpcy5tYXNrRGVsYXkpID8gMCA6IHRoaXMubWFza0RlbGF5KVxcclxcbiAgICAgICAgICB9XFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgICB0aGlzLmV2YWwoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKVxcclxcbiAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIGF0dHIgKHZhbHVlKSB7XFxyXFxuICAgICAgcmV0dXJuIH5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IG51bGwgOiB2YWx1ZVxcclxcbiAgICB9LFxcclxcbiAgICBlbWl0IChlKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdChlLnR5cGUsIGUudHlwZSA9PSAnaW5wdXQnID8gZS50YXJnZXQudmFsdWUgOiBlKVxcclxcbiAgICAgIGlmIChlLnR5cGUgPT09ICdibHVyJyAmJiB0aGlzLmNhblZhbGlkYXRlKSB7IHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKCkgfVxcclxcbiAgICB9LFxcclxcbiAgICBldmFsICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5fdGltZW91dC5ldmFsKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5ldmFsKVxcclxcbiAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkge1xcclxcbiAgICAgICAgdGhpcy52YWxpZCA9IHRydWVcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy5fdGltZW91dC5ldmFsID0gc2V0VGltZW91dCgoKSA9PiB7XFxyXFxuICAgICAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKClcXHJcXG4gICAgICAgICAgdGhpcy5fdGltZW91dC5ldmFsID0gbnVsbFxcclxcbiAgICAgICAgfSwgdGhpcy52YWxpZGF0aW9uRGVsYXkpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBmb2N1cyAoKSB7IHRoaXMuaW5wdXQuZm9jdXMoKSB9LFxcclxcbiAgICBzdWJtaXQgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLiRwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcXHJcXG4gICAgICAgIHJldHVybiB0aGlzLiRwYXJlbnQudmFsaWRhdGUoKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZiAodGhpcy5pbnB1dC5mb3JtKSB7XFxyXFxuICAgICAgICBjb25zdCBpbnZhbGlkcyA9ICQoJy5mb3JtLWdyb3VwLnZhbGlkYXRlOm5vdCguaGFzLXN1Y2Nlc3MpJywgdGhpcy5pbnB1dC5mb3JtKVxcclxcbiAgICAgICAgaWYgKGludmFsaWRzLmxlbmd0aCkge1xcclxcbiAgICAgICAgICBpbnZhbGlkcy5maW5kKCdpbnB1dCx0ZXh0YXJlYSxzZWxlY3QnKVswXS5mb2N1cygpXFxyXFxuICAgICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgICB0aGlzLmlucHV0LmZvcm0uc3VibWl0KClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbGlkYXRlICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMuY2FuVmFsaWRhdGUpIHsgcmV0dXJuIHRydWUgfVxcclxcbiAgICAgIGxldCB2YWx1ZSA9ICh0aGlzLnZhbCB8fCAnJykudHJpbSgpXFxyXFxuICAgICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gIXRoaXMucmVxdWlyZWQgfVxcclxcbiAgICAgIGlmICh0aGlzLm1hdGNoICE9PSBudWxsKSB7IHJldHVybiB0aGlzLm1hdGNoID09PSB2YWx1ZSB9XFxyXFxuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgaWYgKHRoaXMubmF0aXZlVmFsaWRhdGUgJiYgIXRoaXMuaW5wdXQuY2hlY2tWYWxpZGl0eSgpKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgaWYgKHRoaXMucmVnZXgpIHtcXHJcXG4gICAgICAgIGlmICghKHRoaXMucmVnZXggaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHRoaXMucmVnZXgodGhpcy52YWx1ZSkgOiB0aGlzLnJlZ2V4LnRlc3QodGhpcy52YWx1ZSkpKSB7IHJldHVybiBmYWxzZSB9XFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiB0cnVlXFxyXFxuICAgIH0sXFxyXFxuICAgIHJlc2V0KCkge1xcclxcbiAgICAgIHRoaXMudmFsdWUgPSAnJ1xcclxcbiAgICAgIHRoaXMudmFsaWQgPSBudWxsXFxyXFxuICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzaylcXHJcXG4gICAgICBpZiAodGhpcy5fdGltZW91dC5ldmFsKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5ldmFsKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX2lucHV0ID0gdHJ1ZVxcclxcbiAgICB0aGlzLl90aW1lb3V0ID0ge31cXHJcXG4gICAgbGV0IHBhcmVudCA9IHRoaXMuJHBhcmVudFxcclxcbiAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHsgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQgfVxcclxcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xcclxcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50XFxyXFxuICAgIH1cXHJcXG4gICAgdGhpcy5fdXJsID0gZGVsYXllcihmdW5jdGlvbiAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCB8fCB0aGlzLl9sb2FkaW5nKSB7IHJldHVybiB9XFxyXFxuICAgICAgdGhpcy5fbG9hZGluZyA9IHRydWVcXHJcXG4gICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihyZXNwb25zZSA9PiB7XFxyXFxuICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXVxcclxcbiAgICAgICAgdHJ5IHsgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSkgfSBjYXRjaCAoZSkge31cXHJcXG4gICAgICAgIGlmICh0aGlzLnVybE1hcCkgeyBkYXRhID0gZGF0YS5tYXAodGhpcy51cmxNYXApIH1cXHJcXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGRhdGFcXHJcXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSwgcmVzcG9uc2UgPT4ge1xcclxcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcXHJcXG4gICAgICB9KVxcclxcbiAgICB9LCBERUxBWSlcXHJcXG4gICAgaWYgKHRoaXMudXJsKSB0aGlzLl91cmwoKVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICAvLyAkKHRoaXMuaW5wdXQpLm9uKCdmb2N1cycsIGUgPT4geyB0aGlzLiRlbWl0KCdmb2N1cycsIGUpIH0pLm9uKCdibHVyJywgZSA9PiB7XFxyXFxuICAgIC8vICAgaWYgKHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XFxyXFxuICAgIC8vICAgdGhpcy4kZW1pdCgnYmx1cicsIGUpXFxyXFxuICAgIC8vIH0pXFxyXFxuICB9LFxcclxcbiAgYmVmb3JlRGVzdHJveSAoKSB7XFxyXFxuICAgIC8vICQodGhpcy5pbnB1dCkub2ZmKClcXHJcXG4gICAgaWYgKHRoaXMuX3BhcmVudCkge1xcclxcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpXFxyXFxuICAgICAgdGhpcy5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSlcXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGUgc2NvcGVkPlxcclxcbi5mb3JtLWdyb3VwIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG59XFxyXFxubGFiZWx+LmNsb3NlIHtcXHJcXG4gIHRvcDogMjVweDtcXHJcXG59XFxyXFxuLmlucHV0LWdyb3VwPi5pY29uIHtcXHJcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXHJcXG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XFxyXFxuICB3aWR0aDowO1xcclxcbiAgei1pbmRleDogMztcXHJcXG59XFxyXFxuLmNsb3NlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmhhcy1mZWVkYmFjayAuY2xvc2Uge1xcclxcbiAgcmlnaHQ6IDIwcHg7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxMTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0dmFyIERFTEFZID0gMzAwO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBjbGVhckJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgY29sczogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGRhdGFsaXN0OiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgZW50ZXJTdWJtaXQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGVycm9yOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgaGVscDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGhpZGVIZWxwOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGljb246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGxhYmVsOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgbWFzazogbnVsbCxcblx0ICAgIG1hc2tEZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDEwMCB9LFxuXHQgICAgbWF0Y2g6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtYXg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtYXhsZW5ndGg6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtaW46IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBtaW5sZW5ndGg6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG5cdCAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgcGF0dGVybjogeyBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICByZXF1aXJlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgcm93czogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDMgfSxcblx0ICAgIHN0ZXA6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RleHQnIH0sXG5cdCAgICB1cmw6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICB1cmxNYXA6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbGlkYXRpb25EZWxheTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDI1MCB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogbnVsbCB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBvcHRpb25zOiB0aGlzLmRhdGFsaXN0LFxuXHQgICAgICB2YWw6IHZhbCxcblx0ICAgICAgdmFsaWQ6IG51bGwsXG5cdCAgICAgIHRpbWVvdXQ6IG51bGxcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGNhblZhbGlkYXRlOiBmdW5jdGlvbiBjYW5WYWxpZGF0ZSgpIHtcblx0ICAgICAgcmV0dXJuICF0aGlzLmRpc2FibGVkICYmICF0aGlzLnJlYWRvbmx5ICYmICh0aGlzLnJlcXVpcmVkIHx8IHRoaXMucmVnZXggfHwgdGhpcy5uYXRpdmVWYWxpZGF0ZSB8fCB0aGlzLm1hdGNoICE9PSBudWxsKTtcblx0ICAgIH0sXG5cdCAgICBlcnJvclRleHQ6IGZ1bmN0aW9uIGVycm9yVGV4dCgpIHtcblx0ICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcblx0ICAgICAgdmFyIGVycm9yID0gW3RoaXMuZXJyb3JdO1xuXHQgICAgICBpZiAoIXZhbHVlICYmIHRoaXMucmVxdWlyZWQpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0LnJlcXVpcmVkLnRvTG93ZXJDYXNlKCkgKyAnKScpO1xuXHQgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoIDwgdGhpcy5taW5sZW5ndGgpIGVycm9yLnB1c2goJygnICsgdGhpcy50ZXh0Lm1pbkxlbmd0aC50b0xvd2VyQ2FzZSgpICsgJzogJyArIHRoaXMubWlubGVuZ3RoICsgJyknKTtcblx0ICAgICAgcmV0dXJuIGVycm9yLmpvaW4oJyAnKTtcblx0ICAgIH0sXG5cdCAgICBpZF9kYXRhbGlzdDogZnVuY3Rpb24gaWRfZGF0YWxpc3QoKSB7XG5cdCAgICAgIGlmICh0aGlzLnR5cGUgIT09ICd0ZXh0YXJlYScgJiYgdGhpcy5kYXRhbGlzdCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLl9pZF9kYXRhbGlzdCkge1xuXHQgICAgICAgICAgaWYgKCF0aGlzLiRyb290LmlkX2RhdGFsaXN0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuJHJvb3QuaWRfZGF0YWxpc3QgPSAwO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgdGhpcy5faWRfZGF0YWxpc3QgPSAnaW5wdXQtZGF0YWxpc3QnICsgdGhpcy4kcm9vdC5pZF9kYXRhbGlzdCsrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5faWRfZGF0YWxpc3Q7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9LFxuXHQgICAgaW5wdXQ6IGZ1bmN0aW9uIGlucHV0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dDtcblx0ICAgIH0sXG5cdCAgICBuYXRpdmVWYWxpZGF0ZTogZnVuY3Rpb24gbmF0aXZlVmFsaWRhdGUoKSB7XG5cdCAgICAgIHJldHVybiAodGhpcy5pbnB1dCB8fCB7fSkuY2hlY2tWYWxpZGl0eSAmJiAoflsndXJsJywgJ2VtYWlsJ10uaW5kZXhPZih0aGlzLnR5cGUudG9Mb3dlckNhc2UoKSkgfHwgdGhpcy5taW4gfHwgdGhpcy5tYXgpO1xuXHQgICAgfSxcblx0ICAgIHJlZ2V4OiBmdW5jdGlvbiByZWdleCgpIHtcblx0ICAgICAgcmV0dXJuIF91dGlscy5jb2VyY2UucGF0dGVybih0aGlzLnBhdHRlcm4pO1xuXHQgICAgfSxcblx0ICAgIHNob3dFcnJvcjogZnVuY3Rpb24gc2hvd0Vycm9yKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5lcnJvciAmJiB0aGlzLnZhbGlkID09PSBmYWxzZTtcblx0ICAgIH0sXG5cdCAgICBzaG93SGVscDogZnVuY3Rpb24gc2hvd0hlbHAoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmhlbHAgJiYgKCF0aGlzLnNob3dFcnJvciB8fCAhdGhpcy5oaWRlSGVscCk7XG5cdCAgICB9LFxuXHQgICAgdGV4dDogZnVuY3Rpb24gdGV4dCgpIHtcblx0ICAgICAgcmV0dXJuICgwLCBfdXRpbHMudHJhbnNsYXRpb25zKSh0aGlzLmxhbmcpO1xuXHQgICAgfSxcblx0ICAgIHRpdGxlOiBmdW5jdGlvbiB0aXRsZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuZXJyb3JUZXh0IHx8IHRoaXMuaGVscCB8fCAnJztcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBkYXRhbGlzdDogZnVuY3Rpb24gZGF0YWxpc3QodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkICYmIHZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgICAgdGhpcy5vcHRpb25zID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbWF0Y2g6IGZ1bmN0aW9uIG1hdGNoKHZhbCkge1xuXHQgICAgICB0aGlzLmV2YWwoKTtcblx0ICAgIH0sXG5cdCAgICBvcHRpb25zOiBmdW5jdGlvbiBvcHRpb25zKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkgdGhpcy4kZW1pdCgnb3B0aW9ucycsIHZhbCk7XG5cdCAgICB9LFxuXHQgICAgdXJsOiBmdW5jdGlvbiB1cmwodmFsKSB7XG5cdCAgICAgIHRoaXMuX3VybCgpO1xuXHQgICAgfSxcblx0ICAgIHZhbDogZnVuY3Rpb24gdmFsKF92YWwsIG9sZCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgaWYgKF92YWwgIT09IG9sZCkge1xuXHQgICAgICAgIGlmICh0aGlzLm1hc2sgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuXHQgICAgICAgICAgX3ZhbCA9IHRoaXMubWFzayhfdmFsIHx8ICcnKTtcblx0ICAgICAgICAgIGlmICh0aGlzLnZhbCAhPT0gX3ZhbCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fdGltZW91dC5tYXNrKSBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dC5tYXNrKTtcblx0ICAgICAgICAgICAgdGhpcy5fdGltZW91dC5tYXNrID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgX3RoaXMudmFsID0gX3ZhbDtcblx0ICAgICAgICAgICAgfSwgaXNOYU4odGhpcy5tYXNrRGVsYXkpID8gMCA6IHRoaXMubWFza0RlbGF5KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5ldmFsKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsKSB7XG5cdCAgICAgIGlmICh0aGlzLnZhbCAhPT0gdmFsKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGF0dHI6IGZ1bmN0aW9uIGF0dHIodmFsdWUpIHtcblx0ICAgICAgcmV0dXJuIH5bJycsIG51bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IG51bGwgOiB2YWx1ZTtcblx0ICAgIH0sXG5cdCAgICBlbWl0OiBmdW5jdGlvbiBlbWl0KGUpIHtcblx0ICAgICAgdGhpcy4kZW1pdChlLnR5cGUsIGUudHlwZSA9PSAnaW5wdXQnID8gZS50YXJnZXQudmFsdWUgOiBlKTtcblx0ICAgICAgaWYgKGUudHlwZSA9PT0gJ2JsdXInICYmIHRoaXMuY2FuVmFsaWRhdGUpIHtcblx0ICAgICAgICB0aGlzLnZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZXZhbDogZnVuY3Rpb24gX2V2YWwoKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKHRoaXMuX3RpbWVvdXQuZXZhbCkgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQuZXZhbCk7XG5cdCAgICAgIGlmICghdGhpcy5jYW5WYWxpZGF0ZSkge1xuXHQgICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuX3RpbWVvdXQuZXZhbCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgX3RoaXMyLnZhbGlkID0gX3RoaXMyLnZhbGlkYXRlKCk7XG5cdCAgICAgICAgICBfdGhpczIuX3RpbWVvdXQuZXZhbCA9IG51bGw7XG5cdCAgICAgICAgfSwgdGhpcy52YWxpZGF0aW9uRGVsYXkpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHQgICAgICB0aGlzLmlucHV0LmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgc3VibWl0OiBmdW5jdGlvbiBzdWJtaXQoKSB7XG5cdCAgICAgIGlmICh0aGlzLiRwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LnZhbGlkYXRlKCk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMuaW5wdXQuZm9ybSkge1xuXHQgICAgICAgIHZhciBpbnZhbGlkcyA9ICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKCcuZm9ybS1ncm91cC52YWxpZGF0ZTpub3QoLmhhcy1zdWNjZXNzKScsIHRoaXMuaW5wdXQuZm9ybSk7XG5cdCAgICAgICAgaWYgKGludmFsaWRzLmxlbmd0aCkge1xuXHQgICAgICAgICAgaW52YWxpZHMuZmluZCgnaW5wdXQsdGV4dGFyZWEsc2VsZWN0JylbMF0uZm9jdXMoKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5pbnB1dC5mb3JtLnN1Ym1pdCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgaWYgKCF0aGlzLmNhblZhbGlkYXRlKSB7XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH1cblx0ICAgICAgdmFyIHZhbHVlID0gKHRoaXMudmFsIHx8ICcnKS50cmltKCk7XG5cdCAgICAgIGlmICghdmFsdWUpIHtcblx0ICAgICAgICByZXR1cm4gIXRoaXMucmVxdWlyZWQ7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMubWF0Y2ggIT09IG51bGwpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5tYXRjaCA9PT0gdmFsdWU7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLm5hdGl2ZVZhbGlkYXRlICYmICF0aGlzLmlucHV0LmNoZWNrVmFsaWRpdHkoKSkge1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5yZWdleCkge1xuXHQgICAgICAgIGlmICghKHRoaXMucmVnZXggaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHRoaXMucmVnZXgodGhpcy52YWx1ZSkgOiB0aGlzLnJlZ2V4LnRlc3QodGhpcy52YWx1ZSkpKSB7XG5cdCAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfSxcblx0ICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHtcblx0ICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuXHQgICAgICB0aGlzLnZhbGlkID0gbnVsbDtcblx0ICAgICAgaWYgKHRoaXMuX3RpbWVvdXQubWFzaykgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQubWFzayk7XG5cdCAgICAgIGlmICh0aGlzLl90aW1lb3V0LmV2YWwpIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0LmV2YWwpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lucHV0ID0gdHJ1ZTtcblx0ICAgIHRoaXMuX3RpbWVvdXQgPSB7fTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgICAgdGhpcy5fdXJsID0gKDAsIF91dGlscy5kZWxheWVyKShmdW5jdGlvbiAoKSB7XG5cdCAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKCF0aGlzLnVybCB8fCAhdGhpcy4kaHR0cCB8fCB0aGlzLl9sb2FkaW5nKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlO1xuXHQgICAgICB0aGlzLiRodHRwLmdldCh0aGlzLnVybCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0ICAgICAgICB2YXIgZGF0YSA9IHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSA/IHJlc3BvbnNlLmRhdGEgOiBbXTtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdCAgICAgICAgfSBjYXRjaCAoZSkge31cblx0ICAgICAgICBpZiAoX3RoaXMzLnVybE1hcCkge1xuXHQgICAgICAgICAgZGF0YSA9IGRhdGEubWFwKF90aGlzMy51cmxNYXApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBfdGhpczMub3B0aW9ucyA9IGRhdGE7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdCAgICAgICAgX3RoaXMzLmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgfSk7XG5cdCAgICB9LCBERUxBWSk7XG5cdCAgICBpZiAodGhpcy51cmwpIHRoaXMuX3VybCgpO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIC8vICQodGhpcy5pbnB1dCkub24oJ2ZvY3VzJywgZSA9PiB7IHRoaXMuJGVtaXQoJ2ZvY3VzJywgZSkgfSkub24oJ2JsdXInLCBlID0+IHtcblx0ICAgIC8vICAgaWYgKHRoaXMuY2FuVmFsaWRhdGUpIHsgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKSB9XG5cdCAgICAvLyAgIHRoaXMuJGVtaXQoJ2JsdXInLCBlKVxuXHQgICAgLy8gfSlcblx0ICB9LFxuXHQgIGJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uIGJlZm9yZURlc3Ryb3koKSB7XG5cdCAgICAvLyAkKHRoaXMuaW5wdXQpLm9mZigpXG5cdCAgICBpZiAodGhpcy5fcGFyZW50KSB7XG5cdCAgICAgIHZhciBpbmRleCA9IHRoaXMuX3BhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpO1xuXHQgICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgIH1cblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMTggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1ncm91cFwiLFxuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgdmFsaWRhdGU6IF92bS5jYW5WYWxpZGF0ZSwgJ2hhcy1mZWVkYmFjayc6IF92bS5pY29uLCAnaGFzLWVycm9yJzogX3ZtLmNhblZhbGlkYXRlICYmIF92bS52YWxpZCA9PT0gZmFsc2UsICdoYXMtc3VjY2Vzcyc6IF92bS5jYW5WYWxpZGF0ZSAmJiBfdm0udmFsaWRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwibGFiZWxcIiwgWyhfdm0ubGFiZWwpID8gX3ZtLl9jKCdsYWJlbCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNvbnRyb2wtbGFiZWxcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxhYmVsKSldKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIChfdm0uJHNsb3RzLmJlZm9yZSB8fCBfdm0uJHNsb3RzLmFmdGVyKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaW5wdXQtZ3JvdXBcIlxuXHQgIH0sIFtfdm0uX3QoXCJiZWZvcmVcIiksIF92bS5fdihcIiBcIiksIF92bS5fYyhfdm0udHlwZSA9PSAndGV4dGFyZWEnID8gX3ZtLnR5cGUgOiAnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJpbnB1dFwiLFxuXHQgICAgdGFnOiBcInRleHRhcmVhXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiY29sc1wiOiBfdm0uY29scyxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWQsXG5cdCAgICAgIFwibGlzdFwiOiBfdm0uaWRfZGF0YWxpc3QsXG5cdCAgICAgIFwibWF4XCI6IF92bS5hdHRyKF92bS5tYXgpLFxuXHQgICAgICBcIm1heGxlbmd0aFwiOiBfdm0ubWF4bGVuZ3RoLFxuXHQgICAgICBcIm1pblwiOiBfdm0uYXR0cihfdm0ubWluKSxcblx0ICAgICAgXCJuYW1lXCI6IF92bS5uYW1lLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlcixcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJvd3NcIjogX3ZtLnJvd3MsXG5cdCAgICAgIFwic3RlcFwiOiBfdm0uc3RlcCxcblx0ICAgICAgXCJ0aXRsZVwiOiBfdm0uYXR0cihfdm0udGl0bGUpLFxuXHQgICAgICBcInR5cGVcIjogX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IG51bGwgOiBfdm0udHlwZVxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImZvY3VzXCI6IF92bS5lbWl0LFxuXHQgICAgICBcImlucHV0XCI6IFtmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnZhbCA9ICRldmVudC50YXJnZXQudmFsdWVcblx0ICAgICAgfSwgX3ZtLmVtaXRdLFxuXHQgICAgICBcImtleXVwXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS50eXBlICE9ICd0ZXh0YXJlYScgJiYgX3ZtLmVudGVyU3VibWl0ICYmIF92bS5zdWJtaXQoKVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIChfdm0uY2xlYXJCdXR0b24gJiYgX3ZtLnZhbHVlKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IHtcblx0ICAgICAgaWNvbjogX3ZtLmljb25cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbHVlID0gJydcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoXCLDl1wiKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKF92bS5pY29uKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvblwiXG5cdCAgfSwgWyhfdm0uaWNvbiAmJiBfdm0udmFsaWQgIT09IG51bGwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgY2xhc3M6IFsnZm9ybS1jb250cm9sLWZlZWRiYWNrIGdseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsaWQgPyAnb2snIDogJ3JlbW92ZScpXSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwiYWZ0ZXJcIildLCAyKSA6IFtfdm0uX2MoX3ZtLnR5cGUgPT0gJ3RleHRhcmVhJyA/IF92bS50eXBlIDogJ2lucHV0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIHRhZzogXCJ0ZXh0YXJlYVwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sXCIsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImNvbHNcIjogX3ZtLmNvbHMsXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkLFxuXHQgICAgICBcImxpc3RcIjogX3ZtLmlkX2RhdGFsaXN0LFxuXHQgICAgICBcIm1heFwiOiBfdm0uYXR0cihfdm0ubWF4KSxcblx0ICAgICAgXCJtYXhsZW5ndGhcIjogX3ZtLm1heGxlbmd0aCxcblx0ICAgICAgXCJtaW5cIjogX3ZtLmF0dHIoX3ZtLm1pbiksXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0ucGxhY2Vob2xkZXIsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5LFxuXHQgICAgICBcInJlcXVpcmVkXCI6IF92bS5yZXF1aXJlZCxcblx0ICAgICAgXCJyb3dzXCI6IF92bS5yb3dzLFxuXHQgICAgICBcInN0ZXBcIjogX3ZtLnN0ZXAsXG5cdCAgICAgIFwidGl0bGVcIjogX3ZtLmF0dHIoX3ZtLnRpdGxlKSxcblx0ICAgICAgXCJ0eXBlXCI6IF92bS50eXBlID09ICd0ZXh0YXJlYScgPyBudWxsIDogX3ZtLnR5cGVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0udmFsKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiYmx1clwiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJmb2N1c1wiOiBfdm0uZW1pdCxcblx0ICAgICAgXCJpbnB1dFwiOiBbZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKCRldmVudC50YXJnZXQuY29tcG9zaW5nKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS52YWwgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXG5cdCAgICAgIH0sIF92bS5lbWl0XSxcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzKSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0udHlwZSAhPSAndGV4dGFyZWEnICYmIF92bS5lbnRlclN1Ym1pdCAmJiBfdm0uc3VibWl0KClcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWwpID8gX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLnZhbCA9ICcnXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmljb24gJiYgX3ZtLnZhbGlkICE9PSBudWxsKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2Zvcm0tY29udHJvbC1mZWVkYmFjayBnbHlwaGljb24nLCAnZ2x5cGhpY29uLScgKyAoX3ZtLnZhbGlkID8gJ29rJyA6ICdyZW1vdmUnKV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiXG5cdCAgICB9XG5cdCAgfSkgOiBfdm0uX2UoKV0sIF92bS5fdihcIiBcIiksIChfdm0uaWRfZGF0YWxpc3QpID8gX3ZtLl9jKCdkYXRhbGlzdCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwiaWRcIjogX3ZtLmlkX2RhdGFsaXN0XG5cdCAgICB9XG5cdCAgfSwgX3ZtLl9sKChfdm0ub3B0aW9ucyksIGZ1bmN0aW9uKG9wYykge1xuXHQgICAgcmV0dXJuIF92bS5fYygnb3B0aW9uJywge1xuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwidmFsdWVcIjogb3BjXG5cdCAgICAgIH1cblx0ICAgIH0pXG5cdCAgfSkpIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0uc2hvd0hlbHApID8gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJoZWxwLWJsb2NrXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5mb2N1c1xuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5oZWxwKSldKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLnNob3dFcnJvcikgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImhlbHAtYmxvY2sgd2l0aC1lcnJvcnNcIixcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogX3ZtLmZvY3VzXG5cdCAgICB9XG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmVycm9yVGV4dCkpXSkgOiBfdm0uX2UoKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTY1MmFkN2I5XCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTE5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMClcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyMilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcTW9kYWwudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWZlN2Q1ZGM4XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1mZTdkNWRjOFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE1vZGFsLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEyMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTIxKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi1mZTdkNWRjOCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vTW9kYWwudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTIxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5tb2RhbCB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xcbn1cXG4ubW9kYWwuaW4ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwLjUpO1xcbn1cXG4ubW9kYWwuem9vbSAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbXMtdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xcclxcbiAgdG9wOiAzMDBweDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4zcztcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzO1xcbn1cXG4ubW9kYWwuem9vbS5pbiAubW9kYWwtZGlhbG9nIHtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tb3otdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcXHJcXG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtMzAwcHgsIDApO1xcclxcbiAgb3BhY2l0eTogMTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9Nb2RhbC52dWU/NDU4ZmI2OWFcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQThGQTtFQUNBLDBCQUFBO0NBQ0E7QUFDQTtFQUNBLGtDQUFBO0NBQ0E7QUFDQTtFQUNBLDhCQUFBO0VBQ0EsMkJBQUE7RUFDQSwwQkFBQTtFQUNBLHNCQUFBO0VBQ0EsV0FBQTtFQUNBLFdBQUE7RUFDQSw2QkFBQTtFQUNBLDBCQUFBO0VBQ0EscUJBQUE7Q0FDQTtBQUNBO0VBQ0EsNEJBQUE7RUFDQSx5QkFBQTtFQUNBLHdCQUFBO0VBQ0Esb0JBQUE7RUFDQSw2Q0FBQTtFQUNBLHFDQUFBO0VBQ0EsV0FBQTtDQUNBXCIsXCJmaWxlXCI6XCJNb2RhbC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiByb2xlPVxcXCJkaWFsb2dcXFwiIDpjbGFzcz1cXFwiWydtb2RhbCcsZWZmZWN0XVxcXCIgQGNsaWNrPVxcXCJiYWNrQ2xvc2VcXFwiIEB0cmFuc2l0aW9uZW5kPVxcXCJ0cmFuc2l0aW9uZW5kXFxcIj5cXHJcXG4gICAgPGRpdiA6Y2xhc3M9XFxcInsnbW9kYWwtZGlhbG9nJzp0cnVlLCdtb2RhbC1sZyc6bGFyZ2UsJ21vZGFsLXNtJzpzbWFsbH1cXFwiIHJvbGU9XFxcImRvY3VtZW50XFxcIiA6c3R5bGU9XFxcInt3aWR0aDogb3B0aW9uYWxXaWR0aH1cXFwiPlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcIm1vZGFsLWNvbnRlbnRcXFwiPlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtaGVhZGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImNsb3NlXFxcIiBAY2xpY2s9XFxcImNsb3NlXFxcIj48c3Bhbj4mdGltZXM7PC9zcGFuPjwvYnV0dG9uPlxcclxcbiAgICAgICAgICAgIDxoNCBjbGFzcz1cXFwibW9kYWwtdGl0bGVcXFwiPjxzbG90IG5hbWU9XFxcInRpdGxlXFxcIj57e3RpdGxlfX08L3Nsb3Q+PC9oND5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICA8L3Nsb3Q+XFxyXFxuICAgICAgICA8c2xvdCBuYW1lPVxcXCJtb2RhbC1ib2R5XFxcIj48ZGl2IGNsYXNzPVxcXCJtb2RhbC1ib2R5XFxcIj48c2xvdD48L3Nsb3Q+PC9kaXY+PC9zbG90PlxcclxcbiAgICAgICAgPHNsb3QgbmFtZT1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXHJcXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9kYWwtZm9vdGVyXFxcIj5cXHJcXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XFxcImJ1dHRvblxcXCIgY2xhc3M9XFxcImJ0biBidG4tZGVmYXVsdFxcXCIgQGNsaWNrPVxcXCJjbG9zZVxcXCI+e3sgY2FuY2VsVGV4dCB9fTwvYnV0dG9uPlxcclxcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBAY2xpY2s9XFxcIm9rXFxcIj57eyBva1RleHQgfX08L2J1dHRvbj5cXHJcXG4gICAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgICA8L3Nsb3Q+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvZGl2PlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmltcG9ydCB7Z2V0U2Nyb2xsQmFyV2lkdGh9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgYmFja2Ryb3A6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlfSxcXHJcXG4gICAgY2FsbGJhY2s6IHt0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGNhbmNlbFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdDbG9zZSd9LFxcclxcbiAgICBlZmZlY3Q6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBsYXJnZToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgb2tUZXh0OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnU2F2ZSBjaGFuZ2VzJ30sXFxyXFxuICAgIHNtYWxsOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICB0aXRsZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9LFxcclxcbiAgICB2YWx1ZToge3R5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlfSxcXHJcXG4gICAgd2lkdGg6IHtkZWZhdWx0OiBudWxsfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIG9wdGlvbmFsV2lkdGggKCkge1xcclxcbiAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsKSB7XFxyXFxuICAgICAgICByZXR1cm4gbnVsbFxcclxcbiAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzSW50ZWdlcih0aGlzLndpZHRoKSkge1xcclxcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKyAncHgnXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHJldHVybiB0aGlzLndpZHRoXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICB2YWx1ZSAodmFsKSB7XFxyXFxuICAgICAgdGhpcy50cmFuc2l0aW9uc3RhcnQoKVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBiYWNrQ2xvc2UgKGUpIHtcXHJcXG4gICAgICBpZiAodGhpcy5iYWNrZHJvcCAmJiBlLnRhcmdldCA9PT0gdGhpcy4kZWwpIHsgdGhpcy5jbG9zZSgpIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgY2xvc2UgKCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2NhbmNlbCcpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBmYWxzZSlcXHJcXG4gICAgfSxcXHJcXG4gICAgb2sgKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHRoaXMuY2FsbGJhY2soKVxcclxcbiAgICAgIHRoaXMuJGVtaXQoJ29rJylcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHRydWUpXFxyXFxuICAgIH0sXFxyXFxuICAgIHRyYW5zaXRpb25zdGFydCAoKSB7XFxyXFxuICAgICAgY29uc3QgZWwgPSB0aGlzLiRlbFxcclxcbiAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5XFxyXFxuICAgICAgY29uc3Qgc2Nyb2xsQmFyV2lkdGggPSBnZXRTY3JvbGxCYXJXaWR0aCgpXFxyXFxuICAgICAgaWYgKHRoaXMudmFsdWUpIHtcXHJcXG4gICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1jb250ZW50JykuZm9jdXMoKVxcclxcbiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jaydcXHJcXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZWwuY2xhc3NMaXN0LmFkZCgnaW4nKSwgMClcXHJcXG4gICAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpXFxyXFxuICAgICAgICBpZiAoc2Nyb2xsQmFyV2lkdGggIT09IDApIHtcXHJcXG4gICAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBzY3JvbGxCYXJXaWR0aCArICdweCdcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnaW4nKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfSxcXHJcXG4gICAgdHJhbnNpdGlvbmVuZCAoKSB7XFxyXFxuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XFxyXFxuICAgICAgICB0aGlzLiRlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXFxyXFxuICAgICAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuYm9keVxcclxcbiAgICAgICAgYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBudWxsXFxyXFxuICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG48c3R5bGU+XFxyXFxuLm1vZGFsIHtcXHJcXG4gIHRyYW5zaXRpb246IGFsbCAwLjNzIGVhc2U7XFxyXFxufVxcclxcbi5tb2RhbC5pbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7XFxyXFxufVxcclxcbi5tb2RhbC56b29tIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICAtbW96LXRyYW5zZm9ybTogc2NhbGUoMC4xKTtcXHJcXG4gIC1tcy10cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDAuMSk7XFxyXFxuICB0b3A6IDMwMHB4O1xcclxcbiAgb3BhY2l0eTogMDtcXHJcXG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxuICAtbW96LXRyYW5zaXRpb246IGFsbCAwLjNzO1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3M7XFxyXFxufVxcclxcbi5tb2RhbC56b29tLmluIC5tb2RhbC1kaWFsb2cge1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIC0zMDBweCwgMCk7XFxyXFxuICBvcGFjaXR5OiAxO1xcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTIyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfaXNJbnRlZ2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMjMpO1xuXHRcblx0dmFyIF9pc0ludGVnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNJbnRlZ2VyKTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGJhY2tkcm9wOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIGNhbGxiYWNrOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBjYW5jZWxUZXh0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ0Nsb3NlJyB9LFxuXHQgICAgZWZmZWN0OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgbGFyZ2U6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG9rVGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdTYXZlIGNoYW5nZXMnIH0sXG5cdCAgICBzbWFsbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfSxcblx0ICAgIHdpZHRoOiB7IGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIG9wdGlvbmFsV2lkdGg6IGZ1bmN0aW9uIG9wdGlvbmFsV2lkdGgoKSB7XG5cdCAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgIH0gZWxzZSBpZiAoKDAsIF9pc0ludGVnZXIyLmRlZmF1bHQpKHRoaXMud2lkdGgpKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKyAncHgnO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiB0aGlzLndpZHRoO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy50cmFuc2l0aW9uc3RhcnQoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJhY2tDbG9zZTogZnVuY3Rpb24gYmFja0Nsb3NlKGUpIHtcblx0ICAgICAgaWYgKHRoaXMuYmFja2Ryb3AgJiYgZS50YXJnZXQgPT09IHRoaXMuJGVsKSB7XG5cdCAgICAgICAgdGhpcy5jbG9zZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY2xvc2U6IGZ1bmN0aW9uIGNsb3NlKCkge1xuXHQgICAgICB0aGlzLiRlbWl0KCdjYW5jZWwnKTtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBmYWxzZSk7XG5cdCAgICB9LFxuXHQgICAgb2s6IGZ1bmN0aW9uIG9rKCkge1xuXHQgICAgICBpZiAodGhpcy5jYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB0aGlzLmNhbGxiYWNrKCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ29rJyk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdHJ1ZSk7XG5cdCAgICB9LFxuXHQgICAgdHJhbnNpdGlvbnN0YXJ0OiBmdW5jdGlvbiB0cmFuc2l0aW9uc3RhcnQoKSB7XG5cdCAgICAgIHZhciBlbCA9IHRoaXMuJGVsO1xuXHQgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICAgIHZhciBzY3JvbGxCYXJXaWR0aCA9ICgwLCBfdXRpbHMuZ2V0U2Nyb2xsQmFyV2lkdGgpKCk7XG5cdCAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG5cdCAgICAgICAgZWwucXVlcnlTZWxlY3RvcignLm1vZGFsLWNvbnRlbnQnKS5mb2N1cygpO1xuXHQgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgcmV0dXJuIGVsLmNsYXNzTGlzdC5hZGQoJ2luJyk7XG5cdCAgICAgICAgfSwgMCk7XG5cdCAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG5cdCAgICAgICAgaWYgKHNjcm9sbEJhcldpZHRoICE9PSAwKSB7XG5cdCAgICAgICAgICBib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHNjcm9sbEJhcldpZHRoICsgJ3B4Jztcblx0ICAgICAgICB9XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgnaW4nKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHRyYW5zaXRpb25lbmQ6IGZ1bmN0aW9uIHRyYW5zaXRpb25lbmQoKSB7XG5cdCAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuXHQgICAgICAgIHRoaXMuJGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cdCAgICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXHQgICAgICAgIGJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gbnVsbDtcblx0ICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDEyMyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNCksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuLyoqKi8gfSxcbi8qIDEyNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMjUpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNykuTnVtYmVyLmlzSW50ZWdlcjtcblxuLyoqKi8gfSxcbi8qIDEyNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG5cdHZhciAkZXhwb3J0ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0XG5cdCRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywge2lzSW50ZWdlcjogX193ZWJwYWNrX3JlcXVpcmVfXygxMjYpfSk7XG5cbi8qKiovIH0sXG4vKiAxMjYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIDIwLjEuMi4zIE51bWJlci5pc0ludGVnZXIobnVtYmVyKVxuXHR2YXIgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKVxuXHQgICwgZmxvb3IgICAgPSBNYXRoLmZsb29yO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCl7XG5cdCAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxMjcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsnbW9kYWwnLCBfdm0uZWZmZWN0XSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImRpYWxvZ1wiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uYmFja0Nsb3NlLFxuXHQgICAgICBcInRyYW5zaXRpb25lbmRcIjogX3ZtLnRyYW5zaXRpb25lbmRcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczoge1xuXHQgICAgICAnbW9kYWwtZGlhbG9nJzogdHJ1ZSwgJ21vZGFsLWxnJzogX3ZtLmxhcmdlLCAnbW9kYWwtc20nOiBfdm0uc21hbGxcblx0ICAgIH0sXG5cdCAgICBzdHlsZTogKHtcblx0ICAgICAgd2lkdGg6IF92bS5vcHRpb25hbFdpZHRoXG5cdCAgICB9KSxcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwicm9sZVwiOiBcImRvY3VtZW50XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1jb250ZW50XCJcblx0ICB9LCBbX3ZtLl90KFwibW9kYWwtaGVhZGVyXCIsIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm1vZGFsLWhlYWRlclwiXG5cdCAgfSwgW192bS5fYygnYnV0dG9uJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiY2xvc2VcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uY2xvc2Vcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9jKCdzcGFuJywgW192bS5fdihcIsOXXCIpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdoNCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm1vZGFsLXRpdGxlXCJcblx0ICB9LCBbX3ZtLl90KFwidGl0bGVcIiwgW192bS5fdihfdm0uX3MoX3ZtLnRpdGxlKSldKV0sIDIpXSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl90KFwibW9kYWwtYm9keVwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1ib2R5XCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXSksIF92bS5fdihcIiBcIiksIF92bS5fdChcIm1vZGFsLWZvb3RlclwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJtb2RhbC1mb290ZXJcIlxuXHQgIH0sIFtfdm0uX2MoJ2J1dHRvbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJ0biBidG4tZGVmYXVsdFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS5jbG9zZVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5jYW5jZWxUZXh0KSldKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJidG4gYnRuLXByaW1hcnlcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImJ1dHRvblwiXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0ub2tcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0ub2tUZXh0KSldKV0pXSldLCAyKV0pXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtZmU3ZDVkYzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxMjggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTI5KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzMClcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxOYXZiYXIudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTM4ZjA2MTllXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0zOGYwNjE5ZVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIE5hdmJhci52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9Ob2RlTGlzdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05vZGVMaXN0KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGVmYXVsdCcgfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBpZDogJ2JzLWV4YW1wbGUtbmF2YmFyLWNvbGxhcHNlLTEnLFxuXHQgICAgICBjb2xsYXBzZWQ6IHRydWUsXG5cdCAgICAgIHN0eWxlczoge31cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHNsb3RzOiBmdW5jdGlvbiBzbG90cygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3Nsb3RDb250ZW50cztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZUNvbGxhcHNlOiBmdW5jdGlvbiB0b2dnbGVDb2xsYXBzZShlKSB7XG5cdCAgICAgIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7XG5cdCAgICB0aGlzLl9uYXZiYXIgPSB0cnVlO1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgdHJ5IHtcblx0ICAgICAgKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgJGRyb3Bkb3duID0gKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bj5bZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScsIF90aGlzLiRlbCkucGFyZW50KCk7XG5cdCAgICAgICAgaWYgKCRkcm9wZG93bikge1xuXHQgICAgICAgICAgJGRyb3Bkb3duLm9uKCdjbGljaycsICcuZHJvcGRvd24tdG9nZ2xlJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QudG9nZ2xlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub24oJ2NsaWNrJywgJy5kcm9wZG93bi1tZW51PmxpPmEnLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgICAkZHJvcGRvd24uZWFjaChmdW5jdGlvbiAoY29udGVudCkge1xuXHQgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSkub25CbHVyKGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICAgICRkcm9wZG93bi5lYWNoKGZ1bmN0aW9uIChjb250ZW50KSB7XG5cdCAgICAgICAgICAgICAgaWYgKCFjb250ZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KSgpO1xuXHQgICAgfSBjYXRjaCAoZXgpIHtcblx0ICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGZpbmRpbmcgZHJvcGRvd24nKTtcblx0ICAgIH1cblx0XG5cdCAgICAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLiRlbCkub24oJ2NsaWNrIHRvdWNoc3RhcnQnLCAnbGk6bm90KC5kcm9wZG93bik+YScsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIF90aGlzLmNvbGxhcHNlZCA9IHRydWU7XG5cdCAgICAgIH0sIDIwMCk7XG5cdCAgICB9KS5vbkJsdXIoZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgaWYgKCFfdGhpcy4kZWwuY29udGFpbnMoZS50YXJnZXQpKSB7XG5cdCAgICAgICAgX3RoaXMuY29sbGFwc2VkID0gdHJ1ZTtcblx0ICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICB2YXIgaGVpZ2h0ID0gdGhpcy4kZWwub2Zmc2V0SGVpZ2h0O1xuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAndG9wJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdUb3AgPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMucGxhY2VtZW50ID09PSAnYm90dG9tJykge1xuXHQgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdCb3R0b20gPSBoZWlnaHQgKyAncHgnO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgcmV0dXJuIF90aGlzLnRvZ2dsZUNvbGxhcHNlKGUpO1xuXHQgICAgfSk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgKDAsIF9Ob2RlTGlzdDIuZGVmYXVsdCkoJy5kcm9wZG93bicsIHRoaXMuJGVsKS5vZmYoJ2NsaWNrJykub2ZmQmx1cigpO1xuXHQgICAgaWYgKHRoaXMuJHNsb3RzLmNvbGxhcHNlKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCB0aGlzLiRlbCkub2ZmKCdjbGljaycpO1xuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDEzMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCduYXYnLCB7XG5cdCAgICBjbGFzczogWyduYXZiYXInLCAnbmF2YmFyLScgKyBfdm0udHlwZSwgX3ZtLnBsYWNlbWVudCA9PT0gJ3N0YXRpYycgPyAnbmF2YmFyLXN0YXRpYy10b3AnIDogJ25hdmJhci1maXhlZC0nICsgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJjb250YWluZXItZmx1aWRcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5hdmJhci1oZWFkZXJcIlxuXHQgIH0sIFsoIV92bS4kc2xvdHMuY29sbGFwc2UpID8gX3ZtLl9jKCdidXR0b24nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXZiYXItdG9nZ2xlIGNvbGxhcHNlZFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwiYnV0dG9uXCIsXG5cdCAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiBcImZhbHNlXCJcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IF92bS50b2dnbGVDb2xsYXBzZVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJzci1vbmx5XCJcblx0ICB9LCBbX3ZtLl92KFwiVG9nZ2xlIG5hdmlnYXRpb25cIildKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdzcGFuJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwiaWNvbi1iYXJcIlxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJpY29uLWJhclwiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb24tYmFyXCJcblx0ICB9KV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImNvbGxhcHNlXCIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJicmFuZFwiKV0sIDIpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGNsYXNzOiBbJ25hdmJhci1jb2xsYXBzZScsIHtcblx0ICAgICAgY29sbGFwc2U6IF92bS5jb2xsYXBzZWRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJuYXYgbmF2YmFyLW5hdlwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIildLCAyKSwgX3ZtLl92KFwiIFwiKSwgKF92bS4kc2xvdHMubGVmdCkgPyBfdm0uX2MoJ3VsJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibmF2IG5hdmJhci1uYXYgbmF2YmFyLWxlZnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJsZWZ0XCIpXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKF92bS4kc2xvdHMucmlnaHQpID8gX3ZtLl9jKCd1bCcsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5hdiBuYXZiYXItbmF2IG5hdmJhci1yaWdodFwiXG5cdCAgfSwgW192bS5fdChcInJpZ2h0XCIpXSwgMikgOiBfdm0uX2UoKV0pXSldKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0zOGYwNjE5ZVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzIpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTMzKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXE9wdGlvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNDIwODgxMTZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTQyMDg4MTE2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gT3B0aW9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDEzMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHsgdmFsdWU6IG51bGwgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHsgbG9hZGluZzogdHJ1ZSB9O1xuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLiRwYXJlbnQuX3NlbGVjdCkge1xuXHQgICAgICBpZiAoIXRoaXMuJHBhcmVudC5vcHRpb25zKSB7XG5cdCAgICAgICAgdGhpcy4kcGFyZW50Lm9wdGlvbnMgPSBbXTtcblx0ICAgICAgfVxuXHQgICAgICB2YXIgZWwgPSB7fTtcblx0ICAgICAgZWxbdGhpcy4kcGFyZW50Lm9wdGlvbnNMYWJlbF0gPSB0aGlzLiRlbC5pbm5lckhUTUw7XG5cdCAgICAgIGVsW3RoaXMuJHBhcmVudC5vcHRpb25zVmFsdWVdID0gdGhpcy52YWx1ZTtcblx0ICAgICAgdGhpcy4kcGFyZW50Lm9wdGlvbnMucHVzaChlbCk7XG5cdCAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgY29uc29sZS53YXJuKCdvcHRpb25zIG9ubHkgd29yayBpbnNpZGUgYSBzZWxlY3QgY29tcG9uZW50Jyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTMzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiAoX3ZtLmxvYWRpbmcpID8gX3ZtLl9jKCdsaScsIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMikgOiBfdm0uX2UoKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi00MjA4ODExNlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxMzUpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMzcpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTM4KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFBhbmVsLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi1iMWUwNDYxYVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtYjFlMDQ2MWFcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBQYW5lbC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxMzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzNik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtYjFlMDQ2MWEhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1BhbmVsLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtYjFlMDQ2MWEhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1BhbmVsLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4uYWNjb3JkaW9uLXRvZ2dsZSB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcbi5jb2xsYXBzZS1lbnRlci1hY3RpdmUsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgLjVzIGVhc2U7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbn1cXG4uY29sbGFwc2UtZW50ZXIsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxufVxcclxcblxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvUGFuZWwudnVlPzYwZTc5OGUyXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUF5RUE7RUFDQSxnQkFBQTtDQUNBO0FBQ0E7O0VBRUEseUJBQUE7RUFDQSxpQkFBQTtDQUNBO0FBQ0E7O0NBR0FcIixcImZpbGVcIjpcIlBhbmVsLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IDpjbGFzcz1cXFwiWydwYW5lbCcscGFuZWxUeXBlXVxcXCI+XFxyXFxuICAgIDxkaXYgOmNsYXNzPVxcXCJbJ3BhbmVsLWhlYWRpbmcnLHsnYWNjb3JkaW9uLXRvZ2dsZSc6aW5BY2NvcmRpb259XVxcXCIgQGNsaWNrLnByZXZlbnQ9XFxcImluQWNjb3JkaW9uJiZ0b2dnbGUoKVxcXCI+XFxyXFxuICAgICAgPHNsb3QgbmFtZT1cXFwiaGVhZGVyXFxcIj48aDQgY2xhc3M9XFxcInBhbmVsLXRpdGxlXFxcIj57eyBoZWFkZXIgfX08L2g0Pjwvc2xvdD5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDx0cmFuc2l0aW9uXFxyXFxuICAgICAgbmFtZT1cXFwiY29sbGFwc2VcXFwiXFxyXFxuICAgICAgQGVudGVyPVxcXCJlbnRlclxcXCJcXHJcXG4gICAgICBAYWZ0ZXItZW50ZXI9XFxcImFmdGVyRW50ZXJcXFwiXFxyXFxuICAgICAgQGJlZm9yZS1sZWF2ZT1cXFwiYmVmb3JlTGVhdmVcXFwiXFxyXFxuICAgID5cXHJcXG4gICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1jb2xsYXBzZVxcXCIgdi1pZj1cXFwib3BlblxcXCI+XFxyXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJwYW5lbC1ib2R5XFxcIj5cXHJcXG4gICAgICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICAgICAgPC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvdHJhbnNpdGlvbj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBpc09wZW46IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgdHlwZToge3R5cGU6IFN0cmluZywgZGVmYXVsdCA6IG51bGx9XFxyXFxuICB9LFxcclxcbiAgZGF0YSgpIHtcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBvcGVuOiB0aGlzLmlzT3BlblxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaXNPcGVuKCB2YWwgKSB7XFxyXFxuICAgICAgdGhpcy5vcGVuID0gdmFsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBpbkFjY29yZGlvbiAoKSB7IHJldHVybiB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50Ll9pc0FjY29yZGlvbiB9LFxcclxcbiAgICBwYW5lbFR5cGUgKCkgeyByZXR1cm4gJ3BhbmVsLScgKyAodGhpcy50eXBlIHx8ICh0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LnR5cGUpIHx8ICdkZWZhdWx0JykgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgdG9nZ2xlICgpIHtcXHJcXG4gICAgICB0aGlzLm9wZW4gPSAhdGhpcy5vcGVuXFxyXFxuICAgICAgaWYgKHRoaXMuaW5BY2NvcmRpb24pIHtcXHJcXG4gICAgICAgIHRoaXMuJHBhcmVudC5vcGVuQ2hpbGQodGhpcylcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIGVudGVyIChlbCkge1xcclxcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJ1xcclxcbiAgICAgIHZhciBlbmRXaWR0aCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodFxcclxcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICcwcHgnXFxyXFxuICAgICAgZWwub2Zmc2V0SGVpZ2h0IC8vIGZvcmNlIHJlcGFpbnRcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSBlbmRXaWR0aDtcXHJcXG4gICAgfSxcXHJcXG4gICAgYWZ0ZXJFbnRlciAoZWwpIHtcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0bydcXHJcXG4gICAgfSxcXHJcXG4gICAgYmVmb3JlTGVhdmUgKGVsKSB7XFxyXFxuICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCkuaGVpZ2h0XFxyXFxuICAgICAgZWwub2Zmc2V0SGVpZ2h0IC8vIGZvcmNlIHJlcGFpbnRcXHJcXG4gICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnMHB4J1xcclxcbiAgICB9LFxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICBpZiAodGhpcy5pc09wZW4gPT09IG51bGwpIHtcXHJcXG4gICAgICB0aGlzLm9wZW4gPSAhdGhpcy5pbkFjY29yZGlvblxcclxcbiAgICB9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4uYWNjb3JkaW9uLXRvZ2dsZSB7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcbi5jb2xsYXBzZS1lbnRlci1hY3RpdmUsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICB0cmFuc2l0aW9uOiBhbGwgLjVzIGVhc2U7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbn1cXHJcXG4uY29sbGFwc2UtZW50ZXIsXFxyXFxuLmNvbGxhcHNlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxMzcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBoZWFkZXI6IHsgdHlwZTogU3RyaW5nIH0sXG5cdCAgICBpc09wZW46IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIG9wZW46IHRoaXMuaXNPcGVuXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIHdhdGNoOiB7XG5cdCAgICBpc09wZW46IGZ1bmN0aW9uIGlzT3Blbih2YWwpIHtcblx0ICAgICAgdGhpcy5vcGVuID0gdmFsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluQWNjb3JkaW9uOiBmdW5jdGlvbiBpbkFjY29yZGlvbigpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuX2lzQWNjb3JkaW9uO1xuXHQgICAgfSxcblx0ICAgIHBhbmVsVHlwZTogZnVuY3Rpb24gcGFuZWxUeXBlKCkge1xuXHQgICAgICByZXR1cm4gJ3BhbmVsLScgKyAodGhpcy50eXBlIHx8IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSB8fCAnZGVmYXVsdCcpO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIHRoaXMub3BlbiA9ICF0aGlzLm9wZW47XG5cdCAgICAgIGlmICh0aGlzLmluQWNjb3JkaW9uKSB7XG5cdCAgICAgICAgdGhpcy4kcGFyZW50Lm9wZW5DaGlsZCh0aGlzKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGVudGVyOiBmdW5jdGlvbiBlbnRlcihlbCkge1xuXHQgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG5cdCAgICAgIHZhciBlbmRXaWR0aCA9IGdldENvbXB1dGVkU3R5bGUoZWwpLmhlaWdodDtcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG5cdCAgICAgIGVsLm9mZnNldEhlaWdodDsgLy8gZm9yY2UgcmVwYWludFxuXHQgICAgICBlbC5zdHlsZS5oZWlnaHQgPSBlbmRXaWR0aDtcblx0ICAgIH0sXG5cdCAgICBhZnRlckVudGVyOiBmdW5jdGlvbiBhZnRlckVudGVyKGVsKSB7XG5cdCAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcblx0ICAgIH0sXG5cdCAgICBiZWZvcmVMZWF2ZTogZnVuY3Rpb24gYmVmb3JlTGVhdmUoZWwpIHtcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbCkuaGVpZ2h0O1xuXHQgICAgICBlbC5vZmZzZXRIZWlnaHQ7IC8vIGZvcmNlIHJlcGFpbnRcblx0ICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgaWYgKHRoaXMuaXNPcGVuID09PSBudWxsKSB7XG5cdCAgICAgIHRoaXMub3BlbiA9ICF0aGlzLmluQWNjb3JkaW9uO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDEzOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWydwYW5lbCcsIF92bS5wYW5lbFR5cGVdXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgY2xhc3M6IFsncGFuZWwtaGVhZGluZycsIHtcblx0ICAgICAgJ2FjY29yZGlvbi10b2dnbGUnOiBfdm0uaW5BY2NvcmRpb25cblx0ICAgIH1dLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0uaW5BY2NvcmRpb24gJiYgX3ZtLnRvZ2dsZSgpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl90KFwiaGVhZGVyXCIsIFtfdm0uX2MoJ2g0Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicGFuZWwtdGl0bGVcIlxuXHQgIH0sIFtfdm0uX3YoX3ZtLl9zKF92bS5oZWFkZXIpKV0pXSldLCAyKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6IFwiY29sbGFwc2VcIlxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiZW50ZXJcIjogX3ZtLmVudGVyLFxuXHQgICAgICBcImFmdGVyLWVudGVyXCI6IF92bS5hZnRlckVudGVyLFxuXHQgICAgICBcImJlZm9yZS1sZWF2ZVwiOiBfdm0uYmVmb3JlTGVhdmVcblx0ICAgIH1cblx0ICB9LCBbKF92bS5vcGVuKSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicGFuZWwtY29sbGFwc2VcIlxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBhbmVsLWJvZHlcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKSA6IF92bS5fZSgpXSldLCAxKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1iMWUwNDYxYVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDEzOSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxNDApXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDIpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ0KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFBvcG92ZXIudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTI0NjViZjU0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi0yNDY1YmY1NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFBvcG92ZXIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTQwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDEpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTI0NjViZjU0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Qb3BvdmVyLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtMjQ2NWJmNTQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1BvcG92ZXIudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTQxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5wb3BvdmVyLnRvcCxcXHJcXG4ucG9wb3Zlci5sZWZ0LFxcclxcbi5wb3BvdmVyLnJpZ2h0LFxcclxcbi5wb3BvdmVyLmJvdHRvbSB7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXG59XFxuLnNjYWxlLWVudGVyIHtcXHJcXG4gIGFuaW1hdGlvbjpzY2FsZS1pbiAwLjE1cyBlYXNlLWluO1xcbn1cXG4uc2NhbGUtbGVhdmUtYWN0aXZlIHtcXHJcXG4gIGFuaW1hdGlvbjpzY2FsZS1vdXQgMC4xNXMgZWFzZS1vdXQ7XFxufVxcbkBrZXlmcmFtZXMgc2NhbGUtaW4ge1xcbjAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxufVxcbn1cXG5Aa2V5ZnJhbWVzIHNjYWxlLW91dCB7XFxuMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvUG9wb3Zlci52dWU/ZTYxNjk2M2FcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQXlCQTs7OztFQUlBLGVBQUE7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxvQkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxvQkFBQTtJQUNBLFdBQUE7Q0FDQTtBQUNBO0lBQ0Esb0JBQUE7SUFDQSxXQUFBO0NBQ0E7Q0FDQVwiLFwiZmlsZVwiOlwiUG9wb3Zlci52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPHNwYW4gcmVmPVxcXCJ0cmlnZ2VyXFxcIj5cXHJcXG4gICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8dHJhbnNpdGlvbiA6bmFtZT1cXFwiZWZmZWN0XFxcIj5cXHJcXG4gICAgICA8ZGl2IHJlZj1cXFwicG9wb3ZlclxcXCIgdi1pZj1cXFwic2hvd1xcXCIgOmNsYXNzPVxcXCJbJ3BvcG92ZXInLHBsYWNlbWVudF1cXFwiPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXJyb3dcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGgzIGNsYXNzPVxcXCJwb3BvdmVyLXRpdGxlXFxcIiB2LWlmPVxcXCJ0aXRsZVxcXCI+PHNsb3QgbmFtZT1cXFwidGl0bGVcXFwiPnt7dGl0bGV9fTwvc2xvdD48L2gzPlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwicG9wb3Zlci1jb250ZW50XFxcIj48c2xvdCBuYW1lPVxcXCJjb250ZW50XFxcIj48c3BhbiB2LWh0bWw9XFxcImNvbnRlbnRcXFwiPjwvc3Bhbj48L3Nsb3Q+PC9kaXY+XFxyXFxuICAgICAgPC9kaXY+XFxyXFxuICAgIDwvdHJhbnNpdGlvbj5cXHJcXG4gIDwvc3Bhbj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IFBvcG92ZXJNaXhpbiBmcm9tICcuL3V0aWxzL3BvcG92ZXJNaXhpbnMuanMnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgbWl4aW5zOiBbUG9wb3Zlck1peGluXSxcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIHRyaWdnZXI6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljayd9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4ucG9wb3Zlci50b3AsXFxyXFxuLnBvcG92ZXIubGVmdCxcXHJcXG4ucG9wb3Zlci5yaWdodCxcXHJcXG4ucG9wb3Zlci5ib3R0b20ge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxufVxcclxcbi5zY2FsZS1lbnRlciB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtaW4gMC4xNXMgZWFzZS1pbjtcXHJcXG59XFxyXFxuLnNjYWxlLWxlYXZlLWFjdGl2ZSB7XFxyXFxuICBhbmltYXRpb246c2NhbGUtb3V0IDAuMTVzIGVhc2Utb3V0O1xcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNjYWxlLWluIHtcXHJcXG4gIDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xcclxcbiAgICBvcGFjaXR5OiAxO1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIHNjYWxlLW91dCB7XFxyXFxuICAwJSB7XFxyXFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XFxyXFxuICAgIG9wYWNpdHk6IDE7XFxyXFxuICB9XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwKTtcXHJcXG4gICAgb3BhY2l0eTogMDtcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE0MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3BvcG92ZXJNaXhpbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0Myk7XG5cdFxuXHR2YXIgX3BvcG92ZXJNaXhpbnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9wb3Zlck1peGlucyk7XG5cdFxuXHRmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIG1peGluczogW19wb3BvdmVyTWl4aW5zMi5kZWZhdWx0XSxcblx0ICBwcm9wczoge1xuXHQgICAgdHJpZ2dlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljaycgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDE0MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX05vZGVMaXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0XG5cdHZhciBfTm9kZUxpc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTm9kZUxpc3QpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgY29udGVudDogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIGVmZmVjdDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdmYWRlJyB9LFxuXHQgICAgaGVhZGVyOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcblx0ICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0b3AnIH0sXG5cdCAgICB0aXRsZTogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHRyaWdnZXI6IHsgdHlwZTogU3RyaW5nIH1cblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB0b3A6IDAsXG5cdCAgICAgIGxlZnQ6IDAsXG5cdCAgICAgIHNob3c6IGZhbHNlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBldmVudHM6IGZ1bmN0aW9uIGV2ZW50cygpIHtcblx0ICAgICAgcmV0dXJuIHsgY29udGV4dG1lbnU6IFsnY29udGV4dG1lbnUnXSwgaG92ZXI6IFsnbW91c2VsZWF2ZScsICdtb3VzZWVudGVyJ10sIGZvY3VzOiBbJ2JsdXInLCAnZm9jdXMnXSB9W3RoaXMudHJpZ2dlcl0gfHwgWydjbGljayddO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbWV0aG9kczoge1xuXHQgICAgYmVmb3JlRW50ZXI6IGZ1bmN0aW9uIGJlZm9yZUVudGVyKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdGhpcy5wb3NpdGlvbigpO1xuXHQgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gX3RoaXMucG9zaXRpb24oKTtcblx0ICAgICAgfSwgMzApO1xuXHQgICAgfSxcblx0ICAgIHBvc2l0aW9uOiBmdW5jdGlvbiBwb3NpdGlvbigpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICB0aGlzLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHBvcG92ZXIgPSBfdGhpczIuJHJlZnMucG9wb3Zlcjtcblx0ICAgICAgICB2YXIgdHJpZ2dlciA9IF90aGlzMi4kcmVmcy50cmlnZ2VyLmNoaWxkcmVuWzBdO1xuXHQgICAgICAgIHN3aXRjaCAoX3RoaXMyLnBsYWNlbWVudCkge1xuXHQgICAgICAgICAgY2FzZSAndG9wJzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgLSBwb3BvdmVyLm9mZnNldFdpZHRoIC8gMiArIHRyaWdnZXIub2Zmc2V0V2lkdGggLyAyO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgLSBwb3BvdmVyLm9mZnNldEhlaWdodDtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlICdsZWZ0Jzpcblx0ICAgICAgICAgICAgX3RoaXMyLmxlZnQgPSB0cmlnZ2VyLm9mZnNldExlZnQgLSBwb3BvdmVyLm9mZnNldFdpZHRoO1xuXHQgICAgICAgICAgICBfdGhpczIudG9wID0gdHJpZ2dlci5vZmZzZXRUb3AgKyB0cmlnZ2VyLm9mZnNldEhlaWdodCAvIDIgLSBwb3BvdmVyLm9mZnNldEhlaWdodCAvIDI7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSAncmlnaHQnOlxuXHQgICAgICAgICAgICBfdGhpczIubGVmdCA9IHRyaWdnZXIub2Zmc2V0TGVmdCArIHRyaWdnZXIub2Zmc2V0V2lkdGg7XG5cdCAgICAgICAgICAgIF90aGlzMi50b3AgPSB0cmlnZ2VyLm9mZnNldFRvcCArIHRyaWdnZXIub2Zmc2V0SGVpZ2h0IC8gMiAtIHBvcG92ZXIub2Zmc2V0SGVpZ2h0IC8gMjtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlICdib3R0b20nOlxuXHQgICAgICAgICAgICBfdGhpczIubGVmdCA9IHRyaWdnZXIub2Zmc2V0TGVmdCAtIHBvcG92ZXIub2Zmc2V0V2lkdGggLyAyICsgdHJpZ2dlci5vZmZzZXRXaWR0aCAvIDI7XG5cdCAgICAgICAgICAgIF90aGlzMi50b3AgPSB0cmlnZ2VyLm9mZnNldFRvcCArIHRyaWdnZXIub2Zmc2V0SGVpZ2h0O1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgIGNvbnNvbGUud2FybignV3JvbmcgcGxhY2VtZW50IHByb3AnKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcG9wb3Zlci5zdHlsZS50b3AgPSBfdGhpczIudG9wICsgJ3B4Jztcblx0ICAgICAgICBwb3BvdmVyLnN0eWxlLmxlZnQgPSBfdGhpczIubGVmdCArICdweCc7XG5cdCAgICAgIH0pO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKGUpIHtcblx0ICAgICAgaWYgKGUgJiYgdGhpcy50cmlnZ2VyID09PSAnY29udGV4dG1lbnUnKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgIHRoaXMuc2hvdyA9ICF0aGlzLnNob3c7XG5cdCAgICAgIGlmICh0aGlzLnNob3cpIHRoaXMuYmVmb3JlRW50ZXIoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG5cdCAgICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgICB2YXIgdHJpZ2dlciA9IHRoaXMuJHJlZnMudHJpZ2dlci5jaGlsZHJlblswXTtcblx0ICAgIGlmICghdHJpZ2dlcikgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHRyaWdnZXIgdi1lbCBpbiB5b3VyIGNvbXBvbmVudCB0aGF0IHVzZXMgcG9wb3Zlck1peGluLicpO1xuXHRcblx0ICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycgJiYgIX50cmlnZ2VyLnRhYkluZGV4KSB7XG5cdCAgICAgIHRyaWdnZXIgPSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSgnYSxpbnB1dCxzZWxlY3QsdGV4dGFyZWEsYnV0dG9uJywgdHJpZ2dlcik7XG5cdCAgICAgIGlmICghdHJpZ2dlci5sZW5ndGgpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHRoaXMuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICgwLCBfTm9kZUxpc3QyLmRlZmF1bHQpKHRyaWdnZXIpLm9uKGV2ZW50LCBfdGhpczMudG9nZ2xlKTtcblx0ICAgIH0pO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl90cmlnZ2VyKSAoMCwgX05vZGVMaXN0Mi5kZWZhdWx0KSh0aGlzLl90cmlnZ2VyKS5vZmYoKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxNDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdG1vZHVsZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24gKCl7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7XG5cdCAgcmV0dXJuIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHJlZjogXCJ0cmlnZ2VyXCJcblx0ICB9LCBbX3ZtLl90KFwiZGVmYXVsdFwiKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCd0cmFuc2l0aW9uJywge1xuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJuYW1lXCI6IF92bS5lZmZlY3Rcblx0ICAgIH1cblx0ICB9LCBbKF92bS5zaG93KSA/IF92bS5fYygnZGl2Jywge1xuXHQgICAgcmVmOiBcInBvcG92ZXJcIixcblx0ICAgIGNsYXNzOiBbJ3BvcG92ZXInLCBfdm0ucGxhY2VtZW50XVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImFycm93XCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgKF92bS50aXRsZSkgPyBfdm0uX2MoJ2gzJywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwicG9wb3Zlci10aXRsZVwiXG5cdCAgfSwgW192bS5fdChcInRpdGxlXCIsIFtfdm0uX3YoX3ZtLl9zKF92bS50aXRsZSkpXSldLCAyKSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcInBvcG92ZXItY29udGVudFwiXG5cdCAgfSwgW192bS5fdChcImNvbnRlbnRcIiwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhfdm0uY29udGVudClcblx0ICAgIH1cblx0ICB9KV0pXSwgMildKSA6IF92bS5fZSgpXSldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi0yNDY1YmY1NFwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE0NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNDYpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQ3KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFByb2dyZXNzYmFyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi02OGFhMzM3NVwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNjhhYTMzNzVcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBQcm9ncmVzc2Jhci52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNDYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBhbmltYXRlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFiZWw6IHsgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIG5vdzogeyByZXF1aXJlZDogdHJ1ZSB9LFxuXHQgICAgc3RyaXBlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgdHlwZTogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGxhYmVsQm9vbDogZnVuY3Rpb24gbGFiZWxCb29sKCkge1xuXHQgICAgICByZXR1cm4gX3V0aWxzLmNvZXJjZS5ib29sZWFuKHRoaXMubGFiZWwpO1xuXHQgICAgfSxcblx0ICAgIG5vd051bTogZnVuY3Rpb24gbm93TnVtKCkge1xuXHQgICAgICByZXR1cm4gX3V0aWxzLmNvZXJjZS5udW1iZXIodGhpcy5ub3cpO1xuXHQgICAgfVxuXHQgIH1cblx0fTsgLy9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblxuLyoqKi8gfSxcbi8qIDE0NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBjbGFzczogWydwcm9ncmVzcy1iYXInLCAncHJvZ3Jlc3MtYmFyLScgKyBfdm0udHlwZSwge1xuXHQgICAgICBhY3RpdmU6IF92bS5hbmltYXRlZCxcblx0ICAgICAgJ3Byb2dyZXNzLWJhci1zdHJpcGVkJzogX3ZtLnN0cmlwZWRcblx0ICAgIH1dLFxuXHQgICAgc3R5bGU6ICh7XG5cdCAgICAgIHdpZHRoOiBfdm0ubm93TnVtICsgJyUnXG5cdCAgICB9KSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidGV4dENvbnRlbnRcIjogX3ZtLl9zKF92bS5sYWJlbEJvb2wgPyBfdm0ubm93TnVtICsgJyUnIDogbnVsbClcblx0ICAgIH1cblx0ICB9KVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi02OGFhMzM3NVwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE0OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxNDkpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTEpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTUyKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFJhZGlvLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi03NGNmZDkyY1wiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtNzRjZmQ5MmNcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBSYWRpby52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1MCk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzRjZmQ5MmMhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1JhZGlvLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzRjZmQ5MmMhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1JhZGlvLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG4ucmFkaW8geyBwb3NpdGlvbjogcmVsYXRpdmU7XFxufVxcbi5yYWRpbyA+IGxhYmVsID4gaW5wdXQge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICB6LWluZGV4OiAtMTtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxufVxcbi5yYWRpbyA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAuMTVyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IC43cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxufVxcbi5yYWRpbzpub3QoLmFjdGl2ZSkgPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xcbn1cXG4ucmFkaW8gPiBsYWJlbCA+IGlucHV0OmZvY3VzIH4gLmljb24ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcbn1cXG4ucmFkaW8uYWN0aXZlID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lQanhqYVhKamJHVWdZM2c5SWpVaUlHTjVQU0kxSWlCeVBTSTBJaUJtYVd4c1BTSWpabVptSWk4K1BDOXpkbWMrKTtcXG59XFxuLnJhZGlvLmFjdGl2ZSAuYnRuLWRlZmF1bHQgeyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTtcXG59XFxuLnJhZGlvLmRpc2FibGVkID4gbGFiZWwgPiAuaWNvbixcXHJcXG4ucmFkaW8ucmVhZG9ubHkgPiBsYWJlbCA+IC5pY29uLFxcclxcbi5idG4ucmVhZG9ubHkge1xcclxcbiAgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTY1KTtcXHJcXG4gIGJveC1zaGFkb3c6IG5vbmU7XFxyXFxuICBvcGFjaXR5OiAuNjU7XFxufVxcbmxhYmVsLmJ0biA+IGlucHV0W3R5cGU9cmFkaW9dIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9SYWRpby52dWU/MjZkZTYxODRcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQW1HQSxTQUFBLG1CQUFBO0NBQUE7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsVUFBQTtFQUNBLFdBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLHVCQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLFFBQUE7RUFDQSxlQUFBO0VBQ0EsY0FBQTtFQUNBLGVBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0VBQ0EscUJBQUE7RUFDQSw2QkFBQTtFQUNBLG1DQUFBO0VBQ0EseUJBQUE7Q0FDQTtBQUNBO0VBQ0EsdUJBQUE7RUFDQSx1QkFBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsMEJBQUE7RUFDQSwwRUFBQTtDQUNBO0FBQ0E7RUFDQSwyQkFBQTtFQUNBLDhPQUFBO0NBQ0E7QUFDQSw2QkFBQSx3QkFBQTtDQUFBO0FBRUE7OztFQUdBLDBCQUFBO0VBQ0EsaUJBQUE7RUFDQSxhQUFBO0NBQ0E7QUFDQTtFQUNBLG1CQUFBO0VBQ0Esb0JBQUE7RUFDQSxxQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJSYWRpby52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiA6aXM9XFxcImJ1dHRvblN0eWxlPydsYWJlbCc6J2RpdidcXFwiIEBjbGljay5wcmV2ZW50PVxcXCJ0b2dnbGVcXFwiXFxyXFxuICAgIDpjbGFzcz1cXFwiWyhidXR0b25TdHlsZT8nYnRuIGJ0bi0nK3R5cGVDb2xvcjoncmFkaW8gJyt0eXBlQ29sb3IpLHthY3RpdmU6YWN0aXZlLGRpc2FibGVkOmRpc2FibGVkLHJlYWRvbmx5OnJlYWRvbmx5fV1cXFwiXFxyXFxuICA+XFxyXFxuICAgIDx0ZW1wbGF0ZSB2LWlmPVxcXCJidXR0b25TdHlsZVxcXCI+XFxyXFxuICAgICAgPGlucHV0IHR5cGU9XFxcInJhZGlvXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJpbnB1dFxcXCJcXHJcXG4gICAgICAgIHYtc2hvdz1cXFwiIXJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgdi1tb2RlbD1cXFwiY2hlY2tcXFwiXFxyXFxuICAgICAgICA6dmFsdWU9XFxcImNoZWNrZWRWYWx1ZVxcXCJcXHJcXG4gICAgICAgIDpuYW1lPVxcXCJuYW1lXFxcIlxcclxcbiAgICAgICAgOnJlYWRvbmx5PVxcXCJyZWFkb25seVxcXCJcXHJcXG4gICAgICAgIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiXFxyXFxuICAgICAgLz5cXHJcXG4gICAgICA8c2xvdD48L3Nsb3Q+XFxyXFxuICAgIDwvdGVtcGxhdGU+XFxyXFxuICAgIDxsYWJlbCB2LWVsc2UgY2xhc3M9XFxcIm9wZW5cXFwiPlxcclxcbiAgICAgIDxpbnB1dCB0eXBlPVxcXCJyYWRpb1xcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiIHJlZj1cXFwiaW5wdXRcXFwiXFxyXFxuICAgICAgICB2LW1vZGVsPVxcXCJjaGVja1xcXCJcXHJcXG4gICAgICAgIDp2YWx1ZT1cXFwiY2hlY2tlZFZhbHVlXFxcIlxcclxcbiAgICAgICAgOm5hbWU9XFxcIm5hbWVcXFwiXFxyXFxuICAgICAgICA6cmVhZG9ubHk9XFxcInJlYWRvbmx5XFxcIlxcclxcbiAgICAgICAgOmRpc2FibGVkPVxcXCJkaXNhYmxlZFxcXCJcXHJcXG4gICAgICAvPlxcclxcbiAgICAgIDxzcGFuIGNsYXNzPVxcXCJpY29uIGRyb3Bkb3duLXRvZ2dsZVxcXCIgOmNsYXNzPVxcXCJbYWN0aXZlPydidG4tJyt0eXBlQ29sb3I6Jycse2JnOnR5cGVDb2xvcj09PSdkZWZhdWx0J31dXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNwYW4gdi1pZj1cXFwiYWN0aXZlJiZ0eXBlQ29sb3I9PT0nZGVmYXVsdCdcXFwiIGNsYXNzPVxcXCJpY29uXFxcIj48L3NwYW4+XFxyXFxuICAgICAgPHNsb3Q+PC9zbG90PlxcclxcbiAgICA8L2xhYmVsPlxcclxcbiAgPC9kaXY+XFxyXFxuPC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGJ1dHRvbjoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgY2hlY2tlZFZhbHVlOiB7ZGVmYXVsdDogdHJ1ZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgcmVhZG9ubHk6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHR5cGU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGNoZWNrOiB0aGlzLnZhbHVlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBhY3RpdmUgKCkgeyByZXR1cm4gdGhpcy5jaGVjayA9PT0gdGhpcy5jaGVja2VkVmFsdWUgfSxcXHJcXG4gICAgcGFyZW50VmFsdWUgKCkgeyByZXR1cm4gdGhpcy5faW5Hcm91cCA/IHRoaXMuJHBhcmVudC52YWwgPT09IHRoaXMudmFsdWUgOiBudWxsIH0sXFxyXFxuICAgIGJ1dHRvblN0eWxlICgpIHsgcmV0dXJuIHRoaXMuYnV0dG9uIHx8ICh0aGlzLl9pbkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zKSB9LFxcclxcbiAgICB0eXBlQ29sb3IgKCkgeyByZXR1cm4gKHRoaXMudHlwZSB8fCAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC50eXBlKSkgfHwgJ2RlZmF1bHQnIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBjaGVjayAodmFsKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuY2hlY2tlZFZhbHVlID09PSB2YWwpIHtcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hlY2tlZCcsIHRydWUpXFxyXFxuICAgICAgICBpZiAodGhpcy5faW5Hcm91cCkgeyB0aGlzLiRwYXJlbnQudmFsID0gdmFsIH1cXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHBhcmVudFZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy5jaGVjayAhPT0gdmFsICYmIHRoaXMuY2hlY2tlZFZhbHVlID09PSB2YWwpIHsgdGhpcy5jaGVjayA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICB0aGlzLmNoZWNrID0gdGhpcy5jaGVja2VkVmFsdWUgPT09IHZhbCA/IHZhbCA6IG51bGxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB2YXIgcGFyZW50ID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9idG5Hcm91cCAmJiAhcGFyZW50Ll9jaGVja2JveEdyb3VwKSB7XFxyXFxuICAgICAgdGhpcy5faW5Hcm91cCA9IHRydWVcXHJcXG4gICAgICBwYXJlbnQuX3JhZGlvR3JvdXAgPSB0cnVlXFxyXFxuICAgIH1cXHJcXG4gICAgaWYgKHRoaXMuJHBhcmVudC5fcmFkaW9Hcm91cCkge1xcclxcbiAgICAgIGlmICh0aGlzLiRwYXJlbnQudmFsKSB7XFxyXFxuICAgICAgICB0aGlzLmNoZWNrID0gKHRoaXMuJHBhcmVudC52YWwgPT09IHRoaXMuY2hlY2tlZFZhbHVlKVxcclxcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGVjaykge1xcclxcbiAgICAgICAgdGhpcy4kcGFyZW50LnZhbCA9IHRoaXMuY2hlY2tlZFZhbHVlXFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBmb2N1cyAoKSB7XFxyXFxuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXFxyXFxuICAgIH0sXFxyXFxuICAgIHRvZ2dsZSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsgcmV0dXJuIH1cXHJcXG4gICAgICB0aGlzLmZvY3VzKClcXHJcXG4gICAgICBpZiAodGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLmNoZWNrZWRWYWx1ZVxcclxcbiAgICAgIGlmICh0aGlzLl9pbkdyb3VwKSB7XFxyXFxuICAgICAgICB0aGlzLiRwYXJlbnQudmFsID0gdGhpcy5jaGVja2VkVmFsdWVcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlIHNjb3BlPlxcclxcbi5yYWRpbyB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgfVxcclxcbi5yYWRpbyA+IGxhYmVsID4gaW5wdXQge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG9wYWNpdHk6IDA7XFxyXFxuICB6LWluZGV4OiAtMTtcXHJcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxyXFxufVxcclxcbi5yYWRpbyA+IGxhYmVsID4gLmljb24ge1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgdG9wOiAuMTVyZW07XFxyXFxuICBsZWZ0OiAwO1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICB3aWR0aDogMS40cmVtO1xcclxcbiAgaGVpZ2h0OiAxLjRyZW07XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICB1c2VyLXNlbGVjdDogbm9uZTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IC43cmVtO1xcclxcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcXHJcXG4gIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDUwJSA1MCU7XFxyXFxufVxcclxcbi5yYWRpbzpub3QoLmFjdGl2ZSkgPiBsYWJlbCA+IC5pY29uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjYmJiO1xcclxcbn1cXHJcXG4ucmFkaW8gPiBsYWJlbCA+IGlucHV0OmZvY3VzIH4gLmljb24ge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlcjogMXB4IHNvbGlkICM2NmFmZTk7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcclxcbn1cXHJcXG4ucmFkaW8uYWN0aXZlID4gbGFiZWwgPiAuaWNvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLXNpemU6IDFyZW0gMXJlbTtcXHJcXG4gIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lQanhqYVhKamJHVWdZM2c5SWpVaUlHTjVQU0kxSWlCeVBTSTBJaUJtYVd4c1BTSWpabVptSWk4K1BDOXpkbWMrKTtcXHJcXG59XFxyXFxuLnJhZGlvLmFjdGl2ZSAuYnRuLWRlZmF1bHQgeyBmaWx0ZXI6IGJyaWdodG5lc3MoNzUlKTsgfVxcclxcblxcclxcbi5yYWRpby5kaXNhYmxlZCA+IGxhYmVsID4gLmljb24sXFxyXFxuLnJhZGlvLnJlYWRvbmx5ID4gbGFiZWwgPiAuaWNvbixcXHJcXG4uYnRuLnJlYWRvbmx5IHtcXHJcXG4gIGZpbHRlcjogYWxwaGEob3BhY2l0eT02NSk7XFxyXFxuICBib3gtc2hhZG93OiBub25lO1xcclxcbiAgb3BhY2l0eTogLjY1O1xcclxcbn1cXHJcXG5sYWJlbC5idG4gPiBpbnB1dFt0eXBlPXJhZGlvXSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICBjbGlwOiByZWN0KDAsMCwwLDApO1xcclxcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIHByb3BzOiB7XG5cdCAgICBidXR0b246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGNoZWNrZWRWYWx1ZTogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGNoZWNrOiB0aGlzLnZhbHVlXG5cdCAgICB9O1xuXHQgIH0sXG5cdFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuY2hlY2sgPT09IHRoaXMuY2hlY2tlZFZhbHVlO1xuXHQgICAgfSxcblx0ICAgIHBhcmVudFZhbHVlOiBmdW5jdGlvbiBwYXJlbnRWYWx1ZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX2luR3JvdXAgPyB0aGlzLiRwYXJlbnQudmFsID09PSB0aGlzLnZhbHVlIDogbnVsbDtcblx0ICAgIH0sXG5cdCAgICBidXR0b25TdHlsZTogZnVuY3Rpb24gYnV0dG9uU3R5bGUoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmJ1dHRvbiB8fCB0aGlzLl9pbkdyb3VwICYmIHRoaXMuJHBhcmVudC5idXR0b25zO1xuXHQgICAgfSxcblx0ICAgIHR5cGVDb2xvcjogZnVuY3Rpb24gdHlwZUNvbG9yKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50eXBlIHx8IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQudHlwZSB8fCAnZGVmYXVsdCc7XG5cdCAgICB9XG5cdCAgfSxcblx0ICB3YXRjaDoge1xuXHQgICAgY2hlY2s6IGZ1bmN0aW9uIGNoZWNrKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy5jaGVja2VkVmFsdWUgPT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgICAgICB0aGlzLiRlbWl0KCdjaGVja2VkJywgdHJ1ZSk7XG5cdCAgICAgICAgaWYgKHRoaXMuX2luR3JvdXApIHtcblx0ICAgICAgICAgIHRoaXMuJHBhcmVudC52YWwgPSB2YWw7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcGFyZW50VmFsdWU6IGZ1bmN0aW9uIHBhcmVudFZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy5jaGVjayAhPT0gdmFsICYmIHRoaXMuY2hlY2tlZFZhbHVlID09PSB2YWwpIHtcblx0ICAgICAgICB0aGlzLmNoZWNrID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICB0aGlzLmNoZWNrID0gdGhpcy5jaGVja2VkVmFsdWUgPT09IHZhbCA/IHZhbCA6IG51bGw7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdmFyIHBhcmVudCA9IHRoaXMuJHBhcmVudDtcblx0ICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9idG5Hcm91cCAmJiAhcGFyZW50Ll9jaGVja2JveEdyb3VwKSB7XG5cdCAgICAgIHRoaXMuX2luR3JvdXAgPSB0cnVlO1xuXHQgICAgICBwYXJlbnQuX3JhZGlvR3JvdXAgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKHRoaXMuJHBhcmVudC5fcmFkaW9Hcm91cCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50LnZhbCkge1xuXHQgICAgICAgIHRoaXMuY2hlY2sgPSB0aGlzLiRwYXJlbnQudmFsID09PSB0aGlzLmNoZWNrZWRWYWx1ZTtcblx0ICAgICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrKSB7XG5cdCAgICAgICAgdGhpcy4kcGFyZW50LnZhbCA9IHRoaXMuY2hlY2tlZFZhbHVlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0XG5cdCAgbWV0aG9kczoge1xuXHQgICAgZm9jdXM6IGZ1bmN0aW9uIGZvY3VzKCkge1xuXHQgICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKCk7XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlOiBmdW5jdGlvbiB0b2dnbGUoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuZm9jdXMoKTtcblx0ICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5jaGVjayA9IHRoaXMuY2hlY2tlZFZhbHVlO1xuXHQgICAgICBpZiAodGhpcy5faW5Hcm91cCkge1xuXHQgICAgICAgIHRoaXMuJHBhcmVudC52YWwgPSB0aGlzLmNoZWNrZWRWYWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDE1MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKF92bS5idXR0b25TdHlsZSA/ICdsYWJlbCcgOiAnZGl2Jywge1xuXHQgICAgdGFnOiBcImRpdlwiLFxuXHQgICAgY2xhc3M6IFsoX3ZtLmJ1dHRvblN0eWxlID8gJ2J0biBidG4tJyArIF92bS50eXBlQ29sb3IgOiAncmFkaW8gJyArIF92bS50eXBlQ29sb3IpLCB7XG5cdCAgICAgIGFjdGl2ZTogX3ZtLmFjdGl2ZSxcblx0ICAgICAgZGlzYWJsZWQ6IF92bS5kaXNhYmxlZCxcblx0ICAgICAgcmVhZG9ubHk6IF92bS5yZWFkb25seVxuXHQgICAgfV0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS50b2dnbGUoJGV2ZW50KVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uYnV0dG9uU3R5bGUpID8gW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LXNob3dcIixcblx0ICAgICAgdmFsdWU6ICghX3ZtLnJlYWRvbmx5KSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCIhcmVhZG9ubHlcIlxuXHQgICAgfSwge1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5jaGVjayksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiY2hlY2tcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwiaW5wdXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInJhZGlvXCIsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCIsXG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJyZWFkb25seVwiOiBfdm0ucmVhZG9ubHksXG5cdCAgICAgIFwiZGlzYWJsZWRcIjogX3ZtLmRpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJ2YWx1ZVwiOiBfdm0uY2hlY2tlZFZhbHVlLFxuXHQgICAgICBcImNoZWNrZWRcIjogX3ZtLl9xKF92bS5jaGVjaywgX3ZtLmNoZWNrZWRWYWx1ZSlcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jaGVjayA9IF92bS5jaGVja2VkVmFsdWVcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpXSA6IF92bS5fYygnbGFiZWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJvcGVuXCJcblx0ICB9LCBbX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwibW9kZWxcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LW1vZGVsXCIsXG5cdCAgICAgIHZhbHVlOiAoX3ZtLmNoZWNrKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJjaGVja1wiXG5cdCAgICB9XSxcblx0ICAgIHJlZjogXCJpbnB1dFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwicmFkaW9cIixcblx0ICAgICAgXCJhdXRvY29tcGxldGVcIjogXCJvZmZcIixcblx0ICAgICAgXCJuYW1lXCI6IF92bS5uYW1lLFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seSxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5jaGVja2VkVmFsdWUsXG5cdCAgICAgIFwiY2hlY2tlZFwiOiBfdm0uX3EoX3ZtLmNoZWNrLCBfdm0uY2hlY2tlZFZhbHVlKVxuXHQgICAgfSxcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgX3ZtLmNoZWNrID0gX3ZtLmNoZWNrZWRWYWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb24gZHJvcGRvd24tdG9nZ2xlXCIsXG5cdCAgICBjbGFzczogW192bS5hY3RpdmUgPyAnYnRuLScgKyBfdm0udHlwZUNvbG9yIDogJycsIHtcblx0ICAgICAgYmc6IF92bS50eXBlQ29sb3IgPT09ICdkZWZhdWx0J1xuXHQgICAgfV1cblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgKF92bS5hY3RpdmUgJiYgX3ZtLnR5cGVDb2xvciA9PT0gJ2RlZmF1bHQnKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImljb25cIlxuXHQgIH0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRlZmF1bHRcIildLCAyKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTc0Y2ZkOTJjXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTUzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE1NClcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1Nilcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTcpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcU2VsZWN0LnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0X192dWVfb3B0aW9uc19fLl9zY29wZUlkID0gXCJkYXRhLXYtZTUxNGRiYzZcIlxuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LWU1MTRkYmM2XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi1lNTE0ZGJjNlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFNlbGVjdC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1NSk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtZTUxNGRiYzYmc2NvcGVkPXRydWUhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1NlbGVjdC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LWU1MTRkYmM2JnNjb3BlZD10cnVlIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TZWxlY3QudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTU1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlW2RhdGEtdi1lNTE0ZGJjNl17XFxyXFxuICBoZWlnaHQ6IGF1dG87XFxyXFxuICBwYWRkaW5nLXJpZ2h0OiAyNHB4O1xcbn1cXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZVtkYXRhLXYtZTUxNGRiYzZdOmFmdGVye1xcclxcbiAgY29udGVudDogJyAnO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgcmlnaHQ6IDEzcHg7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIG1hcmdpbjogLTFweCAwIDA7XFxyXFxuICBib3JkZXItdG9wOiA0cHggZGFzaGVkO1xcclxcbiAgYm9yZGVyLXRvcDogNHB4IHNvbGlkIFxcXFw5O1xcclxcbiAgYm9yZGVyLXJpZ2h0OiA0cHggc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxuICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xcbn1cXG4uYnMtc2VhcmNoYm94W2RhdGEtdi1lNTE0ZGJjNl0ge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgbWFyZ2luOiA0cHggOHB4O1xcbn1cXG4uYnMtc2VhcmNoYm94IC5jbG9zZVtkYXRhLXYtZTUxNGRiYzZdIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXG59XFxuLmJzLXNlYXJjaGJveCBpbnB1dFtkYXRhLXYtZTUxNGRiYzZdOmZvY3VzLFxcclxcbi5mb3JtLWNvbnRyb2wuZHJvcGRvd24tdG9nZ2xlW2RhdGEtdi1lNTE0ZGJjNl06Zm9jdXMge1xcclxcbiAgb3V0bGluZTogMDtcXHJcXG4gIGJvcmRlci1jb2xvcjogIzY2YWZlOSAhaW1wb3J0YW50O1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtcXG59XFxuLnNlY3JldFtkYXRhLXYtZTUxNGRiYzZdIHtcXHJcXG4gIGJvcmRlcjogMDtcXHJcXG4gIGNsaXA6IHJlY3QoMCAwIDAgMCk7XFxyXFxuICBoZWlnaHQ6IDFweDtcXHJcXG4gIG1hcmdpbjogLTFweDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgd2lkdGg6IDFweDtcXG59XFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU+LmNsb3NlW2RhdGEtdi1lNTE0ZGJjNl0geyBtYXJnaW4tbGVmdDogNXB4O1xcbn1cXG4ubm90aWZ5Lm91dFtkYXRhLXYtZTUxNGRiYzZdIHsgcG9zaXRpb246IHJlbGF0aXZlO1xcbn1cXG4ubm90aWZ5LmluW2RhdGEtdi1lNTE0ZGJjNl0sXFxyXFxuLm5vdGlmeT5kaXZbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB3aWR0aDogOTYlO1xcclxcbiAgbWFyZ2luOiAwIDIlO1xcclxcbiAgbWluLWhlaWdodDogMjZweDtcXHJcXG4gIHBhZGRpbmc6IDNweCA1cHg7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgI2UzZTNlMztcXHJcXG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNSk7XFxyXFxuICBwb2ludGVyLWV2ZW50czogbm9uZTtcXG59XFxuLm5vdGlmeT5kaXZbZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICB0b3A6IDVweDtcXHJcXG4gIHotaW5kZXg6IDE7XFxufVxcbi5ub3RpZnkuaW5bZGF0YS12LWU1MTRkYmM2XSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXHJcXG4gIGJvdHRvbTogNXB4O1xcbn1cXG4uYnRuLWdyb3VwLWp1c3RpZmllZCAuZHJvcGRvd24tdG9nZ2xlPnNwYW5bZGF0YS12LWU1MTRkYmM2XTpub3QoLmNsb3NlKSB7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gMThweCk7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogLTRweDtcXG59XFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLW1lbnVbZGF0YS12LWU1MTRkYmM2XSB7IHdpZHRoOiAxMDAlO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1NlbGVjdC52dWU/M2VkNWE0MjJcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQW1RQTtFQUNBLGFBQUE7RUFDQSxvQkFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsU0FBQTtFQUNBLGlCQUFBO0VBQ0EsdUJBQUE7RUFDQSx5QkFBQTtFQUNBLG9DQUFBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxnQkFBQTtDQUNBO0FBQ0E7RUFDQSxtQkFBQTtFQUNBLE9BQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLGVBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7Q0FDQTtBQUNBOztFQUVBLFdBQUE7RUFDQSxpQ0FBQTtFQUNBLDBFQUFBO0NBQ0E7QUFDQTtFQUNBLFVBQUE7RUFDQSxvQkFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0EsaUJBQUE7RUFDQSxXQUFBO0VBQ0EsbUJBQUE7RUFDQSxXQUFBO0NBQ0E7QUFDQSx3REFBQSxpQkFBQTtDQUFBO0FBQ0EsK0JBQUEsbUJBQUE7Q0FBQTtBQUNBOztFQUVBLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLGFBQUE7RUFDQSxpQkFBQTtFQUNBLGlCQUFBO0VBQ0Esb0JBQUE7RUFDQSwwQkFBQTtFQUNBLDRDQUFBO0VBQ0EscUJBQUE7Q0FDQTtBQUNBO0VBQ0EsU0FBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsWUFBQTtFQUNBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EseUJBQUE7RUFDQSxzQkFBQTtFQUNBLGlCQUFBO0VBQ0Esb0JBQUE7RUFDQSx3QkFBQTtFQUNBLG9CQUFBO0NBQ0E7QUFDQSx1REFBQSxZQUFBO0NBQUFcIixcImZpbGVcIjpcIlNlbGVjdC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPlxcclxcbiAgPGRpdiByZWY9XFxcInNlbGVjdFxcXCIgOmNsYXNzPVxcXCJjbGFzc2VzXFxcIiB2LWNsaWNrLW91dHNpZGU9XFxcImNsb3NlXFxcIj5cXHJcXG4gICAgPGRpdiByZWY9XFxcImJ0blxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBkcm9wZG93bi10b2dnbGVcXFwiIHRhYmluZGV4PVxcXCIxXFxcIiA6ZGlzYWJsZWQ9XFxcImRpc2FibGVkIHx8ICFoYXNQYXJlbnRcXFwiIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiXFxyXFxuICAgICAgQGJsdXI9XFxcImNhblNlYXJjaCA/IG51bGwgOiBjbG9zZSgpXFxcIlxcclxcbiAgICAgIEBjbGljaz1cXFwidG9nZ2xlKClcXFwiXFxyXFxuICAgICAgQGtleWRvd24uZXNjLnN0b3AucHJldmVudD1cXFwiY2xvc2VcXFwiXFxyXFxuICAgICAgQGtleWRvd24uc3BhY2Uuc3RvcC5wcmV2ZW50PVxcXCJ0b2dnbGVcXFwiXFxyXFxuICAgICAgQGtleWRvd24uZW50ZXIuc3RvcC5wcmV2ZW50PVxcXCJ0b2dnbGVcXFwiXFxyXFxuICAgID5cXHJcXG4gICAgICA8c3BhbiBjbGFzcz1cXFwiYnRuLWNvbnRlbnRcXFwiIHYtaHRtbD1cXFwibG9hZGluZyA/IHRleHQubG9hZGluZyA6IHNob3dQbGFjZWhvbGRlciB8fCBzZWxlY3RlZFxcXCI+PC9zcGFuPlxcclxcbiAgICAgIDxzcGFuIHYtaWY9XFxcImNsZWFyQnV0dG9uJiZ2YWx1ZXMubGVuZ3RoXFxcIiBjbGFzcz1cXFwiY2xvc2VcXFwiIEBjbGljaz1cXFwiY2xlYXIoKVxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICAgIDxzZWxlY3QgcmVmPVxcXCJzZWxcXFwiIHYtbW9kZWw9XFxcInZhbFxcXCIgOm5hbWU9XFxcIm5hbWVcXFwiIGNsYXNzPVxcXCJzZWNyZXRcXFwiIDptdWx0aXBsZT1cXFwibXVsdGlwbGVcXFwiIDpyZXF1aXJlZD1cXFwicmVxdWlyZWRcXFwiIDpyZWFkb25seT1cXFwicmVhZG9ubHlcXFwiIDpkaXNhYmxlZD1cXFwiZGlzYWJsZWRcXFwiPlxcclxcbiAgICAgIDxvcHRpb24gdi1pZj1cXFwicmVxdWlyZWRcXFwiIHZhbHVlPVxcXCJcXFwiPjwvb3B0aW9uPlxcclxcbiAgICAgIDxvcHRpb24gdi1mb3I9XFxcIm9wdGlvbiBpbiBsaXN0XFxcIiA6dmFsdWU9XFxcIm9wdGlvbltvcHRpb25zVmFsdWVdXFxcIj57eyBvcHRpb25bb3B0aW9uc0xhYmVsXSB9fTwvb3B0aW9uPlxcclxcbiAgICA8L3NlbGVjdD5cXHJcXG4gICAgPHVsIGNsYXNzPVxcXCJkcm9wZG93bi1tZW51XFxcIj5cXHJcXG4gICAgICA8dGVtcGxhdGUgdi1pZj1cXFwibGlzdC5sZW5ndGhcXFwiPlxcclxcbiAgICAgICAgPGxpIHYtaWY9XFxcImNhblNlYXJjaFxcXCIgY2xhc3M9XFxcImJzLXNlYXJjaGJveFxcXCI+XFxyXFxuICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJ0ZXh0XFxcIiA6cGxhY2Vob2xkZXI9XFxcInNlYXJjaFRleHR8fHRleHQuc2VhcmNoXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBhdXRvY29tcGxldGU9XFxcIm9mZlxcXCIgcmVmPVxcXCJzZWFyY2hcXFwiXFxyXFxuICAgICAgICAgICAgdi1tb2RlbD1cXFwic2VhcmNoVmFsdWVcXFwiXFxyXFxuICAgICAgICAgICAgQGtleXVwLmVzYz1cXFwiY2xvc2VcXFwiXFxyXFxuICAgICAgICAgIC8+XFxyXFxuICAgICAgICAgIDxzcGFuIHYtc2hvdz1cXFwic2VhcmNoVmFsdWVcXFwiIGNsYXNzPVxcXCJjbG9zZVxcXCIgQGNsaWNrPVxcXCJjbGVhclNlYXJjaFxcXCI+JnRpbWVzOzwvc3Bhbj5cXHJcXG4gICAgICAgIDwvbGk+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwicmVxdWlyZWQmJiFjbGVhckJ1dHRvblxcXCI+PGEgQG1vdXNlZG93bi5wcmV2ZW50PVxcXCJjbGVhcigpICYmIGNsb3NlKClcXFwiPnt7IHBsYWNlaG9sZGVyIHx8IHRleHQubm90U2VsZWN0ZWQgfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDxsaSB2LWZvcj1cXFwib3B0aW9uIGluIGZpbHRlcmVkT3B0aW9uc1xcXCIgOmlkPVxcXCJvcHRpb25bb3B0aW9uc1ZhbHVlXVxcXCI+XFxyXFxuICAgICAgICAgIDxhIEBtb3VzZWRvd24ucHJldmVudD1cXFwic2VsZWN0KG9wdGlvbltvcHRpb25zVmFsdWVdKVxcXCI+XFxyXFxuICAgICAgICAgICAgPHNwYW4gdi1odG1sPVxcXCJvcHRpb25bb3B0aW9uc0xhYmVsXVxcXCI+PC9zcGFuPlxcclxcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcXFwiIHYtc2hvdz1cXFwiaXNTZWxlY3RlZChvcHRpb25bb3B0aW9uc1ZhbHVlXSlcXFwiPjwvc3Bhbj5cXHJcXG4gICAgICAgICAgPC9hPlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICA8L3RlbXBsYXRlPlxcclxcbiAgICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgIWNsb3NlT25TZWxlY3RcXFwiIG5hbWU9XFxcImZhZGVpblxcXCI+PGRpdiBjbGFzcz1cXFwibm90aWZ5IGluXFxcIj57e2xpbWl0VGV4dH19PC9kaXY+PC90cmFuc2l0aW9uPlxcclxcbiAgICA8L3VsPlxcclxcbiAgICA8dHJhbnNpdGlvbiB2LWlmPVxcXCJub3RpZnkgJiYgY2xvc2VPblNlbGVjdFxcXCIgbmFtZT1cXFwiZmFkZWluXFxcIj48ZGl2IGNsYXNzPVxcXCJub3RpZnkgb3V0XFxcIj48ZGl2Pnt7bGltaXRUZXh0fX08L2Rpdj48L2Rpdj48L3RyYW5zaXRpb24+XFxyXFxuICAgIDwhLS0gPHByZT5PcHRpb25zOiB7e2xpc3R9fTwvcHJlPiAtLT5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge3RyYW5zbGF0aW9uc30gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgQ2xpY2tPdXRzaWRlIGZyb20gJy4vZGlyZWN0aXZlcy9DbGlja091dHNpZGUuanMnXFxyXFxuXFxyXFxudmFyIHRpbWVvdXQgPSB7fVxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIGRpcmVjdGl2ZXM6IHtcXHJcXG4gICAgQ2xpY2tPdXRzaWRlXFxyXFxuICB9LFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgY2xlYXJCdXR0b246IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGNsb3NlT25TZWxlY3Q6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBsYW5nOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBuYXZpZ2F0b3IubGFuZ3VhZ2V9LFxcclxcbiAgICBsaW1pdDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMTAyNH0sXFxyXFxuICAgIG1pblNlYXJjaDoge3R5cGU6IE51bWJlciwgZGVmYXVsdDogMH0sXFxyXFxuICAgIG11bHRpcGxlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsfSxcXHJcXG4gICAgb3B0aW9uczoge3R5cGU6IEFycmF5LCBkZWZhdWx0ICgpIHsgcmV0dXJuIFtdIH19LFxcclxcbiAgICBvcHRpb25zTGFiZWw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdsYWJlbCd9LFxcclxcbiAgICBvcHRpb25zVmFsdWU6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd2YWx1ZSd9LFxcclxcbiAgICBwYXJlbnQ6IHtkZWZhdWx0OiB0cnVlfSxcXHJcXG4gICAgcGxhY2Vob2xkZXI6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICByZXF1aXJlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICBzZWFyY2g6IHt0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZX0sXFxyXFxuICAgIHNlYXJjaFRleHQ6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB1cmw6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGx9LFxcclxcbiAgICB2YWx1ZTogbnVsbFxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGxpc3Q6IFtdLFxcclxcbiAgICAgIGxvYWRpbmc6IG51bGwsXFxyXFxuICAgICAgc2VhcmNoVmFsdWU6IG51bGwsXFxyXFxuICAgICAgc2hvdzogZmFsc2UsXFxyXFxuICAgICAgbm90aWZ5OiBmYWxzZSxcXHJcXG4gICAgICB2YWw6IG51bGwsXFxyXFxuICAgICAgdmFsaWQ6IG51bGxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGNhblNlYXJjaCAoKSB7IHJldHVybiB0aGlzLm1pblNlYXJjaCA/IHRoaXMubGlzdC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2ggOiB0aGlzLnNlYXJjaCB9LFxcclxcbiAgICBjbGFzc2VzICgpIHsgcmV0dXJuIFt7b3BlbjogdGhpcy5zaG93LCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZH0sIHRoaXMuY2xhc3MsIHRoaXMuaXNMaSA/ICdkcm9wZG93bicgOiB0aGlzLmluSW5wdXQgPyAnaW5wdXQtZ3JvdXAtYnRuJyA6ICdidG4tZ3JvdXAnXSB9LFxcclxcbiAgICBmaWx0ZXJlZE9wdGlvbnMgKCkge1xcclxcbiAgICAgIHZhciBzZWFyY2ggPSAodGhpcy5zZWFyY2hWYWx1ZSB8fCAnJykudG9Mb3dlckNhc2UoKVxcclxcbiAgICAgIHJldHVybiAhc2VhcmNoID8gdGhpcy5saXN0IDogdGhpcy5saXN0LmZpbHRlcihlbCA9PiB7XFxyXFxuICAgICAgICByZXR1cm4gfmVsW3RoaXMub3B0aW9uc0xhYmVsXS50b0xvd2VyQ2FzZSgpLnNlYXJjaChzZWFyY2gpXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgaGFzUGFyZW50ICgpIHsgcmV0dXJuIHRoaXMucGFyZW50IGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLnBhcmVudC5sZW5ndGggOiB0aGlzLnBhcmVudCB9LFxcclxcbiAgICBpbklucHV0ICgpIHsgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQgfSxcXHJcXG4gICAgaXNMaSAoKSB7IHJldHVybiB0aGlzLiRwYXJlbnQuX25hdmJhciB8fCB0aGlzLiRwYXJlbnQubWVudSB8fCB0aGlzLiRwYXJlbnQuX3RhYnNldCB9LFxcclxcbiAgICBsaW1pdFRleHQgKCkgeyByZXR1cm4gdGhpcy50ZXh0LmxpbWl0LnJlcGxhY2UoJ3t7bGltaXR9fScsIHRoaXMubGltaXQpIH0sXFxyXFxuICAgIHNlbGVjdGVkICgpIHtcXHJcXG4gICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJycgfVxcclxcbiAgICAgIHZhciBzZWwgPSB0aGlzLnZhbHVlcy5tYXAodmFsID0+ICh0aGlzLmxpc3QuZmluZChvID0+IG9bdGhpcy5vcHRpb25zVmFsdWVdID09PSB2YWwpIHx8IHt9KVt0aGlzLm9wdGlvbnNMYWJlbF0pLmZpbHRlcih2YWwgPT4gdmFsICE9PSB1bmRlZmluZWQpXFxyXFxuICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0ZWQnLCBzZWwpXFxyXFxuICAgICAgcmV0dXJuIHNlbC5qb2luKCcsICcpXFxyXFxuICAgIH0sXFxyXFxuICAgIHNob3dQbGFjZWhvbGRlciAoKSB7IHJldHVybiAodGhpcy52YWx1ZXMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmhhc1BhcmVudCkgPyAodGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLnRleHQubm90U2VsZWN0ZWQpIDogbnVsbCB9LFxcclxcbiAgICB0ZXh0ICgpIHsgcmV0dXJuIHRyYW5zbGF0aW9ucyh0aGlzLmxhbmcpIH0sXFxyXFxuICAgIHZhbHVlcyAoKSB7IHJldHVybiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwgOiB+W251bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih0aGlzLnZhbCkgPyBbXSA6IFt0aGlzLnZhbF0gfSxcXHJcXG4gICAgdmFsT3B0aW9ucyAoKSB7IHJldHVybiB0aGlzLmxpc3QubWFwKGVsID0+IGVsW3RoaXMub3B0aW9uc1ZhbHVlXSkgfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIG9wdGlvbnMgKG9wdGlvbnMpIHtcXHJcXG4gICAgICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5KSB0aGlzLnNldE9wdGlvbnMob3B0aW9ucylcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAodmFsKSB7XFxyXFxuICAgICAgaWYgKHZhbCkge1xcclxcbiAgICAgICAgdGhpcy4kcmVmcy5zZWFyY2ggPyB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpIDogdGhpcy4kcmVmcy5idG4uZm9jdXMoKVxcclxcbiAgICAgICAgLy8gb25CbHVyKHRoaXMuJHJlZnMuc2VsZWN0LCBlID0+IHsgdGhpcy5zaG93ID0gZmFsc2UgfSlcXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgLy8gb2ZmQmx1cih0aGlzLiRyZWZzLnNlbGVjdClcXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHVybCAoKSB7XFxyXFxuICAgICAgdGhpcy51cmxDaGFuZ2VkKClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWQgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCF2YWwgPyAnaW52YWxpZCcgOiAndmFsaWQnKVxcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCAmJiB0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC52YWxpZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwsIG9sZCkge1xcclxcbiAgICAgIGlmICh2YWwgIT09IG9sZCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsgdGhpcy52YWwgPSB2YWwgPSBudWxsIH1cXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHtcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbClcXHJcXG4gICAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKVxcclxcbiAgICAgIH1cXHJcXG4gICAgICBpZiAodmFsIGluc3RhbmNlb2YgQXJyYXkgJiYgdmFsLmxlbmd0aCA+IHRoaXMubGltaXQpIHtcXHJcXG4gICAgICAgIHRoaXMudmFsID0gdmFsLnNsaWNlKDAsIHRoaXMubGltaXQpXFxyXFxuICAgICAgICB0aGlzLm5vdGlmeSA9IHRydWVcXHJcXG4gICAgICAgIGlmICh0aW1lb3V0LmxpbWl0KSBjbGVhclRpbWVvdXQodGltZW91dC5saW1pdClcXHJcXG4gICAgICAgIHRpbWVvdXQubGltaXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcXHJcXG4gICAgICAgICAgdGltZW91dC5saW1pdCA9IGZhbHNlXFxyXFxuICAgICAgICAgIHRoaXMubm90aWZ5ID0gZmFsc2VcXHJcXG4gICAgICAgIH0sIDE1MDApXFxyXFxuICAgICAgfVxcclxcbiAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnZhbGlkYXRlKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgY2xvc2UgKCkge1xcclxcbiAgICAgIHRoaXMuc2hvdyA9IGZhbHNlXFxyXFxuICAgIH0sXFxyXFxuICAgIGNoZWNrRGF0YSAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcXHJcXG4gICAgICAgIGlmICh0aGlzLmxpbWl0IDwgMSkgeyB0aGlzLmxpbWl0ID0gMSB9XFxyXFxuICAgICAgICBpZiAoISh0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xcclxcbiAgICAgICAgICB0aGlzLnZhbCA9ICh0aGlzLnZhbCA9PT0gbnVsbCB8fCB0aGlzLnZhbCA9PT0gdW5kZWZpbmVkKSA/IFtdIDogW3RoaXMudmFsXVxcclxcbiAgICAgICAgfVxcclxcbiAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsT3B0aW9uc1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbC5maWx0ZXIoZWwgPT4gfnZhbHVlcy5pbmRleE9mKGVsKSlcXHJcXG4gICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgaWYgKCF+dGhpcy52YWxPcHRpb25zLmluZGV4T2YodGhpcy52YWwpKSB7IHRoaXMudmFsID0gbnVsbCB9XFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBjbGVhciAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgeyByZXR1cm4gfVxcclxcbiAgICAgIHRoaXMudmFsID0gdGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDogbnVsbFxcclxcbiAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgfSxcXHJcXG4gICAgY2xlYXJTZWFyY2ggKCkge1xcclxcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJ1xcclxcbiAgICAgIHRoaXMuJHJlZnMuc2VhcmNoLmZvY3VzKClcXHJcXG4gICAgfSxcXHJcXG4gICAgaXNTZWxlY3RlZCAodikge1xcclxcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5pbmRleE9mKHYpID4gLTFcXHJcXG4gICAgfSxcXHJcXG4gICAgc2VsZWN0ICh2KSB7XFxyXFxuICAgICAgaWYgKHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcXHJcXG4gICAgICAgIHZhciBuZXdWYWwgPSB0aGlzLnZhbC5zbGljZSgwKVxcclxcbiAgICAgICAgaWYgKH5uZXdWYWwuaW5kZXhPZih2KSkge1xcclxcbiAgICAgICAgICBuZXdWYWwuc3BsaWNlKG5ld1ZhbC5pbmRleE9mKHYpLCAxKVxcclxcbiAgICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgICAgbmV3VmFsLnB1c2godilcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMudmFsID0gbmV3VmFsXFxyXFxuICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XFxyXFxuICAgICAgICAgIHRoaXMudG9nZ2xlKClcXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICB9IGVsc2Uge1xcclxcbiAgICAgICAgdGhpcy52YWwgPSB2XFxyXFxuICAgICAgICB0aGlzLnRvZ2dsZSgpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LFxcclxcbiAgICBzZXRPcHRpb25zIChvcHRpb25zKSB7XFxyXFxuICAgICAgdGhpcy5saXN0ID0gb3B0aW9ucy5tYXAoZWwgPT4ge1xcclxcbiAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgT2JqZWN0KSB7IHJldHVybiBlbCB9XFxyXFxuICAgICAgICBsZXQgb2JqID0ge31cXHJcXG4gICAgICAgIG9ialt0aGlzLm9wdGlvbnNMYWJlbF0gPSBlbFxcclxcbiAgICAgICAgb2JqW3RoaXMub3B0aW9uc1ZhbHVlXSA9IGVsXFxyXFxuICAgICAgICByZXR1cm4gb2JqXFxyXFxuICAgICAgfSlcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdvcHRpb25zJywgdGhpcy5saXN0KVxcclxcbiAgICB9LFxcclxcbiAgICB0b2dnbGUgKCkge1xcclxcbiAgICAgIHRoaXMuc2hvdyA9ICF0aGlzLnNob3dcXHJcXG4gICAgICBpZiAoIXRoaXMuc2hvdykgdGhpcy4kcmVmcy5idG4uZm9jdXMoKVxcclxcbiAgICB9LFxcclxcbiAgICB1cmxDaGFuZ2VkICgpIHtcXHJcXG4gICAgICBpZiAoIXRoaXMudXJsIHx8ICF0aGlzLiRodHRwKSB7IHJldHVybiB9XFxyXFxuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxcclxcbiAgICAgIHRoaXMuJGh0dHAuZ2V0KHRoaXMudXJsKS50aGVuKHJlc3BvbnNlID0+IHtcXHJcXG4gICAgICAgIHZhciBkYXRhID0gcmVzcG9uc2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5ID8gcmVzcG9uc2UuZGF0YSA6IFtdXFxyXFxuICAgICAgICB0cnkgeyBkYXRhID0gSlNPTi5wYXJzZShkYXRhKSB9IGNhdGNoIChlKSB7fVxcclxcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zKGRhdGEpXFxyXFxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgICAgdGhpcy5jaGVja0RhdGEoKVxcclxcbiAgICAgIH0sIHJlc3BvbnNlID0+IHtcXHJcXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXFxyXFxuICAgICAgfSlcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsaWRhdGUgKCkge1xcclxcbiAgICAgIHJldHVybiAhdGhpcy5yZXF1aXJlZCA/IHRydWUgOiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwubGVuZ3RoID4gMCA6IHRoaXMudmFsICE9PSBudWxsXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucylcXHJcXG4gICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHRoaXMuX3NlbGVjdCA9IHRydWVcXHJcXG4gICAgaWYgKHRoaXMudmFsID09PSB1bmRlZmluZWQgfHwgIXRoaXMucGFyZW50KSB7IHRoaXMudmFsID0gbnVsbCB9XFxyXFxuICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XFxyXFxuICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbFswXVxcclxcbiAgICB9XFxyXFxuICAgIHRoaXMuY2hlY2tEYXRhKClcXHJcXG4gICAgaWYgKHRoaXMudXJsKSB0aGlzLnVybENoYW5nZWQoKVxcclxcbiAgICBsZXQgcGFyZW50ID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5fZm9ybVZhbGlkYXRvcikgeyBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudCB9XFxyXFxuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50Ll9mb3JtVmFsaWRhdG9yKSB7XFxyXFxuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcylcXHJcXG4gICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnRcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1vdW50ZWQgKCkge1xcclxcbiAgICBpZiAodGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKVxcclxcbiAgICB0aGlzLnNldE9wdGlvbnModGhpcy5vcHRpb25zKVxcclxcbiAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWVcXHJcXG4gICAgdGhpcy5jaGVja0RhdGEoKVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICBpZiAodGhpcy5fcGFyZW50KSB7XFxyXFxuICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcylcXHJcXG4gICAgICB0aGlzLl9wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKVxcclxcbiAgICB9XFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZSBzY29wZWQ+XFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGV7XFxyXFxuICBoZWlnaHQ6IGF1dG87XFxyXFxuICBwYWRkaW5nLXJpZ2h0OiAyNHB4O1xcclxcbn1cXHJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZTphZnRlcntcXHJcXG4gIGNvbnRlbnQ6ICcgJztcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHJpZ2h0OiAxM3B4O1xcclxcbiAgdG9wOiA1MCU7XFxyXFxuICBtYXJnaW46IC0xcHggMCAwO1xcclxcbiAgYm9yZGVyLXRvcDogNHB4IGRhc2hlZDtcXHJcXG4gIGJvcmRlci10b3A6IDRweCBzb2xpZCBcXFxcOTtcXHJcXG4gIGJvcmRlci1yaWdodDogNHB4IHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB0cmFuc3BhcmVudDtcXHJcXG59XFxyXFxuLmJzLXNlYXJjaGJveCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICBtYXJnaW46IDRweCA4cHg7XFxyXFxufVxcclxcbi5icy1zZWFyY2hib3ggLmNsb3NlIHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHRvcDogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG4gIGRpc3BsYXk6IGJsb2NrO1xcclxcbiAgd2lkdGg6IDM0cHg7XFxyXFxuICBoZWlnaHQ6IDM0cHg7XFxyXFxuICBsaW5lLWhlaWdodDogMzRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuLmJzLXNlYXJjaGJveCBpbnB1dDpmb2N1cyxcXHJcXG4uZm9ybS1jb250cm9sLmRyb3Bkb3duLXRvZ2dsZTpmb2N1cyB7XFxyXFxuICBvdXRsaW5lOiAwO1xcclxcbiAgYm9yZGVyLWNvbG9yOiAjNjZhZmU5ICFpbXBvcnRhbnQ7XFxyXFxuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KSwwIDAgOHB4IHJnYmEoMTAyLDE3NSwyMzMsLjYpO1xcclxcbn1cXHJcXG4uc2VjcmV0IHtcXHJcXG4gIGJvcmRlcjogMDtcXHJcXG4gIGNsaXA6IHJlY3QoMCAwIDAgMCk7XFxyXFxuICBoZWlnaHQ6IDFweDtcXHJcXG4gIG1hcmdpbjogLTFweDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgcG9zaXRpb246IGFic29sdXRlO1xcclxcbiAgd2lkdGg6IDFweDtcXHJcXG59XFxyXFxuLmZvcm0tY29udHJvbC5kcm9wZG93bi10b2dnbGU+LmNsb3NlIHsgbWFyZ2luLWxlZnQ6IDVweDt9XFxyXFxuLm5vdGlmeS5vdXQgeyBwb3NpdGlvbjogcmVsYXRpdmU7IH1cXHJcXG4ubm90aWZ5LmluLFxcclxcbi5ub3RpZnk+ZGl2IHtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiA5NiU7XFxyXFxuICBtYXJnaW46IDAgMiU7XFxyXFxuICBtaW4taGVpZ2h0OiAyNnB4O1xcclxcbiAgcGFkZGluZzogM3B4IDVweDtcXHJcXG4gIGJhY2tncm91bmQ6ICNmNWY1ZjU7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjZTNlM2UzO1xcclxcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA1KTtcXHJcXG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xcclxcbn1cXHJcXG4ubm90aWZ5PmRpdiB7XFxyXFxuICB0b3A6IDVweDtcXHJcXG4gIHotaW5kZXg6IDE7XFxyXFxufVxcclxcbi5ub3RpZnkuaW4ge1xcclxcbiAgb3BhY2l0eTogLjk7XFxyXFxuICBib3R0b206IDVweDtcXHJcXG59XFxyXFxuLmJ0bi1ncm91cC1qdXN0aWZpZWQgLmRyb3Bkb3duLXRvZ2dsZT5zcGFuOm5vdCguY2xvc2UpIHtcXHJcXG4gIHdpZHRoOiBjYWxjKDEwMCUgLSAxOHB4KTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAtNHB4O1xcclxcbn1cXHJcXG4uYnRuLWdyb3VwLWp1c3RpZmllZCAuZHJvcGRvd24tbWVudSB7IHdpZHRoOiAxMDAlOyB9XFxyXFxuPC9zdHlsZT5cXHJcXG5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE1NiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHR2YXIgX0NsaWNrT3V0c2lkZSA9IF9fd2VicGFja19yZXF1aXJlX18oNjYpO1xuXHRcblx0dmFyIF9DbGlja091dHNpZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xpY2tPdXRzaWRlKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0dmFyIHRpbWVvdXQgPSB7fTtcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGRpcmVjdGl2ZXM6IHtcblx0ICAgIENsaWNrT3V0c2lkZTogX0NsaWNrT3V0c2lkZTIuZGVmYXVsdFxuXHQgIH0sXG5cdCAgcHJvcHM6IHtcblx0ICAgIGNsZWFyQnV0dG9uOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBjbG9zZU9uU2VsZWN0OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG5cdCAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbGFuZzogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG5hdmlnYXRvci5sYW5ndWFnZSB9LFxuXHQgICAgbGltaXQ6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMDI0IH0sXG5cdCAgICBtaW5TZWFyY2g6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG5cdCAgICBtdWx0aXBsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIG9wdGlvbnM6IHsgdHlwZTogQXJyYXksIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KCkge1xuXHQgICAgICAgIHJldHVybiBbXTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG9wdGlvbnNMYWJlbDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdsYWJlbCcgfSxcblx0ICAgIG9wdGlvbnNWYWx1ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd2YWx1ZScgfSxcblx0ICAgIHBhcmVudDogeyBkZWZhdWx0OiB0cnVlIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHJlcXVpcmVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHNlYXJjaDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2VhcmNoVGV4dDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHVybDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiBudWxsXG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgbGlzdDogW10sXG5cdCAgICAgIGxvYWRpbmc6IG51bGwsXG5cdCAgICAgIHNlYXJjaFZhbHVlOiBudWxsLFxuXHQgICAgICBzaG93OiBmYWxzZSxcblx0ICAgICAgbm90aWZ5OiBmYWxzZSxcblx0ICAgICAgdmFsOiBudWxsLFxuXHQgICAgICB2YWxpZDogbnVsbFxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgY2FuU2VhcmNoOiBmdW5jdGlvbiBjYW5TZWFyY2goKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLm1pblNlYXJjaCA/IHRoaXMubGlzdC5sZW5ndGggPj0gdGhpcy5taW5TZWFyY2ggOiB0aGlzLnNlYXJjaDtcblx0ICAgIH0sXG5cdCAgICBjbGFzc2VzOiBmdW5jdGlvbiBjbGFzc2VzKCkge1xuXHQgICAgICByZXR1cm4gW3sgb3BlbjogdGhpcy5zaG93LCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCB9LCB0aGlzLmNsYXNzLCB0aGlzLmlzTGkgPyAnZHJvcGRvd24nIDogdGhpcy5pbklucHV0ID8gJ2lucHV0LWdyb3VwLWJ0bicgOiAnYnRuLWdyb3VwJ107XG5cdCAgICB9LFxuXHQgICAgZmlsdGVyZWRPcHRpb25zOiBmdW5jdGlvbiBmaWx0ZXJlZE9wdGlvbnMoKSB7XG5cdCAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICB2YXIgc2VhcmNoID0gKHRoaXMuc2VhcmNoVmFsdWUgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG5cdCAgICAgIHJldHVybiAhc2VhcmNoID8gdGhpcy5saXN0IDogdGhpcy5saXN0LmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gfmVsW190aGlzLm9wdGlvbnNMYWJlbF0udG9Mb3dlckNhc2UoKS5zZWFyY2goc2VhcmNoKTtcblx0ICAgICAgfSk7XG5cdCAgICB9LFxuXHQgICAgaGFzUGFyZW50OiBmdW5jdGlvbiBoYXNQYXJlbnQoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnBhcmVudCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy5wYXJlbnQubGVuZ3RoIDogdGhpcy5wYXJlbnQ7XG5cdCAgICB9LFxuXHQgICAgaW5JbnB1dDogZnVuY3Rpb24gaW5JbnB1dCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5faW5wdXQ7XG5cdCAgICB9LFxuXHQgICAgaXNMaTogZnVuY3Rpb24gaXNMaSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC5fbmF2YmFyIHx8IHRoaXMuJHBhcmVudC5tZW51IHx8IHRoaXMuJHBhcmVudC5fdGFic2V0O1xuXHQgICAgfSxcblx0ICAgIGxpbWl0VGV4dDogZnVuY3Rpb24gbGltaXRUZXh0KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy50ZXh0LmxpbWl0LnJlcGxhY2UoJ3t7bGltaXR9fScsIHRoaXMubGltaXQpO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdGVkOiBmdW5jdGlvbiBzZWxlY3RlZCgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAodGhpcy5saXN0Lmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgIHJldHVybiAnJztcblx0ICAgICAgfVxuXHQgICAgICB2YXIgc2VsID0gdGhpcy52YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICByZXR1cm4gKF90aGlzMi5saXN0LmZpbmQoZnVuY3Rpb24gKG8pIHtcblx0ICAgICAgICAgIHJldHVybiBvW190aGlzMi5vcHRpb25zVmFsdWVdID09PSB2YWw7XG5cdCAgICAgICAgfSkgfHwge30pW190aGlzMi5vcHRpb25zTGFiZWxdO1xuXHQgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgIHJldHVybiB2YWwgIT09IHVuZGVmaW5lZDtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdGVkJywgc2VsKTtcblx0ICAgICAgcmV0dXJuIHNlbC5qb2luKCcsICcpO1xuXHQgICAgfSxcblx0ICAgIHNob3dQbGFjZWhvbGRlcjogZnVuY3Rpb24gc2hvd1BsYWNlaG9sZGVyKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmhhc1BhcmVudCA/IHRoaXMucGxhY2Vob2xkZXIgfHwgdGhpcy50ZXh0Lm5vdFNlbGVjdGVkIDogbnVsbDtcblx0ICAgIH0sXG5cdCAgICB0ZXh0OiBmdW5jdGlvbiB0ZXh0KCkge1xuXHQgICAgICByZXR1cm4gKDAsIF91dGlscy50cmFuc2xhdGlvbnMpKHRoaXMubGFuZyk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy52YWwgOiB+W251bGwsIHVuZGVmaW5lZF0uaW5kZXhPZih0aGlzLnZhbCkgPyBbXSA6IFt0aGlzLnZhbF07XG5cdCAgICB9LFxuXHQgICAgdmFsT3B0aW9uczogZnVuY3Rpb24gdmFsT3B0aW9ucygpIHtcblx0ICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cdFxuXHQgICAgICByZXR1cm4gdGhpcy5saXN0Lm1hcChmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWxbX3RoaXMzLm9wdGlvbnNWYWx1ZV07XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgd2F0Y2g6IHtcblx0ICAgIG9wdGlvbnM6IGZ1bmN0aW9uIG9wdGlvbnMoX29wdGlvbnMpIHtcblx0ICAgICAgaWYgKF9vcHRpb25zIGluc3RhbmNlb2YgQXJyYXkpIHRoaXMuc2V0T3B0aW9ucyhfb3B0aW9ucyk7XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyh2YWwpIHtcblx0ICAgICAgaWYgKHZhbCkge1xuXHQgICAgICAgIHRoaXMuJHJlZnMuc2VhcmNoID8gdGhpcy4kcmVmcy5zZWFyY2guZm9jdXMoKSA6IHRoaXMuJHJlZnMuYnRuLmZvY3VzKCk7XG5cdCAgICAgICAgLy8gb25CbHVyKHRoaXMuJHJlZnMuc2VsZWN0LCBlID0+IHsgdGhpcy5zaG93ID0gZmFsc2UgfSlcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIC8vIG9mZkJsdXIodGhpcy4kcmVmcy5zZWxlY3QpXG5cdCAgICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHVybDogZnVuY3Rpb24gdXJsKCkge1xuXHQgICAgICB0aGlzLnVybENoYW5nZWQoKTtcblx0ICAgIH0sXG5cdCAgICB2YWxpZDogZnVuY3Rpb24gdmFsaWQodmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaXN2YWxpZCcsIHZhbCk7XG5cdCAgICAgIHRoaXMuJGVtaXQoIXZhbCA/ICdpbnZhbGlkJyA6ICd2YWxpZCcpO1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQgJiYgdGhpcy5fcGFyZW50KSB0aGlzLl9wYXJlbnQudmFsaWRhdGUoKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSB2YWw7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoX3ZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgdGhpcy52YWwgPSBfdmFsID0gbnVsbDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoX3ZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgX3ZhbCk7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoX3ZhbCBpbnN0YW5jZW9mIEFycmF5ICYmIF92YWwubGVuZ3RoID4gdGhpcy5saW1pdCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gX3ZhbC5zbGljZSgwLCB0aGlzLmxpbWl0KTtcblx0ICAgICAgICB0aGlzLm5vdGlmeSA9IHRydWU7XG5cdCAgICAgICAgaWYgKHRpbWVvdXQubGltaXQpIGNsZWFyVGltZW91dCh0aW1lb3V0LmxpbWl0KTtcblx0ICAgICAgICB0aW1lb3V0LmxpbWl0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICB0aW1lb3V0LmxpbWl0ID0gZmFsc2U7XG5cdCAgICAgICAgICBfdGhpczQubm90aWZ5ID0gZmFsc2U7XG5cdCAgICAgICAgfSwgMTUwMCk7XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy52YWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGNsb3NlOiBmdW5jdGlvbiBjbG9zZSgpIHtcblx0ICAgICAgdGhpcy5zaG93ID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgY2hlY2tEYXRhOiBmdW5jdGlvbiBjaGVja0RhdGEoKSB7XG5cdCAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG5cdCAgICAgICAgaWYgKHRoaXMubGltaXQgPCAxKSB7XG5cdCAgICAgICAgICB0aGlzLmxpbWl0ID0gMTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCEodGhpcy52YWwgaW5zdGFuY2VvZiBBcnJheSkpIHtcblx0ICAgICAgICAgIHRoaXMudmFsID0gdGhpcy52YWwgPT09IG51bGwgfHwgdGhpcy52YWwgPT09IHVuZGVmaW5lZCA/IFtdIDogW3RoaXMudmFsXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsT3B0aW9ucztcblx0ICAgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICAgIHJldHVybiB+dmFsdWVzLmluZGV4T2YoZWwpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGlmICh0aGlzLnZhbHVlcy5sZW5ndGggPiB0aGlzLmxpbWl0KSB7XG5cdCAgICAgICAgICB0aGlzLnZhbCA9IHRoaXMudmFsLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBpZiAoIX50aGlzLnZhbE9wdGlvbnMuaW5kZXhPZih0aGlzLnZhbCkpIHtcblx0ICAgICAgICAgIHRoaXMudmFsID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG5cdCAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy52YWwgPSB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5ID8gW10gOiBudWxsO1xuXHQgICAgICB0aGlzLnRvZ2dsZSgpO1xuXHQgICAgfSxcblx0ICAgIGNsZWFyU2VhcmNoOiBmdW5jdGlvbiBjbGVhclNlYXJjaCgpIHtcblx0ICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuXHQgICAgICB0aGlzLiRyZWZzLnNlYXJjaC5mb2N1cygpO1xuXHQgICAgfSxcblx0ICAgIGlzU2VsZWN0ZWQ6IGZ1bmN0aW9uIGlzU2VsZWN0ZWQodikge1xuXHQgICAgICByZXR1cm4gdGhpcy52YWx1ZXMuaW5kZXhPZih2KSA+IC0xO1xuXHQgICAgfSxcblx0ICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KHYpIHtcblx0ICAgICAgaWYgKHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcblx0ICAgICAgICB2YXIgbmV3VmFsID0gdGhpcy52YWwuc2xpY2UoMCk7XG5cdCAgICAgICAgaWYgKH5uZXdWYWwuaW5kZXhPZih2KSkge1xuXHQgICAgICAgICAgbmV3VmFsLnNwbGljZShuZXdWYWwuaW5kZXhPZih2KSwgMSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIG5ld1ZhbC5wdXNoKHYpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnZhbCA9IG5ld1ZhbDtcblx0ICAgICAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XG5cdCAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB0aGlzLnZhbCA9IHY7XG5cdCAgICAgICAgdGhpcy50b2dnbGUoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMob3B0aW9ucykge1xuXHQgICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblx0XG5cdCAgICAgIHRoaXMubGlzdCA9IG9wdGlvbnMubWFwKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIE9iamVjdCkge1xuXHQgICAgICAgICAgcmV0dXJuIGVsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgb2JqID0ge307XG5cdCAgICAgICAgb2JqW190aGlzNS5vcHRpb25zTGFiZWxdID0gZWw7XG5cdCAgICAgICAgb2JqW190aGlzNS5vcHRpb25zVmFsdWVdID0gZWw7XG5cdCAgICAgICAgcmV0dXJuIG9iajtcblx0ICAgICAgfSk7XG5cdCAgICAgIHRoaXMuJGVtaXQoJ29wdGlvbnMnLCB0aGlzLmxpc3QpO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgICBpZiAoIXRoaXMuc2hvdykgdGhpcy4kcmVmcy5idG4uZm9jdXMoKTtcblx0ICAgIH0sXG5cdCAgICB1cmxDaGFuZ2VkOiBmdW5jdGlvbiB1cmxDaGFuZ2VkKCkge1xuXHQgICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblx0XG5cdCAgICAgIGlmICghdGhpcy51cmwgfHwgIXRoaXMuJGh0dHApIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblx0ICAgICAgdGhpcy4kaHR0cC5nZXQodGhpcy51cmwpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cdCAgICAgICAgdmFyIGRhdGEgPSByZXNwb25zZS5kYXRhIGluc3RhbmNlb2YgQXJyYXkgPyByZXNwb25zZS5kYXRhIDogW107XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cdCAgICAgICAgX3RoaXM2LnNldE9wdGlvbnMoZGF0YSk7XG5cdCAgICAgICAgX3RoaXM2LmxvYWRpbmcgPSBmYWxzZTtcblx0ICAgICAgICBfdGhpczYuY2hlY2tEYXRhKCk7XG5cdCAgICAgIH0sIGZ1bmN0aW9uIChyZXNwb25zZSkge1xuXHQgICAgICAgIF90aGlzNi5sb2FkaW5nID0gZmFsc2U7XG5cdCAgICAgIH0pO1xuXHQgICAgfSxcblx0ICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZSgpIHtcblx0ICAgICAgcmV0dXJuICF0aGlzLnJlcXVpcmVkID8gdHJ1ZSA6IHRoaXMudmFsIGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLnZhbC5sZW5ndGggPiAwIDogdGhpcy52YWwgIT09IG51bGw7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucyk7XG5cdCAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWU7XG5cdCAgICB0aGlzLl9zZWxlY3QgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMudmFsID09PSB1bmRlZmluZWQgfHwgIXRoaXMucGFyZW50KSB7XG5cdCAgICAgIHRoaXMudmFsID0gbnVsbDtcblx0ICAgIH1cblx0ICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiB0aGlzLnZhbCBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdCAgICAgIHRoaXMudmFsID0gdGhpcy52YWxbMF07XG5cdCAgICB9XG5cdCAgICB0aGlzLmNoZWNrRGF0YSgpO1xuXHQgICAgaWYgKHRoaXMudXJsKSB0aGlzLnVybENoYW5nZWQoKTtcblx0ICAgIHZhciBwYXJlbnQgPSB0aGlzLiRwYXJlbnQ7XG5cdCAgICB3aGlsZSAocGFyZW50ICYmICFwYXJlbnQuX2Zvcm1WYWxpZGF0b3IpIHtcblx0ICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyZW50ICYmIHBhcmVudC5fZm9ybVZhbGlkYXRvcikge1xuXHQgICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuXHQgICAgdGhpcy5zZXRPcHRpb25zKHRoaXMub3B0aW9ucyk7XG5cdCAgICB0aGlzLnZhbCA9IHRoaXMudmFsdWU7XG5cdCAgICB0aGlzLmNoZWNrRGF0YSgpO1xuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcblx0ICAgICAgdmFyIGluZGV4ID0gdGhpcy5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIHRoaXMuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgfVxuXHQgIH1cblx0fTtcblxuLyoqKi8gfSxcbi8qIDE1NyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbiAoKXt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDtcblx0ICByZXR1cm4gX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcImNsaWNrLW91dHNpZGVcIixcblx0ICAgICAgcmF3TmFtZTogXCJ2LWNsaWNrLW91dHNpZGVcIixcblx0ICAgICAgdmFsdWU6IChfdm0uY2xvc2UpLFxuXHQgICAgICBleHByZXNzaW9uOiBcImNsb3NlXCJcblx0ICAgIH1dLFxuXHQgICAgcmVmOiBcInNlbGVjdFwiLFxuXHQgICAgY2xhc3M6IF92bS5jbGFzc2VzXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgcmVmOiBcImJ0blwiLFxuXHQgICAgc3RhdGljQ2xhc3M6IFwiZm9ybS1jb250cm9sIGRyb3Bkb3duLXRvZ2dsZVwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0YWJpbmRleFwiOiBcIjFcIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWQgfHwgIV92bS5oYXNQYXJlbnQsXG5cdCAgICAgIFwicmVhZG9ubHlcIjogX3ZtLnJlYWRvbmx5XG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jYW5TZWFyY2ggPyBudWxsIDogX3ZtLmNsb3NlKClcblx0ICAgICAgfSxcblx0ICAgICAgXCJjbGlja1wiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udG9nZ2xlKClcblx0ICAgICAgfSxcblx0ICAgICAgXCJrZXlkb3duXCI6IFtmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS5jbG9zZSgkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwic3BhY2VcIiwgMzIpKSB7IHJldHVybjsgfVxuXHQgICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBfdm0udG9nZ2xlKCRldmVudClcblx0ICAgICAgfSwgZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlbnRlclwiLCAxMykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS50b2dnbGUoJGV2ZW50KVxuXHQgICAgICB9XVxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJidG4tY29udGVudFwiLFxuXHQgICAgZG9tUHJvcHM6IHtcblx0ICAgICAgXCJpbm5lckhUTUxcIjogX3ZtLl9zKF92bS5sb2FkaW5nID8gX3ZtLnRleHQubG9hZGluZyA6IF92bS5zaG93UGxhY2Vob2xkZXIgfHwgX3ZtLnNlbGVjdGVkKVxuXHQgICAgfVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLmNsZWFyQnV0dG9uICYmIF92bS52YWx1ZXMubGVuZ3RoKSA/IF92bS5fYygnc3BhbicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImNsb3NlXCIsXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNsaWNrXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5jbGVhcigpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKSA6IF92bS5fZSgpXSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc2VsZWN0Jywge1xuXHQgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgbmFtZTogXCJtb2RlbFwiLFxuXHQgICAgICByYXdOYW1lOiBcInYtbW9kZWxcIixcblx0ICAgICAgdmFsdWU6IChfdm0udmFsKSxcblx0ICAgICAgZXhwcmVzc2lvbjogXCJ2YWxcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VsXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJzZWNyZXRcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0ubmFtZSxcblx0ICAgICAgXCJtdWx0aXBsZVwiOiBfdm0ubXVsdGlwbGUsXG5cdCAgICAgIFwicmVxdWlyZWRcIjogX3ZtLnJlcXVpcmVkLFxuXHQgICAgICBcInJlYWRvbmx5XCI6IF92bS5yZWFkb25seSxcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uZGlzYWJsZWRcblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICBcImNoYW5nZVwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBfdm0udmFsID0gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKCRldmVudC50YXJnZXQub3B0aW9ucywgZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgcmV0dXJuIG8uc2VsZWN0ZWRcblx0ICAgICAgICB9KS5tYXAoZnVuY3Rpb24obykge1xuXHQgICAgICAgICAgdmFyIHZhbCA9IFwiX3ZhbHVlXCIgaW4gbyA/IG8uX3ZhbHVlIDogby52YWx1ZTtcblx0ICAgICAgICAgIHJldHVybiB2YWxcblx0ICAgICAgICB9KVswXVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0ucmVxdWlyZWQpID8gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInZhbHVlXCI6IFwiXCJcblx0ICAgIH1cblx0ICB9KSA6IF92bS5fZSgpLCBfdm0uX3YoXCIgXCIpLCBfdm0uX2woKF92bS5saXN0KSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdvcHRpb24nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJ2YWx1ZVwiOiBvcHRpb25bX3ZtLm9wdGlvbnNWYWx1ZV1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdihfdm0uX3Mob3B0aW9uW192bS5vcHRpb25zTGFiZWxdKSldKVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygndWwnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJkcm9wZG93bi1tZW51XCJcblx0ICB9LCBbKF92bS5saXN0Lmxlbmd0aCkgPyBbKF92bS5jYW5TZWFyY2gpID8gX3ZtLl9jKCdsaScsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcImJzLXNlYXJjaGJveFwiXG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICByZWY6IFwic2VhcmNoXCIsXG5cdCAgICBzdGF0aWNDbGFzczogXCJmb3JtLWNvbnRyb2xcIixcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcInRleHRcIixcblx0ICAgICAgXCJwbGFjZWhvbGRlclwiOiBfdm0uc2VhcmNoVGV4dCB8fCBfdm0udGV4dC5zZWFyY2gsXG5cdCAgICAgIFwiYXV0b2NvbXBsZXRlXCI6IFwib2ZmXCJcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5fcyhfdm0uc2VhcmNoVmFsdWUpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJrZXl1cFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVzY1wiLCAyNykpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLmNsb3NlKCRldmVudClcblx0ICAgICAgfSxcblx0ICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLnNlYXJjaFZhbHVlID0gJGV2ZW50LnRhcmdldC52YWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5zZWFyY2hWYWx1ZSksXG5cdCAgICAgIGV4cHJlc3Npb246IFwic2VhcmNoVmFsdWVcIlxuXHQgICAgfV0sXG5cdCAgICBzdGF0aWNDbGFzczogXCJjbG9zZVwiLFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0uY2xlYXJTZWFyY2hcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KFwiw5dcIildKV0pIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIChfdm0ucmVxdWlyZWQgJiYgIV92bS5jbGVhckJ1dHRvbikgPyBfdm0uX2MoJ2xpJywgW192bS5fYygnYScsIHtcblx0ICAgIG9uOiB7XG5cdCAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIF92bS5jbGVhcigpICYmIF92bS5jbG9zZSgpXG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0ucGxhY2Vob2xkZXIgfHwgX3ZtLnRleHQubm90U2VsZWN0ZWQpKV0pXSkgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9sKChfdm0uZmlsdGVyZWRPcHRpb25zKSwgZnVuY3Rpb24ob3B0aW9uKSB7XG5cdCAgICByZXR1cm4gX3ZtLl9jKCdsaScsIHtcblx0ICAgICAgYXR0cnM6IHtcblx0ICAgICAgICBcImlkXCI6IG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uc2VsZWN0KG9wdGlvbltfdm0ub3B0aW9uc1ZhbHVlXSlcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sIFtfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICAgIGRvbVByb3BzOiB7XG5cdCAgICAgICAgXCJpbm5lckhUTUxcIjogX3ZtLl9zKG9wdGlvbltfdm0ub3B0aW9uc0xhYmVsXSlcblx0ICAgICAgfVxuXHQgICAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnc3BhbicsIHtcblx0ICAgICAgZGlyZWN0aXZlczogW3tcblx0ICAgICAgICBuYW1lOiBcInNob3dcIixcblx0ICAgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICAgIHZhbHVlOiAoX3ZtLmlzU2VsZWN0ZWQob3B0aW9uW192bS5vcHRpb25zVmFsdWVdKSksXG5cdCAgICAgICAgZXhwcmVzc2lvbjogXCJpc1NlbGVjdGVkKG9wdGlvbltvcHRpb25zVmFsdWVdKVwiXG5cdCAgICAgIH1dLFxuXHQgICAgICBzdGF0aWNDbGFzczogXCJnbHlwaGljb24gZ2x5cGhpY29uLW9rIGNoZWNrLW1hcmtcIlxuXHQgICAgfSldKV0pXG5cdCAgfSldIDogX3ZtLl9lKCksIF92bS5fdihcIiBcIiksIF92bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmICFfdm0uY2xvc2VPblNlbGVjdCkgPyBfdm0uX2MoJ3RyYW5zaXRpb24nLCB7XG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcIm5hbWVcIjogXCJmYWRlaW5cIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIm5vdGlmeSBpblwiXG5cdCAgfSwgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKSA6IF92bS5fZSgpXSwgMiksIF92bS5fdihcIiBcIiksIChfdm0ubm90aWZ5ICYmIF92bS5jbG9zZU9uU2VsZWN0KSA/IF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBcImZhZGVpblwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwibm90aWZ5IG91dFwiXG5cdCAgfSwgW192bS5fYygnZGl2JywgW192bS5fdihfdm0uX3MoX3ZtLmxpbWl0VGV4dCkpXSldKV0pIDogX3ZtLl9lKCldLCAxKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1lNTE0ZGJjNlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE1OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNTkpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTYwKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFNsaWRlci52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtMzIxODViODJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTMyMTg1YjgyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gU2xpZGVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE1OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuJHBhcmVudC4kY2hpbGRyZW4uaW5kZXhPZih0aGlzKTtcblx0ICAgIH0sXG5cdCAgICBzaG93OiBmdW5jdGlvbiBzaG93KCkge1xuXHQgICAgICByZXR1cm4gdGhpcy4kcGFyZW50LmluZGV4ID09PSB0aGlzLmluZGV4O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHtcblx0ICAgIGlmICh0aGlzLiRwYXJlbnQuaW5kaWNhdG9yX2xpc3QpIHtcblx0ICAgICAgdGhpcy4kcGFyZW50LmluZGljYXRvcl9saXN0LnB1c2godGhpcy5pbmRleCk7XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKHRoaXMuaW5kZXggPT09IDApIHtcblx0ICAgICAgdGhpcy4kZWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTYwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHN0YXRpY0NsYXNzOiBcIml0ZW1cIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMzIxODViODJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTYyKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTY0KVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2NSlcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxTcGlubmVyLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi04YjI5OGU3MFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtOGIyOThlNzBcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBTcGlubmVyLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE2MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gc3R5bGUtbG9hZGVyOiBBZGRzIHNvbWUgY3NzIHRvIHRoZSBET00gYnkgYWRkaW5nIGEgPHN0eWxlPiB0YWdcblx0XG5cdC8vIGxvYWQgdGhlIHN0eWxlc1xuXHR2YXIgY29udGVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTYzKTtcblx0aWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cdC8vIGFkZCB0aGUgc3R5bGVzIHRvIHRoZSBET01cblx0dmFyIHVwZGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oNzkpKGNvbnRlbnQsIHt9KTtcblx0aWYoY29udGVudC5sb2NhbHMpIG1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHM7XG5cdC8vIEhvdCBNb2R1bGUgUmVwbGFjZW1lbnRcblx0aWYoZmFsc2UpIHtcblx0XHQvLyBXaGVuIHRoZSBzdHlsZXMgY2hhbmdlLCB1cGRhdGUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdGlmKCFjb250ZW50LmxvY2Fscykge1xuXHRcdFx0bW9kdWxlLmhvdC5hY2NlcHQoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi04YjI5OGU3MCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vU3Bpbm5lci52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LThiMjk4ZTcwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9TcGlubmVyLnZ1ZVwiKTtcblx0XHRcdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cdFx0XHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHQvLyBXaGVuIHRoZSBtb2R1bGUgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE2MyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0ZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OCkoKTtcblx0Ly8gaW1wb3J0c1xuXHRcblx0XG5cdC8vIG1vZHVsZVxuXHRleHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJcXG5Aa2V5ZnJhbWVzIHNwaW4ge1xcbjEwMCUge1xcclxcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xcbn1cXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcbn1cXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxufVxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXG59XFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXG59XFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvU3Bpbm5lci52dWU/NjVmYzVhOGZcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJGQTtBQUNBO0lBQ0EsMEJBQUE7Q0FDQTtDQUNBO0FBQ0E7RUFDQSxPQUFBO0VBQ0EsUUFBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0VBQ0EsY0FBQTtFQUNBLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsZ0JBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLGlDQUFBO0VBQ0EscUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSx1QkFBQTtFQUNBLDRCQUFBO0VBQ0EsbUJBQUE7RUFDQSxzQkFBQTtFQUNBLDRCQUFBO0VBQ0Esb0NBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7Q0FDQTtBQUNBO0VBQ0EsbUJBQUE7RUFDQSxtQkFBQTtFQUNBLGtCQUFBO0VBQ0EsV0FBQTtFQUNBLFlBQUE7RUFDQSxlQUFBO0VBQ0EsZUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxXQUFBO0VBQ0EsWUFBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7RUFDQSxhQUFBO0VBQ0EsY0FBQTtDQUNBO0FBQ0E7Ozs7O0VBS0EsNklBQUE7RUFDQSxnQkFBQTtFQUNBLGVBQUE7RUFDQSxnQkFBQTtFQUNBLGFBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtDQUNBXCIsXCJmaWxlXCI6XCJTcGlubmVyLnZ1ZVwiLFwic291cmNlc0NvbnRlbnRcIjpbXCI8dGVtcGxhdGU+XFxyXFxuICA8ZGl2IDpjbGFzcz1cXFwiWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLHNwaW5uZXJTaXplLHsnc3Bpbm5lci1maXhlZCc6Zml4ZWR9XVxcXCIgdi1zaG93PVxcXCJhY3RpdmV8fGxvY2tlZFxcXCI+XFxyXFxuICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItd3JhcHBlclxcXCI+XFxyXFxuICAgICAgPGRpdiBjbGFzcz1cXFwic3Bpbm5lci1jaXJjbGVcXFwiPjwvZGl2PlxcclxcbiAgICAgIDxkaXYgY2xhc3M9XFxcInNwaW5uZXItdGV4dFxcXCI+e3t0ZXh0fX08L2Rpdj5cXHJcXG4gICAgPC9kaXY+XFxyXFxuICA8L2Rpdj5cXHJcXG48L3RlbXBsYXRlPlxcclxcblxcclxcbjxzY3JpcHQ+XFxyXFxuaW1wb3J0IHtjb2VyY2UsIGRlbGF5ZXJ9IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxuY29uc3QgTUlOX1dBSVQgPSA1MDAgLy8gaW4gbXNcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBwcm9wczoge1xcclxcbiAgICBmaXhlZDoge3R5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlfSxcXHJcXG4gICAgZ2xvYmFsOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBzaXplOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbWQnfSxcXHJcXG4gICAgdGV4dDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9LFxcclxcbiAgICB2YWx1ZToge2RlZmF1bHQ6IGZhbHNlfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICByZXR1cm4ge1xcclxcbiAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcXHJcXG4gICAgICBsb2NrZWQ6IGZhbHNlXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjb21wdXRlZDoge1xcclxcbiAgICBzcGlubmVyU2l6ZSAoKSB7IHJldHVybiAnc3Bpbm5lci0nICsgKHRoaXMuc2l6ZSA/IHRoaXMuc2l6ZSA6ICdzbScpIH1cXHJcXG4gIH0sXFxyXFxuICB3YXRjaDoge1xcclxcbiAgICBhY3RpdmUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCwgb2xkKSB7XFxyXFxuICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7IHRoaXNbdmFsID8gJ3Nob3cnIDogJ2hpZGUnXSgpIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgaGlkZSAoKSB7XFxyXFxuICAgICAgdmFyIGRlbGF5ID0gMFxcclxcbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgc2hvdyAob3B0aW9ucykge1xcclxcbiAgICAgIGlmIChvcHRpb25zKSB7XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy50ZXh0KSB7IHRoaXMudGV4dCA9IG9wdGlvbnMudGV4dCB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7IHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZSB9XFxyXFxuICAgICAgICBpZiAob3B0aW9ucy5maXhlZCkgeyB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZCB9XFxyXFxuICAgICAgfVxcclxcbiAgICAgIC8vIGJsb2NrIHNjcm9sbGluZyB3aGVuIHNwaW5uZXIgaXMgb25cXHJcXG4gICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nXFxyXFxuICAgICAgLy8gYWN0aXZhdGUgc3Bpbm5lclxcclxcbiAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpXFxyXFxuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5sb2NrZWQgPSB0cnVlXFxyXFxuICAgICAgdGhpcy5fdW5sb2NrKClcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNyZWF0ZWQgKCkge1xcclxcbiAgICB0aGlzLl9ib2R5ID0gZG9jdW1lbnQuYm9keVxcclxcbiAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WVxcclxcbiAgICB0aGlzLl91bmxvY2sgPSBkZWxheWVyKGZ1bmN0aW9uICgpIHtcXHJcXG4gICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlXFxyXFxuICAgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gICAgfSwgTUlOX1dBSVQpXFxyXFxuICAgIGlmICh0aGlzLmdsb2JhbCkge1xcclxcbiAgICAgIGlmICghdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lcikge1xcclxcbiAgICAgICAgdGhpcy4kcm9vdC5fZ2xvYmFsU3Bpbm5lciA9IHRydWVcXHJcXG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xcclxcbiAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xcclxcbiAgICAgICAgICBoaWRlICgpIHsgc2VsZi5oaWRlKCkgfSxcXHJcXG4gICAgICAgICAgc2hvdyAoKSB7IHNlbGYuc2hvdygpIH1cXHJcXG4gICAgICAgIH1cXHJcXG4gICAgICAgIHRoaXMuJHJvb3QuJG9uKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKVxcclxcbiAgICAgIH1cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xcclxcbiAgICBpZiAodGhpcy5fZ2xvYmFsKSB7XFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpXFxyXFxuICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpoaWRlJywgdGhpcy5fZ2xvYmFsLmhpZGUpXFxyXFxuICAgICAgZGVsZXRlIHRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXJcXHJcXG4gICAgfVxcclxcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fc3Bpbm5lckFuaW1hdGlvbilcXHJcXG4gICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3dcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbkBrZXlmcmFtZXMgc3BpbiB7XFxyXFxuICAxMDAlIHtcXHJcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcXHJcXG4gIH1cXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUge1xcclxcbiAgdG9wOiAwO1xcclxcbiAgbGVmdDogMDtcXHJcXG4gIGJvdHRvbTogMDtcXHJcXG4gIHJpZ2h0OiAwO1xcclxcbiAgei1pbmRleDogOTk5ODtcXHJcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZS5zcGlubmVyLWZpeGVkIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItd3JhcHBlciB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICB0b3A6IDUwJTtcXHJcXG4gIGxlZnQ6IDUwJTtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbiAgLW1zLXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xcclxcbn1cXHJcXG4uc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgYm9yZGVyOiA0cHggc29saWQgI2NjYztcXHJcXG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzMzN2FiNztcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhcjtcXHJcXG4gIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xcclxcbiAgd2lkdGg6IDNlbTtcXHJcXG4gIGhlaWdodDogM2VtO1xcclxcbiAgei1pbmRleDogMjtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItdGV4dCB7XFxyXFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tdG9wOiAwLjVlbTtcXHJcXG4gIHotaW5kZXg6IDI7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGZvbnQtc2l6ZTogOTUlO1xcclxcbiAgY29sb3I6ICMzMzdhYjc7XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItc20gLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAxLjVlbTtcXHJcXG4gIGhlaWdodDogMS41ZW07XFxyXFxufVxcclxcbi5zcGlubmVyLWdyaXRjb2RlLnNwaW5uZXItbWQgLnNwaW5uZXItY2lyY2xlIHtcXHJcXG4gIHdpZHRoOiAyZW07XFxyXFxuICBoZWlnaHQ6IDJlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci1sZyAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDIuNWVtO1xcclxcbiAgaGVpZ2h0OiAyLjVlbTtcXHJcXG59XFxyXFxuLnNwaW5uZXItZ3JpdGNvZGUuc3Bpbm5lci14bCAuc3Bpbm5lci1jaXJjbGUge1xcclxcbiAgd2lkdGg6IDMuNWVtO1xcclxcbiAgaGVpZ2h0OiAzLjVlbTtcXHJcXG59XFxyXFxuLmx0LWllMTAgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5pZTkgLnNwaW5uZXItZ3JpdGNvZGUgLnNwaW5uZXItY2lyY2xlLFxcclxcbi5vbGRpZSAuc3Bpbm5lci1ncml0Y29kZSAuc3Bpbm5lci1jaXJjbGUsXFxyXFxuLm5vLWNzc3RyYW5zaXRpb25zIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSxcXHJcXG4ubm8tY3NzdHJhbnNmb3JtczNkIC5zcGlubmVyLWdyaXRjb2RlIC5zcGlubmVyLWNpcmNsZSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB1cmwoXFxcImh0dHA6Ly9pMi53cC5jb20vd3d3LnRoZWdyZWF0bm92ZWxpbmdhZHZlbnR1cmUuY29tL3dwLWNvbnRlbnQvcGx1Z2lucy93cC1wb2xscy9pbWFnZXMvbG9hZGluZy5naWZcXFwiKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDtcXHJcXG4gIGFuaW1hdGlvbjogbm9uZTtcXHJcXG4gIG1hcmdpbi1sZWZ0OiAwO1xcclxcbiAgbWFyZ2luLXRvcDogNXB4O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgd2lkdGg6IDMycHg7XFxyXFxuICBoZWlnaHQ6IDMycHg7XFxyXFxufVxcclxcbjwvc3R5bGU+XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwid2VicGFjazovL1wifV0pO1xuXHRcblx0Ly8gZXhwb3J0c1xuXG5cbi8qKiovIH0sXG4vKiAxNjQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF91dGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oNjUpO1xuXHRcblx0dmFyIE1JTl9XQUlUID0gNTAwOyAvLyBpbiBtc1xuXHRcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZml4ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGdsb2JhbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgc2l6ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdtZCcgfSxcblx0ICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuXHQgICAgdmFsdWU6IHsgZGVmYXVsdDogZmFsc2UgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGFjdGl2ZTogdGhpcy52YWx1ZSxcblx0ICAgICAgbG9ja2VkOiBmYWxzZVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgc3Bpbm5lclNpemU6IGZ1bmN0aW9uIHNwaW5uZXJTaXplKCkge1xuXHQgICAgICByZXR1cm4gJ3NwaW5uZXItJyArICh0aGlzLnNpemUgPyB0aGlzLnNpemUgOiAnc20nKTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICBhY3RpdmU6IGZ1bmN0aW9uIGFjdGl2ZSh2YWwsIG9sZCkge1xuXHQgICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuJGVtaXQoJ2lucHV0JywgdmFsKTtcblx0ICAgIH0sXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodmFsLCBvbGQpIHtcblx0ICAgICAgaWYgKHZhbCAhPT0gb2xkKSB7XG5cdCAgICAgICAgdGhpc1t2YWwgPyAnc2hvdycgOiAnaGlkZSddKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGhpZGU6IGZ1bmN0aW9uIGhpZGUoKSB7XG5cdCAgICAgIHZhciBkZWxheSA9IDA7XG5cdCAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdyhvcHRpb25zKSB7XG5cdCAgICAgIGlmIChvcHRpb25zKSB7XG5cdCAgICAgICAgaWYgKG9wdGlvbnMudGV4dCkge1xuXHQgICAgICAgICAgdGhpcy50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7XG5cdCAgICAgICAgICB0aGlzLnNpemUgPSBvcHRpb25zLnNpemU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChvcHRpb25zLmZpeGVkKSB7XG5cdCAgICAgICAgICB0aGlzLmZpeGVkID0gb3B0aW9ucy5maXhlZDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgLy8gYmxvY2sgc2Nyb2xsaW5nIHdoZW4gc3Bpbm5lciBpcyBvblxuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuXHQgICAgICAvLyBhY3RpdmF0ZSBzcGlubmVyXG5cdCAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBuZXcgRGF0ZSgpO1xuXHQgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cdCAgICAgIHRoaXMubG9ja2VkID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5fdW5sb2NrKCk7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy5fYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cdCAgICB0aGlzLl9ib2R5T3ZlcmZsb3cgPSBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WTtcblx0ICAgIHRoaXMuX3VubG9jayA9ICgwLCBfdXRpbHMuZGVsYXllcikoZnVuY3Rpb24gKCkge1xuXHQgICAgICB0aGlzLmxvY2tlZCA9IGZhbHNlO1xuXHQgICAgICB0aGlzLl9ib2R5LnN0eWxlLm92ZXJmbG93WSA9IHRoaXMuX2JvZHlPdmVyZmxvdztcblx0ICAgIH0sIE1JTl9XQUlUKTtcblx0ICAgIGlmICh0aGlzLmdsb2JhbCkge1xuXHQgICAgICBpZiAoIXRoaXMuJHJvb3QuX2dsb2JhbFNwaW5uZXIpIHtcblx0ICAgICAgICB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgICAgdGhpcy5fZ2xvYmFsID0ge1xuXHQgICAgICAgICAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcblx0ICAgICAgICAgICAgc2VsZi5oaWRlKCk7XG5cdCAgICAgICAgICB9LFxuXHQgICAgICAgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgICAgICAgc2VsZi5zaG93KCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6c2hvdycsIHRoaXMuX2dsb2JhbC5zaG93KTtcblx0ICAgICAgICB0aGlzLiRyb290LiRvbignc3Bpbm5lcjo6aGlkZScsIHRoaXMuX2dsb2JhbC5oaWRlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHtcblx0ICAgIGlmICh0aGlzLl9nbG9iYWwpIHtcblx0ICAgICAgdGhpcy4kcm9vdC4kb2ZmKCdzcGlubmVyOjpzaG93JywgdGhpcy5fZ2xvYmFsLnNob3cpO1xuXHQgICAgICB0aGlzLiRyb290LiRvZmYoJ3NwaW5uZXI6OmhpZGUnLCB0aGlzLl9nbG9iYWwuaGlkZSk7XG5cdCAgICAgIGRlbGV0ZSB0aGlzLiRyb290Ll9nbG9iYWxTcGlubmVyO1xuXHQgICAgfVxuXHQgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NwaW5uZXJBbmltYXRpb24pO1xuXHQgICAgdGhpcy5fYm9keS5zdHlsZS5vdmVyZmxvd1kgPSB0aGlzLl9ib2R5T3ZlcmZsb3c7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGRpcmVjdGl2ZXM6IFt7XG5cdCAgICAgIG5hbWU6IFwic2hvd1wiLFxuXHQgICAgICByYXdOYW1lOiBcInYtc2hvd1wiLFxuXHQgICAgICB2YWx1ZTogKF92bS5hY3RpdmUgfHwgX3ZtLmxvY2tlZCksXG5cdCAgICAgIGV4cHJlc3Npb246IFwiYWN0aXZlfHxsb2NrZWRcIlxuXHQgICAgfV0sXG5cdCAgICBjbGFzczogWydzcGlubmVyIHNwaW5uZXItZ3JpdGNvZGUnLCBfdm0uc3Bpbm5lclNpemUsIHtcblx0ICAgICAgJ3NwaW5uZXItZml4ZWQnOiBfdm0uZml4ZWRcblx0ICAgIH1dXG5cdCAgfSwgW192bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci13cmFwcGVyXCJcblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJzcGlubmVyLWNpcmNsZVwiXG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwic3Bpbm5lci10ZXh0XCJcblx0ICB9LCBbX3ZtLl92KF92bS5fcyhfdm0udGV4dCkpXSldKV0pXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LThiMjk4ZTcwXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTY2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNjgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFiLnZ1ZVwiXG5cdF9fdnVlX29wdGlvbnNfXy5yZW5kZXIgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnJlbmRlclxuXHRfX3Z1ZV9vcHRpb25zX18uc3RhdGljUmVuZGVyRm5zID0gX192dWVfdGVtcGxhdGVfXy5zdGF0aWNSZW5kZXJGbnNcblx0XG5cdC8qIGhvdCByZWxvYWQgKi9cblx0aWYgKGZhbHNlKSB7KGZ1bmN0aW9uICgpIHtcblx0ICB2YXIgaG90QVBJID0gcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKVxuXHQgIGhvdEFQSS5pbnN0YWxsKHJlcXVpcmUoXCJ2dWVcIiksIGZhbHNlKVxuXHQgIGlmICghaG90QVBJLmNvbXBhdGlibGUpIHJldHVyblxuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAoIW1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgaG90QVBJLmNyZWF0ZVJlY29yZChcImRhdGEtdi0wOTg1ZTg3OFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfSBlbHNlIHtcblx0ICAgIGhvdEFQSS5yZWxvYWQoXCJkYXRhLXYtMDk4NWU4NzhcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH1cblx0fSkoKX1cblx0aWYgKF9fdnVlX29wdGlvbnNfXy5mdW5jdGlvbmFsKSB7Y29uc29sZS5lcnJvcihcIlt2dWUtbG9hZGVyXSBUYWIudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTY3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIGZhZGVpbjogZmFsc2Vcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKCkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgdmFyIGFjdGl2ZSA9ICF0aGlzLl90YWJzIHx8IHRoaXMuX3RhYnMuc2hvdyA9PT0gdGhpcztcblx0ICAgICAgdGhpcy5mYWRlaW4gPSBmYWxzZTtcblx0ICAgICAgaWYgKGFjdGl2ZSkge1xuXHQgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgX3RoaXMuZmFkZWluID0gdHJ1ZTtcblx0ICAgICAgICB9LCAwKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gYWN0aXZlO1xuXHQgICAgfSxcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3RhYnMudGFicy5pbmRleE9mKHRoaXMpO1xuXHQgICAgfSxcblx0ICAgIHRyYW5zaXRpb246IGZ1bmN0aW9uIHRyYW5zaXRpb24oKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl90YWJzID8gdGhpcy5fdGFicy5lZmZlY3QgOiBudWxsO1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiID0gdHJ1ZTtcblx0ICAgIHZhciB0YWJzID0gdGhpcztcblx0ICAgIHdoaWxlICghdGhpcy5fdGFicyAmJiB0YWJzLiRwYXJlbnQpIHtcblx0ICAgICAgaWYgKHRhYnMuX2lzVGFiR3JvdXApIHtcblx0ICAgICAgICB0YWJzLnRhYnMucHVzaCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl90YWJHcm91cCA9IHRhYnM7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRhYnMuX2lzVGFicykge1xuXHQgICAgICAgIHRhYnMudGFicy5wdXNoKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3RhYnMgPSB0YWJzO1xuXHQgICAgICAgIGlmICghdGhpcy5fdGFiR3JvdXApIHRhYnMuaGVhZGVycy5wdXNoKHRoaXMpO1xuXHQgICAgICB9XG5cdCAgICAgIHRhYnMgPSB0YWJzLiRwYXJlbnQ7XG5cdCAgICB9XG5cdCAgICBpZiAoIXRoaXMuX3RhYnMpIHRocm93IEVycm9yKCd0YWIgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgfSxcblx0ICBiZWZvcmVEZXN0cm95OiBmdW5jdGlvbiBiZWZvcmVEZXN0cm95KCkge1xuXHQgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgaWYgKHRoaXMuX3RhYkdyb3VwKSB7XG5cdCAgICAgIHRoaXMuX3RhYkdyb3VwLnRhYnMgPSB0aGlzLl90YWJHcm91cC50YWJzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwgIT09IF90aGlzMjtcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB0aGlzLl90YWJzLnRhYnMgPSB0aGlzLl90YWJzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbCAhPT0gX3RoaXMyO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblx0ICAgIGlmICh0aGlzLl90YWJzKSB7XG5cdCAgICAgIGlmICh0aGlzLl90YWJzLmFjdGl2ZSA9PT0gdGhpcy5pbmRleCkge1xuXHQgICAgICAgIHRoaXMuX3RhYnMuaW5kZXggPSAwO1xuXHQgICAgICB9XG5cdCAgICAgIGlmICh0aGlzLl9pbmdyb3VwKSB7XG5cdCAgICAgICAgdmFyIGlkID0gdGhpcy4kcGFyZW50LnRhYnMuaW5kZXhPZih0aGlzKTtcblx0ICAgICAgICBpZiAofmlkKSB0aGlzLiRwYXJlbnQudGFicy5zcGxpY2UoaWQsIDEpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICBpZiAodGhpcy5fdGFicykge1xuXHQgICAgICB2YXIgX2lkID0gdGhpcy5fdGFicy50YWJzLmluZGV4T2YodGhpcyk7XG5cdCAgICAgIGlmICh+X2lkKSB0aGlzLl90YWJzLnRhYnMuc3BsaWNlKF9pZCwgMSk7XG5cdCAgICB9XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTY4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwYW5lbFwiLFxuXHQgICAgY2xhc3M6IFsndGFiLXBhbmUnLCB7XG5cdCAgICAgICdhY3RpdmUgZmFkZSc6IF92bS5hY3RpdmUsXG5cdCAgICAgICdpbic6IF92bS5mYWRlaW5cblx0ICAgIH1dLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJyb2xlXCI6IFwidGFicGFuZWxcIlxuXHQgICAgfVxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtMDk4NWU4NzhcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxNjkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTcwKVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTcyKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Mylcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUYWJHcm91cC52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNTVmYWYzY2JcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTU1ZmFmM2NiXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFiR3JvdXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTcwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzEpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTU1ZmFmM2NiIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UYWJHcm91cC52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuLnRhYi1jb250ZW50IC50YWItcGFuZSB7IGRpc3BsYXk6IG5vbmU7XFxufVxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVGFiR3JvdXAudnVlPzIyYWUxYzA4XCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFrQ0EseUJBQUEsY0FBQTtDQUFBO0FBQ0EsZ0NBQUEsZUFBQTtDQUFBXCIsXCJmaWxlXCI6XCJUYWJHcm91cC52dWVcIixcInNvdXJjZXNDb250ZW50XCI6W1wiPHRlbXBsYXRlPjxzcGFuPjxzbG90Pjwvc2xvdD48L3NwYW4+PC90ZW1wbGF0ZT5cXHJcXG5cXHJcXG48c2NyaXB0PlxcclxcbmV4cG9ydCBkZWZhdWx0IHtcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIGRpc2FibGVkOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBoZWFkZXI6IHt0eXBlOiBTdHJpbmd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgc2hvdzogZmFsc2UsXFxyXFxuICAgICAgdGFiczogW11cXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIGFjdGl2ZSAoKSB7IHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KSB9XFxyXFxuICB9LFxcclxcbiAgbWV0aG9kczoge1xcclxcbiAgICBibHVyICgpIHsgdGhpcy5zaG93ID0gZmFsc2UgfSxcXHJcXG4gICAgdG9nZ2xlICgpIHsgdGhpcy5zaG93ID0gIXRoaXMuc2hvdyB9XFxyXFxuICB9LFxcclxcbiAgY3JlYXRlZCAoKSB7XFxyXFxuICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlXFxyXFxuICAgIGlmICh0aGlzLiRwYXJlbnQpIHtcXHJcXG4gICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFxcXCd0IG5lc3QgdGFiLWdyb3Vwcy4nKVxcclxcbiAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJylcXHJcXG4gICAgfVxcclxcbiAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50XFxyXFxuICAgIHRoaXMuX3RhYnMuaGVhZGVycy5wdXNoKHRoaXMpXFxyXFxuICB9XFxyXFxufVxcclxcbjwvc2NyaXB0PlxcclxcblxcclxcbjxzdHlsZT5cXHJcXG4udGFiLWNvbnRlbnQgLnRhYi1wYW5lIHsgZGlzcGxheTogbm9uZTsgfVxcclxcbi50YWItY29udGVudCAudGFiLXBhbmUuYWN0aXZlIHsgZGlzcGxheTogYmxvY2s7IH1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTcyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0Ly9cblx0Ly9cblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IHtcblx0ICBwcm9wczoge1xuXHQgICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcblx0ICAgIGhlYWRlcjogeyB0eXBlOiBTdHJpbmcgfVxuXHQgIH0sXG5cdCAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHNob3c6IGZhbHNlLFxuXHQgICAgICB0YWJzOiBbXVxuXHQgICAgfTtcblx0ICB9LFxuXHRcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYWN0aXZlOiBmdW5jdGlvbiBhY3RpdmUoKSB7XG5cdCAgICAgIHJldHVybiB+dGhpcy50YWJzLmluZGV4T2YodGhpcy5fdGFicy5zaG93KTtcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIGJsdXI6IGZ1bmN0aW9uIGJsdXIoKSB7XG5cdCAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xuXHQgICAgfSxcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICB0aGlzLnNob3cgPSAhdGhpcy5zaG93O1xuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFiR3JvdXAgPSB0cnVlO1xuXHQgICAgaWYgKHRoaXMuJHBhcmVudCkge1xuXHQgICAgICBpZiAodGhpcy4kcGFyZW50Ll9pc1RhYkdyb3VwKSB0aHJvdyBFcnJvcignQ2FuXFwndCBuZXN0IHRhYi1ncm91cHMuJyk7XG5cdCAgICAgIGlmICghdGhpcy4kcGFyZW50Ll9pc1RhYnMpIHRocm93IEVycm9yKCd0YWItZ3JvdXAgZGVwZW5kIG9uIHRhYnMuJyk7XG5cdCAgICB9XG5cdCAgICB0aGlzLl90YWJzID0gdGhpcy4kcGFyZW50O1xuXHQgICAgdGhpcy5fdGFicy5oZWFkZXJzLnB1c2godGhpcyk7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTczICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCBbX3ZtLl90KFwiZGVmYXVsdFwiKV0sIDIpXG5cdH0sc3RhdGljUmVuZGVyRm5zOiBbXX1cblx0aWYgKGZhbHNlKSB7XG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmIChtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgICByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpLnJlcmVuZGVyKFwiZGF0YS12LTU1ZmFmM2NiXCIsIG1vZHVsZS5leHBvcnRzKVxuXHQgIH1cblx0fVxuXG4vKioqLyB9LFxuLyogMTc0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgX192dWVfZXhwb3J0c19fLCBfX3Z1ZV9vcHRpb25zX19cblx0dmFyIF9fdnVlX3N0eWxlc19fID0ge31cblx0XG5cdC8qIHN0eWxlcyAqL1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE3NSlcblx0XG5cdC8qIHNjcmlwdCAqL1xuXHRfX3Z1ZV9leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nylcblx0XG5cdC8qIHRlbXBsYXRlICovXG5cdHZhciBfX3Z1ZV90ZW1wbGF0ZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNzgpXG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXyB8fCB7fVxuXHRpZiAoXG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcIm9iamVjdFwiIHx8XG5cdCAgdHlwZW9mIF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcblx0KSB7XG5cdGlmIChPYmplY3Qua2V5cyhfX3Z1ZV9leHBvcnRzX18pLnNvbWUoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5ICE9PSBcImRlZmF1bHRcIiAmJiBrZXkgIT09IFwiX19lc01vZHVsZVwiIH0pKSB7Y29uc29sZS5lcnJvcihcIm5hbWVkIGV4cG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gKi52dWUgZmlsZXMuXCIpfVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdFxuXHR9XG5cdGlmICh0eXBlb2YgX192dWVfb3B0aW9uc19fID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICBfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9vcHRpb25zX18ub3B0aW9uc1xuXHR9XG5cdF9fdnVlX29wdGlvbnNfXy5fX2ZpbGUgPSBcIkM6XFxcXGxhcmFnb25cXFxcd3d3XFxcXHZ1ZS1zdHJhcFxcXFxzcmNcXFxcVGFicy52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtNzAxMDBkZGZcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LTcwMTAwZGRmXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVGFicy52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxNzUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3Nik7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNzAxMDBkZGYhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1RhYnMudnVlXCIsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgbmV3Q29udGVudCA9IHJlcXVpcmUoXCIhIS4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvaW5kZXguanM/c291cmNlTWFwIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3N0eWxlLXJld3JpdGVyLmpzP2lkPWRhdGEtdi03MDEwMGRkZiEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zZWxlY3Rvci5qcz90eXBlPXN0eWxlcyZpbmRleD0wIS4vVGFicy52dWVcIik7XG5cdFx0XHRcdGlmKHR5cGVvZiBuZXdDb250ZW50ID09PSAnc3RyaW5nJykgbmV3Q29udGVudCA9IFtbbW9kdWxlLmlkLCBuZXdDb250ZW50LCAnJ11dO1xuXHRcdFx0XHR1cGRhdGUobmV3Q29udGVudCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gV2hlbiB0aGUgbW9kdWxlIGlzIGRpc3Bvc2VkLCByZW1vdmUgdGhlIDxzdHlsZT4gdGFnc1xuXHRcdG1vZHVsZS5ob3QuZGlzcG9zZShmdW5jdGlvbigpIHsgdXBkYXRlKCk7IH0pO1xuXHR9XG5cbi8qKiovIH0sXG4vKiAxNzYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fd2VicGFja19yZXF1aXJlX18oNzgpKCk7XG5cdC8vIGltcG9ydHNcblx0XG5cdFxuXHQvLyBtb2R1bGVcblx0ZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcbn1cXHJcXG5cIiwgXCJcIiwge1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wiLy4vc3JjL1RhYnMudnVlPzQzMTdiOWFmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUEwRUE7RUFDQSxlQUFBO0NBQ0FcIixcImZpbGVcIjpcIlRhYnMudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgdGFicz5cXHJcXG4gICAgPHVsIDpjbGFzcz1cXFwibmF2U3R5bGVDbGFzc1xcXCIgcm9sZT1cXFwidGFibGlzdFxcXCI+XFxyXFxuICAgICAgPHRlbXBsYXRlIHYtZm9yPVxcXCJoZWFkZXIgaW4gaGVhZGVyc1xcXCI+XFxyXFxuICAgICAgICA8bGkgdi1pZj1cXFwiaGVhZGVyLl9pc1RhYlxcXCIgOmNsYXNzPVxcXCJ7YWN0aXZlOmhlYWRlci5hY3RpdmUsIGRpc2FibGVkOmhlYWRlci5kaXNhYmxlZH1cXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QoaGVhZGVyKVxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImhlYWRlclxcXCI+PGEgaHJlZj1cXFwiI1xcXCIgdi1odG1sPVxcXCJoZWFkZXIuaGVhZGVyXFxcIj48L2E+PC9zbG90PlxcclxcbiAgICAgICAgPC9saT5cXHJcXG4gICAgICAgIDxkcm9wZG93biB2LWlmPVxcXCJoZWFkZXIuX2lzVGFiR3JvdXBcXFwiIDp0ZXh0PVxcXCJoZWFkZXIuaGVhZGVyXFxcIiA6Y2xhc3M9XFxcInthY3RpdmU6aGVhZGVyLmFjdGl2ZX1cXFwiIDpkaXNhYmxlZD1cXFwiaGVhZGVyLmRpc2FibGVkXFxcIj5cXHJcXG4gICAgICAgICAgPGxpIHYtZm9yPVxcXCJ0YWIgaW4gaGVhZGVyLnRhYnNcXFwiIDpjbGFzcz1cXFwie2Rpc2FibGVkOnRhYi5kaXNhYmxlZH1cXFwiPjxhIGhyZWY9XFxcIiNcXFwiIEBjbGljay5wcmV2ZW50PVxcXCJzZWxlY3QodGFiKVxcXCI+e3t0YWIuaGVhZGVyfX08L2E+PC9saT5cXHJcXG4gICAgICAgIDwvZHJvcGRvd24+XFxyXFxuICAgICAgPC90ZW1wbGF0ZT5cXHJcXG4gICAgPC91bD5cXHJcXG4gICAgPGRpdiBjbGFzcz1cXFwidGFiLWNvbnRlbnRcXFwiPjxzbG90Pjwvc2xvdD48L2Rpdj5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2NvZXJjZX0gZnJvbSAnLi91dGlscy91dGlscy5qcydcXHJcXG5pbXBvcnQgZHJvcGRvd24gZnJvbSAnLi9Ecm9wZG93bi52dWUnXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgY29tcG9uZW50czoge1xcclxcbiAgICBkcm9wZG93blxcclxcbiAgfSxcXHJcXG4gIHByb3BzOiB7XFxyXFxuICAgIC8vIGVmZmVjdDoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2ZhZGVpbid9LFxcclxcbiAgICBqdXN0aWZpZWQ6IGZhbHNlLFxcclxcbiAgICBuYXZTdHlsZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIHZhbHVlOiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwfVxcclxcbiAgfSxcXHJcXG4gIGRhdGEgKCkge1xcclxcbiAgICB2YXIgaW5kZXggPSB0aGlzLnZhbHVlIHx8IDBcXHJcXG4gICAgcmV0dXJuIHtcXHJcXG4gICAgICBpbmRleCxcXHJcXG4gICAgICBoZWFkZXJzOiBbXSxcXHJcXG4gICAgICB0YWJzOiBbXVxcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgd2F0Y2g6IHtcXHJcXG4gICAgaW5kZXggKHZhbCkge1xcclxcbiAgICAgIHRoaXMuJGVtaXQoJ2FjdGl2ZScsIHZhbClcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgfSxcXHJcXG4gICAgdmFsdWUgKHZhbCkge1xcclxcbiAgICAgIHRoaXMuaW5kZXggPSB2YWxcXHJcXG4gICAgfVxcclxcbiAgfSxcXHJcXG4gIGNvbXB1dGVkOiB7XFxyXFxuICAgIG5hdlN0eWxlQ2xhc3MgKCkge1xcclxcbiAgICAgIHJldHVybiBbXFxyXFxuICAgICAgICAnbmF2JyxcXHJcXG4gICAgICAgIH5bJ3BpbGxzJywgJ3N0YWNrZWQnXS5pbmRleE9mKHRoaXMubmF2U3R5bGUpID8gJ25hdi0nICsgdGhpcy5uYXZTdHlsZSA6ICduYXYtdGFicycsXFxyXFxuICAgICAgICB7XFxyXFxuICAgICAgICAgICduYXYtanVzdGlmaWVkJzogY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxcclxcbiAgICAgICAgICAnbmF2LXBpbGxzJzogdGhpcy5uYXZTdHlsZSA9PT0gJ3N0YWNrZWQnXFxyXFxuICAgICAgICB9XFxyXFxuICAgICAgXVxcclxcbiAgICB9LFxcclxcbiAgICBzaG93ICgpIHsgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF0gfVxcclxcbiAgfSxcXHJcXG4gIG1ldGhvZHM6IHtcXHJcXG4gICAgc2VsZWN0ICh0YWIpIHtcXHJcXG4gICAgICBpZiAoIXRhYi5kaXNhYmxlZCkge1xcclxcbiAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMudGFicy5pbmRleE9mKHRhYilcXHJcXG4gICAgICB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy5faXNUYWJzID0gdHJ1ZVxcclxcbiAgfVxcclxcbn1cXHJcXG48L3NjcmlwdD5cXHJcXG5cXHJcXG48c3R5bGU+XFxyXFxuW3RhYnNdID4gLnRhYi1jb250ZW50IHtcXHJcXG4gIG1hcmdpbjogMTVweCAwO1xcclxcbn1cXHJcXG48L3N0eWxlPlwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTc3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdHZhciBfRHJvcGRvd24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNSk7XG5cdFxuXHR2YXIgX0Ryb3Bkb3duMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Ryb3Bkb3duKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHRcblx0ZXhwb3J0cy5kZWZhdWx0ID0ge1xuXHQgIGNvbXBvbmVudHM6IHtcblx0ICAgIGRyb3Bkb3duOiBfRHJvcGRvd24yLmRlZmF1bHRcblx0ICB9LFxuXHQgIHByb3BzOiB7XG5cdCAgICAvLyBlZmZlY3Q6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdmYWRlaW4nfSxcblx0ICAgIGp1c3RpZmllZDogZmFsc2UsXG5cdCAgICBuYXZTdHlsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIHZhbHVlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgdmFyIGluZGV4ID0gdGhpcy52YWx1ZSB8fCAwO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaW5kZXg6IGluZGV4LFxuXHQgICAgICBoZWFkZXJzOiBbXSxcblx0ICAgICAgdGFiczogW11cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGluZGV4OiBmdW5jdGlvbiBpbmRleCh2YWwpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnYWN0aXZlJywgdmFsKTtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgfSxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSh2YWwpIHtcblx0ICAgICAgdGhpcy5pbmRleCA9IHZhbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIGNvbXB1dGVkOiB7XG5cdCAgICBuYXZTdHlsZUNsYXNzOiBmdW5jdGlvbiBuYXZTdHlsZUNsYXNzKCkge1xuXHQgICAgICByZXR1cm4gWyduYXYnLCB+WydwaWxscycsICdzdGFja2VkJ10uaW5kZXhPZih0aGlzLm5hdlN0eWxlKSA/ICduYXYtJyArIHRoaXMubmF2U3R5bGUgOiAnbmF2LXRhYnMnLCB7XG5cdCAgICAgICAgJ25hdi1qdXN0aWZpZWQnOiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5qdXN0aWZpZWQpLFxuXHQgICAgICAgICduYXYtcGlsbHMnOiB0aGlzLm5hdlN0eWxlID09PSAnc3RhY2tlZCdcblx0ICAgICAgfV07XG5cdCAgICB9LFxuXHQgICAgc2hvdzogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudGFic1t0aGlzLmluZGV4XSB8fCB0aGlzLnRhYnNbMF07XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdCh0YWIpIHtcblx0ICAgICAgaWYgKCF0YWIuZGlzYWJsZWQpIHtcblx0ICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy50YWJzLmluZGV4T2YodGFiKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sXG5cdCAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHtcblx0ICAgIHRoaXMuX2lzVGFicyA9IHRydWU7XG5cdCAgfVxuXHR9O1xuXG4vKioqLyB9LFxuLyogMTc4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidGFic1wiOiBcIlwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygndWwnLCB7XG5cdCAgICBjbGFzczogX3ZtLm5hdlN0eWxlQ2xhc3MsXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcInJvbGVcIjogXCJ0YWJsaXN0XCJcblx0ICAgIH1cblx0ICB9LCBbX3ZtLl9sKChfdm0uaGVhZGVycyksIGZ1bmN0aW9uKGhlYWRlcikge1xuXHQgICAgcmV0dXJuIFsoaGVhZGVyLl9pc1RhYikgPyBfdm0uX2MoJ2xpJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZSwgZGlzYWJsZWQ6IGhlYWRlci5kaXNhYmxlZFxuXHQgICAgICB9LFxuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICAgIF92bS5zZWxlY3QoaGVhZGVyKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fdChcImhlYWRlclwiLCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICB9LFxuXHQgICAgICBkb21Qcm9wczoge1xuXHQgICAgICAgIFwiaW5uZXJIVE1MXCI6IF92bS5fcyhoZWFkZXIuaGVhZGVyKVxuXHQgICAgICB9XG5cdCAgICB9KV0pXSwgMikgOiBfdm0uX2UoKSwgX3ZtLl92KFwiIFwiKSwgKGhlYWRlci5faXNUYWJHcm91cCkgPyBfdm0uX2MoJ2Ryb3Bkb3duJywge1xuXHQgICAgICBjbGFzczoge1xuXHQgICAgICAgIGFjdGl2ZTogaGVhZGVyLmFjdGl2ZVxuXHQgICAgICB9LFxuXHQgICAgICBhdHRyczoge1xuXHQgICAgICAgIFwidGV4dFwiOiBoZWFkZXIuaGVhZGVyLFxuXHQgICAgICAgIFwiZGlzYWJsZWRcIjogaGVhZGVyLmRpc2FibGVkXG5cdCAgICAgIH1cblx0ICAgIH0sIF92bS5fbCgoaGVhZGVyLnRhYnMpLCBmdW5jdGlvbih0YWIpIHtcblx0ICAgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgICAgY2xhc3M6IHtcblx0ICAgICAgICAgIGRpc2FibGVkOiB0YWIuZGlzYWJsZWRcblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX2MoJ2EnLCB7XG5cdCAgICAgICAgYXR0cnM6IHtcblx0ICAgICAgICAgIFwiaHJlZlwiOiBcIiNcIlxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgb246IHtcblx0ICAgICAgICAgIFwiY2xpY2tcIjogZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICBfdm0uc2VsZWN0KHRhYilcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH0sIFtfdm0uX3YoX3ZtLl9zKHRhYi5oZWFkZXIpKV0pXSlcblx0ICAgIH0pKSA6IF92bS5fZSgpXVxuXHQgIH0pXSwgMiksIF92bS5fdihcIiBcIiksIF92bS5fYygnZGl2Jywge1xuXHQgICAgc3RhdGljQ2xhc3M6IFwidGFiLWNvbnRlbnRcIlxuXHQgIH0sIFtfdm0uX3QoXCJkZWZhdWx0XCIpXSwgMildKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi03MDEwMGRkZlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE3OSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODApXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTgxKVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvZ2dsZUJ1dHRvbi52dWVcIlxuXHRfX3Z1ZV9vcHRpb25zX18ucmVuZGVyID0gX192dWVfdGVtcGxhdGVfXy5yZW5kZXJcblx0X192dWVfb3B0aW9uc19fLnN0YXRpY1JlbmRlckZucyA9IF9fdnVlX3RlbXBsYXRlX18uc3RhdGljUmVuZGVyRm5zXG5cdFxuXHQvKiBob3QgcmVsb2FkICovXG5cdGlmIChmYWxzZSkgeyhmdW5jdGlvbiAoKSB7XG5cdCAgdmFyIGhvdEFQSSA9IHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIilcblx0ICBob3RBUEkuaW5zdGFsbChyZXF1aXJlKFwidnVlXCIpLCBmYWxzZSlcblx0ICBpZiAoIWhvdEFQSS5jb21wYXRpYmxlKSByZXR1cm5cblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKCFtb2R1bGUuaG90LmRhdGEpIHtcblx0ICAgIGhvdEFQSS5jcmVhdGVSZWNvcmQoXCJkYXRhLXYtZjAzNGE1ZjJcIiwgX192dWVfb3B0aW9uc19fKVxuXHQgIH0gZWxzZSB7XG5cdCAgICBob3RBUEkucmVsb2FkKFwiZGF0YS12LWYwMzRhNWYyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9XG5cdH0pKCl9XG5cdGlmIChfX3Z1ZV9vcHRpb25zX18uZnVuY3Rpb25hbCkge2NvbnNvbGUuZXJyb3IoXCJbdnVlLWxvYWRlcl0gVG9nZ2xlQnV0dG9uLnZ1ZTogZnVuY3Rpb25hbCBjb21wb25lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBwbGFpbiBqcyBmaWxlcyB1c2luZyByZW5kZXIgZnVuY3Rpb25zLlwiKX1cblx0XG5cdG1vZHVsZS5leHBvcnRzID0gX192dWVfZXhwb3J0c19fXG5cblxuLyoqKi8gfSxcbi8qIDE4MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2NSk7XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGRpc2FibGVkOiB7IGRlZmF1bHQ6IG51bGwgfSxcblx0ICAgIGZhbHNlVHlwZTogeyBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBuYW1lOiBudWxsLFxuXHQgICAgcmVhZG9ubHk6IHsgZGVmYXVsdDogbnVsbCB9LFxuXHQgICAgdHJ1ZVR5cGU6IHsgZGVmYXVsdDogJ3ByaW1hcnknIH0sXG5cdCAgICB2YWx1ZTogZmFsc2Vcblx0ICB9LFxuXHQgIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICBhY3RpdmU6IF91dGlscy5jb2VyY2UuYm9vbGVhbih0aGlzLnZhbHVlKSxcblx0ICAgICAgdHlwZXM6IHtcblx0ICAgICAgICBkYW5nZXI6ICdidG4tZGFuZ2VyJyxcblx0ICAgICAgICBpbmZvOiAnYnRuLWluZm8nLFxuXHQgICAgICAgIHByaW1hcnk6ICdidG4tcHJpbWFyeScsXG5cdCAgICAgICAgc3VjY2VzczogJ2J0bi1zdWNjZXNzJyxcblx0ICAgICAgICB3YXJuaW5nOiAnYnRuLXdhcm5pbmcnXG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgd2F0Y2g6IHtcblx0ICAgIGFjdGl2ZTogZnVuY3Rpb24gYWN0aXZlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZWQnLCB2YWwpO1xuXHQgICAgICAgIHRoaXMuJGVtaXQodmFsID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJyk7XG5cdCAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWwpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCwgb2xkKSB7XG5cdCAgICAgIGlmICh2YWwgIT09IG9sZCkge1xuXHQgICAgICAgIHRoaXMuYWN0aXZlID0gX3V0aWxzLmNvZXJjZS5ib29sZWFuKHRoaXMudmFsdWUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjb21wdXRlZDoge1xuXHQgICAgYm9vbERpc2FibGVkOiBmdW5jdGlvbiBib29sRGlzYWJsZWQoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5kaXNhYmxlZCk7XG5cdCAgICB9LFxuXHQgICAgYm9vbFJlYWRvbmx5OiBmdW5jdGlvbiBib29sUmVhZG9ubHkoKSB7XG5cdCAgICAgIHJldHVybiBfdXRpbHMuY29lcmNlLmJvb2xlYW4odGhpcy5yZWFkb25seSk7XG5cdCAgICB9LFxuXHQgICAgdHlwZTogZnVuY3Rpb24gdHlwZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMudHlwZXNbdGhpcy52YWx1ZSA/IHRoaXMudHJ1ZVR5cGUgOiB0aGlzLmZhbHNlVHlwZV0gfHwgJ2J0bi1kZWZhdWx0Jztcblx0ICAgIH1cblx0ICB9LFxuXHQgIG1ldGhvZHM6IHtcblx0ICAgIHRvZ2dsZTogZnVuY3Rpb24gdG9nZ2xlKCkge1xuXHQgICAgICBpZiAodGhpcy5ib29sRGlzYWJsZWQgfHwgdGhpcy5ib29sUmVhZG9ubHkpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0ICAgICAgdGhpcy5hY3RpdmUgPSAhdGhpcy5hY3RpdmU7XG5cdCAgICB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTgxICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2EnLCB7XG5cdCAgICBjbGFzczogWydidG4nLCBfdm0udHlwZSwge1xuXHQgICAgICByZWFkb25seTogX3ZtLmJvb2xSZWFkb25seVxuXHQgICAgfV0sXG5cdCAgICBhdHRyczoge1xuXHQgICAgICBcImhyZWZcIjogXCJqYXZhc2NyaXB0OnZvaWQoMClcIixcblx0ICAgICAgXCJkaXNhYmxlZFwiOiBfdm0uYm9vbERpc2FibGVkXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJjbGlja1wiOiBfdm0udG9nZ2xlXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnc3BhbicsIHtcblx0ICAgIGNsYXNzOiBbJ2dseXBoaWNvbicsICdnbHlwaGljb24tJyArIChfdm0udmFsdWUgPyAnb2snIDogJ3JlbW92ZScpXVxuXHQgIH0pLCBfdm0uX3YoXCIgXCIpLCBfdm0uX3QoXCJkZWZhdWx0XCIpLCBfdm0uX3YoXCIgXCIpLCAoX3ZtLm5hbWUpID8gX3ZtLl9jKCdpbnB1dCcsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwidHlwZVwiOiBcImhpZGRlblwiLFxuXHQgICAgICBcIm5hbWVcIjogX3ZtLm5hbWVcblx0ICAgIH0sXG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcInZhbHVlXCI6IF92bS5hY3RpdmUgPyAxIDogMFxuXHQgICAgfVxuXHQgIH0pIDogX3ZtLl9lKCldLCAyKVxuXHR9LHN0YXRpY1JlbmRlckZuczogW119XG5cdGlmIChmYWxzZSkge1xuXHQgIG1vZHVsZS5ob3QuYWNjZXB0KClcblx0ICBpZiAobW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICAgcmVxdWlyZShcInZ1ZS1ob3QtcmVsb2FkLWFwaVwiKS5yZXJlbmRlcihcImRhdGEtdi1mMDM0YTVmMlwiLCBtb2R1bGUuZXhwb3J0cylcblx0ICB9XG5cdH1cblxuLyoqKi8gfSxcbi8qIDE4MiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIF9fdnVlX2V4cG9ydHNfXywgX192dWVfb3B0aW9uc19fXG5cdHZhciBfX3Z1ZV9zdHlsZXNfXyA9IHt9XG5cdFxuXHQvKiBzdHlsZXMgKi9cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxODMpXG5cdFxuXHQvKiBzY3JpcHQgKi9cblx0X192dWVfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODUpXG5cdFxuXHQvKiB0ZW1wbGF0ZSAqL1xuXHR2YXIgX192dWVfdGVtcGxhdGVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTg2KVxuXHRfX3Z1ZV9vcHRpb25zX18gPSBfX3Z1ZV9leHBvcnRzX18gPSBfX3Z1ZV9leHBvcnRzX18gfHwge31cblx0aWYgKFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJvYmplY3RcIiB8fFxuXHQgIHR5cGVvZiBfX3Z1ZV9leHBvcnRzX18uZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiXG5cdCkge1xuXHRpZiAoT2JqZWN0LmtleXMoX192dWVfZXhwb3J0c19fKS5zb21lKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGtleSAhPT0gXCJkZWZhdWx0XCIgJiYga2V5ICE9PSBcIl9fZXNNb2R1bGVcIiB9KSkge2NvbnNvbGUuZXJyb3IoXCJuYW1lZCBleHBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICoudnVlIGZpbGVzLlwiKX1cblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fLmRlZmF1bHRcblx0fVxuXHRpZiAodHlwZW9mIF9fdnVlX29wdGlvbnNfXyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgX192dWVfb3B0aW9uc19fID0gX192dWVfb3B0aW9uc19fLm9wdGlvbnNcblx0fVxuXHRfX3Z1ZV9vcHRpb25zX18uX19maWxlID0gXCJDOlxcXFxsYXJhZ29uXFxcXHd3d1xcXFx2dWUtc3RyYXBcXFxcc3JjXFxcXFRvb2x0aXAudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTQ4ZmI1MWIyXCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi00OGZiNTFiMlwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFRvb2x0aXAudnVlOiBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYXJlIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZCBiZSBkZWZpbmVkIGluIHBsYWluIGpzIGZpbGVzIHVzaW5nIHJlbmRlciBmdW5jdGlvbnMuXCIpfVxuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBfX3Z1ZV9leHBvcnRzX19cblxuXG4vKioqLyB9LFxuLyogMTgzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvLyBzdHlsZS1sb2FkZXI6IEFkZHMgc29tZSBjc3MgdG8gdGhlIERPTSBieSBhZGRpbmcgYSA8c3R5bGU+IHRhZ1xuXHRcblx0Ly8gbG9hZCB0aGUgc3R5bGVzXG5cdHZhciBjb250ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODQpO1xuXHRpZih0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcblx0Ly8gYWRkIHRoZSBzdHlsZXMgdG8gdGhlIERPTVxuXHR2YXIgdXBkYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3OSkoY29udGVudCwge30pO1xuXHRpZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2Fscztcblx0Ly8gSG90IE1vZHVsZSBSZXBsYWNlbWVudFxuXHRpZihmYWxzZSkge1xuXHRcdC8vIFdoZW4gdGhlIHN0eWxlcyBjaGFuZ2UsIHVwZGF0ZSB0aGUgPHN0eWxlPiB0YWdzXG5cdFx0aWYoIWNvbnRlbnQubG9jYWxzKSB7XG5cdFx0XHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTQ4ZmI1MWIyIS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9Ub29sdGlwLnZ1ZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIG5ld0NvbnRlbnQgPSByZXF1aXJlKFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNDhmYjUxYjIhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1Rvb2x0aXAudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg0ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXG59XFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXG59XFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXG59XFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcbjAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxuMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG59XFxuQGtleWZyYW1lcyBmYWRlaW4tb3V0IHtcXG4wJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcbn1cXG4xMDAlIHtcXHJcXG4gICAgb3BhY2l0eTogMDtcXG59XFxufVxcclxcblwiLCBcIlwiLCB7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCIvLi9zcmMvVG9vbHRpcC52dWU/MzdkMTgzZWNcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIjtBQTJCQTs7OztFQUlBLFlBQUE7Q0FDQTtBQUNBO0VBQ0EsaUNBQUE7Q0FDQTtBQUNBO0VBQ0EsbUNBQUE7Q0FDQTtBQUNBO0FBQ0E7SUFDQSxXQUFBO0NBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtDQUNBO0FBQ0E7QUFDQTtJQUNBLFlBQUE7Q0FDQTtBQUNBO0lBQ0EsV0FBQTtDQUNBO0NBQ0FcIixcImZpbGVcIjpcIlRvb2x0aXAudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxzcGFuIHJlZj1cXFwidHJpZ2dlclxcXCI+XFxyXFxuICAgIDxzbG90Pjwvc2xvdD5cXHJcXG4gICAgPHRyYW5zaXRpb24gOm5hbWU9XFxcImVmZmVjdFxcXCI+XFxyXFxuICAgICAgPGRpdiByZWY9XFxcInBvcG92ZXJcXFwiIHYtaWY9XFxcInNob3dcXFwiIDpjbGFzcz1cXFwiWyd0b29sdGlwJyxwbGFjZW1lbnRdXFxcIj5cXHJcXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcInRvb2x0aXAtYXJyb3dcXFwiPjwvZGl2PlxcclxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwidG9vbHRpcC1pbm5lclxcXCI+XFxyXFxuICAgICAgICAgIDxzbG90IG5hbWU9XFxcImNvbnRlbnRcXFwiPjxkaXYgdi1odG1sPVxcXCJjb250ZW50XFxcIj48L2Rpdj48L3Nsb3Q+XFxyXFxuICAgICAgICA8L2Rpdj5cXHJcXG4gICAgICA8L2Rpdj5cXHJcXG4gICAgPC90cmFuc2l0aW9uPlxcclxcbiAgPC9zcGFuPlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQgUG9wb3Zlck1peGluIGZyb20gJy4vdXRpbHMvcG9wb3Zlck1peGlucy5qcydcXHJcXG5cXHJcXG5leHBvcnQgZGVmYXVsdCB7XFxyXFxuICBtaXhpbnM6IFtQb3BvdmVyTWl4aW5dLFxcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgZWZmZWN0OiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnfSxcXHJcXG4gICAgdHJpZ2dlcjoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJ31cXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi50b29sdGlwLnRvcCxcXHJcXG4udG9vbHRpcC5sZWZ0LFxcclxcbi50b29sdGlwLnJpZ2h0LFxcclxcbi50b29sdGlwLmJvdHRvbSB7XFxyXFxuICBvcGFjaXR5OiAuOTtcXHJcXG59XFxyXFxuLmZhZGVpbi1lbnRlciB7XFxyXFxuICBhbmltYXRpb246ZmFkZWluLWluIDAuM3MgZWFzZS1pbjtcXHJcXG59XFxyXFxuLmZhZGVpbi1sZWF2ZS1hY3RpdmUge1xcclxcbiAgYW5pbWF0aW9uOmZhZGVpbi1vdXQgMC4zcyBlYXNlLW91dDtcXHJcXG59XFxyXFxuQGtleWZyYW1lcyBmYWRlaW4taW4ge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbiAgMTAwJSB7XFxyXFxuICAgIG9wYWNpdHk6IC45O1xcclxcbiAgfVxcclxcbn1cXHJcXG5Aa2V5ZnJhbWVzIGZhZGVpbi1vdXQge1xcclxcbiAgMCUge1xcclxcbiAgICBvcGFjaXR5OiAuOTtcXHJcXG4gIH1cXHJcXG4gIDEwMCUge1xcclxcbiAgICBvcGFjaXR5OiAwO1xcclxcbiAgfVxcclxcbn1cXHJcXG48L3N0eWxlPlxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIndlYnBhY2s6Ly9cIn1dKTtcblx0XG5cdC8vIGV4cG9ydHNcblxuXG4vKioqLyB9LFxuLyogMTg1ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGlucyA9IF9fd2VicGFja19yZXF1aXJlX18oMTQzKTtcblx0XG5cdHZhciBfcG9wb3Zlck1peGluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3BvdmVyTWl4aW5zKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgbWl4aW5zOiBbX3BvcG92ZXJNaXhpbnMyLmRlZmF1bHRdLFxuXHQgIHByb3BzOiB7XG5cdCAgICBlZmZlY3Q6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2NhbGUnIH0sXG5cdCAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2hvdmVyJyB9XG5cdCAgfVxuXHR9OyAvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXHQvL1xuXG4vKioqLyB9LFxuLyogMTg2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ3NwYW4nLCB7XG5cdCAgICByZWY6IFwidHJpZ2dlclwiXG5cdCAgfSwgW192bS5fdChcImRlZmF1bHRcIiksIF92bS5fdihcIiBcIiksIF92bS5fYygndHJhbnNpdGlvbicsIHtcblx0ICAgIGF0dHJzOiB7XG5cdCAgICAgIFwibmFtZVwiOiBfdm0uZWZmZWN0XG5cdCAgICB9XG5cdCAgfSwgWyhfdm0uc2hvdykgPyBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIHJlZjogXCJwb3BvdmVyXCIsXG5cdCAgICBjbGFzczogWyd0b29sdGlwJywgX3ZtLnBsYWNlbWVudF1cblx0ICB9LCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWFycm93XCJcblx0ICB9KSwgX3ZtLl92KFwiIFwiKSwgX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBzdGF0aWNDbGFzczogXCJ0b29sdGlwLWlubmVyXCJcblx0ICB9LCBbX3ZtLl90KFwiY29udGVudFwiLCBbX3ZtLl9jKCdkaXYnLCB7XG5cdCAgICBkb21Qcm9wczoge1xuXHQgICAgICBcImlubmVySFRNTFwiOiBfdm0uX3MoX3ZtLmNvbnRlbnQpXG5cdCAgICB9XG5cdCAgfSldKV0sIDIpXSkgOiBfdm0uX2UoKV0pXSwgMilcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNDhmYjUxYjJcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH0sXG4vKiAxODcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBfX3Z1ZV9leHBvcnRzX18sIF9fdnVlX29wdGlvbnNfX1xuXHR2YXIgX192dWVfc3R5bGVzX18gPSB7fVxuXHRcblx0Lyogc3R5bGVzICovXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTg4KVxuXHRcblx0Lyogc2NyaXB0ICovXG5cdF9fdnVlX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMTkwKVxuXHRcblx0LyogdGVtcGxhdGUgKi9cblx0dmFyIF9fdnVlX3RlbXBsYXRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwNilcblx0X192dWVfb3B0aW9uc19fID0gX192dWVfZXhwb3J0c19fID0gX192dWVfZXhwb3J0c19fIHx8IHt9XG5cdGlmIChcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgfHxcblx0ICB0eXBlb2YgX192dWVfZXhwb3J0c19fLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0aWYgKE9iamVjdC5rZXlzKF9fdnVlX2V4cG9ydHNfXykuc29tZShmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkgIT09IFwiZGVmYXVsdFwiICYmIGtleSAhPT0gXCJfX2VzTW9kdWxlXCIgfSkpIHtjb25zb2xlLmVycm9yKFwibmFtZWQgZXhwb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBpbiAqLnZ1ZSBmaWxlcy5cIil9XG5cdF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX2V4cG9ydHNfXyA9IF9fdnVlX2V4cG9ydHNfXy5kZWZhdWx0XG5cdH1cblx0aWYgKHR5cGVvZiBfX3Z1ZV9vcHRpb25zX18gPT09IFwiZnVuY3Rpb25cIikge1xuXHQgIF9fdnVlX29wdGlvbnNfXyA9IF9fdnVlX29wdGlvbnNfXy5vcHRpb25zXG5cdH1cblx0X192dWVfb3B0aW9uc19fLl9fZmlsZSA9IFwiQzpcXFxcbGFyYWdvblxcXFx3d3dcXFxcdnVlLXN0cmFwXFxcXHNyY1xcXFxUeXBlYWhlYWQudnVlXCJcblx0X192dWVfb3B0aW9uc19fLnJlbmRlciA9IF9fdnVlX3RlbXBsYXRlX18ucmVuZGVyXG5cdF9fdnVlX29wdGlvbnNfXy5zdGF0aWNSZW5kZXJGbnMgPSBfX3Z1ZV90ZW1wbGF0ZV9fLnN0YXRpY1JlbmRlckZuc1xuXHRcblx0LyogaG90IHJlbG9hZCAqL1xuXHRpZiAoZmFsc2UpIHsoZnVuY3Rpb24gKCkge1xuXHQgIHZhciBob3RBUEkgPSByZXF1aXJlKFwidnVlLWhvdC1yZWxvYWQtYXBpXCIpXG5cdCAgaG90QVBJLmluc3RhbGwocmVxdWlyZShcInZ1ZVwiKSwgZmFsc2UpXG5cdCAgaWYgKCFob3RBUEkuY29tcGF0aWJsZSkgcmV0dXJuXG5cdCAgbW9kdWxlLmhvdC5hY2NlcHQoKVxuXHQgIGlmICghbW9kdWxlLmhvdC5kYXRhKSB7XG5cdCAgICBob3RBUEkuY3JlYXRlUmVjb3JkKFwiZGF0YS12LTViNWY1ZTk0XCIsIF9fdnVlX29wdGlvbnNfXylcblx0ICB9IGVsc2Uge1xuXHQgICAgaG90QVBJLnJlbG9hZChcImRhdGEtdi01YjVmNWU5NFwiLCBfX3Z1ZV9vcHRpb25zX18pXG5cdCAgfVxuXHR9KSgpfVxuXHRpZiAoX192dWVfb3B0aW9uc19fLmZ1bmN0aW9uYWwpIHtjb25zb2xlLmVycm9yKFwiW3Z1ZS1sb2FkZXJdIFR5cGVhaGVhZC52dWU6IGZ1bmN0aW9uYWwgY29tcG9uZW50cyBhcmUgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkIGJlIGRlZmluZWQgaW4gcGxhaW4ganMgZmlsZXMgdXNpbmcgcmVuZGVyIGZ1bmN0aW9ucy5cIil9XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fdnVlX2V4cG9ydHNfX1xuXG5cbi8qKiovIH0sXG4vKiAxODggKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdC8vIHN0eWxlLWxvYWRlcjogQWRkcyBzb21lIGNzcyB0byB0aGUgRE9NIGJ5IGFkZGluZyBhIDxzdHlsZT4gdGFnXG5cdFxuXHQvLyBsb2FkIHRoZSBzdHlsZXNcblx0dmFyIGNvbnRlbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4OSk7XG5cdGlmKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuXHQvLyBhZGQgdGhlIHN0eWxlcyB0byB0aGUgRE9NXG5cdHZhciB1cGRhdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc5KShjb250ZW50LCB7fSk7XG5cdGlmKGNvbnRlbnQubG9jYWxzKSBtb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzO1xuXHQvLyBIb3QgTW9kdWxlIFJlcGxhY2VtZW50XG5cdGlmKGZhbHNlKSB7XG5cdFx0Ly8gV2hlbiB0aGUgc3R5bGVzIGNoYW5nZSwgdXBkYXRlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRpZighY29udGVudC5sb2NhbHMpIHtcblx0XHRcdG1vZHVsZS5ob3QuYWNjZXB0KFwiISEuLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2luZGV4LmpzP3NvdXJjZU1hcCEuLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9zdHlsZS1yZXdyaXRlci5qcz9pZD1kYXRhLXYtNWI1ZjVlOTQhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc2VsZWN0b3IuanM/dHlwZT1zdHlsZXMmaW5kZXg9MCEuL1R5cGVhaGVhZC52dWVcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9pbmRleC5qcz9zb3VyY2VNYXAhLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvc3R5bGUtcmV3cml0ZXIuanM/aWQ9ZGF0YS12LTViNWY1ZTk0IS4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3NlbGVjdG9yLmpzP3R5cGU9c3R5bGVzJmluZGV4PTAhLi9UeXBlYWhlYWQudnVlXCIpO1xuXHRcdFx0XHRpZih0eXBlb2YgbmV3Q29udGVudCA9PT0gJ3N0cmluZycpIG5ld0NvbnRlbnQgPSBbW21vZHVsZS5pZCwgbmV3Q29udGVudCwgJyddXTtcblx0XHRcdFx0dXBkYXRlKG5ld0NvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFdoZW4gdGhlIG1vZHVsZSBpcyBkaXNwb3NlZCwgcmVtb3ZlIHRoZSA8c3R5bGU+IHRhZ3Ncblx0XHRtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24oKSB7IHVwZGF0ZSgpOyB9KTtcblx0fVxuXG4vKioqLyB9LFxuLyogMTg5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDc4KSgpO1xuXHQvLyBpbXBvcnRzXG5cdFxuXHRcblx0Ly8gbW9kdWxlXG5cdGV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxyXFxuXCIsIFwiXCIsIHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIi8uL3NyYy9UeXBlYWhlYWQudnVlPzZhMDM5OTdmXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCI7QUFvSUE7RUFDQSxnQkFBQTtDQUNBXCIsXCJmaWxlXCI6XCJUeXBlYWhlYWQudnVlXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjx0ZW1wbGF0ZT5cXHJcXG4gIDxkaXYgc3R5bGU9XFxcInBvc2l0aW9uOiByZWxhdGl2ZVxcXCIgOmNsYXNzPVxcXCJ7J29wZW4nOnNob3dEcm9wZG93bn1cXFwiPlxcclxcbiAgICA8aW5wdXQgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgYXV0b2NvbXBsZXRlPVxcXCJvZmZcXFwiXFxyXFxuICAgICAgdi1tb2RlbD1cXFwidmFsXFxcIlxcclxcbiAgICAgIDpwbGFjZWhvbGRlcj1cXFwicGxhY2Vob2xkZXJcXFwiXFxyXFxuICAgICAgQGJsdXI9XFxcInNob3dEcm9wZG93biA9IGZhbHNlXFxcIlxcclxcbiAgICAgIEBrZXlkb3duLmRvd249XFxcImRvd25cXFwiXFxyXFxuICAgICAgQGtleWRvd24uZW50ZXI9IFxcXCJoaXRcXFwiXFxyXFxuICAgICAgQGtleWRvd24uZXNjPVxcXCJyZXNldFxcXCJcXHJcXG4gICAgICBAa2V5ZG93bi51cD1cXFwidXBcXFwiXFxyXFxuICAgIC8+XFxyXFxuICAgIDx1bCBjbGFzcz1cXFwiZHJvcGRvd24tbWVudVxcXCIgcmVmPVxcXCJkcm9wZG93blxcXCI+XFxyXFxuICAgICAgPGxpIHYtZm9yPVxcXCIoaXRlbSwgaSkgaW4gaXRlbXNcXFwiIDpjbGFzcz1cXFwieydhY3RpdmUnOiBpc0FjdGl2ZShpKX1cXFwiPlxcclxcbiAgICAgICAgPGEgQG1vdXNlZG93bi5wcmV2ZW50PVxcXCJoaXRcXFwiIEBtb3VzZW1vdmU9XFxcInNldEFjdGl2ZShpKVxcXCI+XFxyXFxuICAgICAgICAgIDxjb21wb25lbnQgOmlzPVxcXCJ0bXBsXFxcIiA6aXRlbT1cXFwiaXRlbVxcXCI+PC9jb21wb25lbnQ+XFxyXFxuICAgICAgICA8L2E+XFxyXFxuICAgICAgPC9saT5cXHJcXG4gICAgPC91bD5cXHJcXG4gIDwvZGl2PlxcclxcbjwvdGVtcGxhdGU+XFxyXFxuXFxyXFxuPHNjcmlwdD5cXHJcXG5pbXBvcnQge2RlbGF5ZXIsIGdldEpTT059IGZyb20gJy4vdXRpbHMvdXRpbHMuanMnXFxyXFxudmFyIERFTEFZID0gMzAwXFxyXFxuXFxyXFxuZXhwb3J0IGRlZmF1bHQge1xcclxcbiAgcHJvcHM6IHtcXHJcXG4gICAgYXN5bmM6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICBkYXRhOiB7dHlwZTogQXJyYXl9LFxcclxcbiAgICBkZWxheToge3R5cGU6IE51bWJlciwgZGVmYXVsdDogREVMQVl9LFxcclxcbiAgICBhc3luY0tleToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbH0sXFxyXFxuICAgIGxpbWl0OiB7dHlwZTogTnVtYmVyLCBkZWZhdWx0OiA4fSxcXHJcXG4gICAgbWF0Y2hDYXNlOiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBtYXRjaFN0YXJ0OiB7dHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2V9LFxcclxcbiAgICBvbkhpdDoge1xcclxcbiAgICAgIHR5cGU6IEZ1bmN0aW9uLFxcclxcbiAgICAgIGRlZmF1bHQgKGl0ZW0pIHtcXHJcXG4gICAgICAgIHRoaXMucmVzZXQoKVxcclxcbiAgICAgICAgdGhpcy52YWx1ZSA9IGl0ZW1cXHJcXG4gICAgICB9XFxyXFxuICAgIH0sXFxyXFxuICAgIHBsYWNlaG9sZGVyOiB7dHlwZTogU3RyaW5nfSxcXHJcXG4gICAgdGVtcGxhdGU6IHt0eXBlOiBTdHJpbmd9LFxcclxcbiAgICB2YWx1ZToge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJyd9XFxyXFxuICB9LFxcclxcbiAgZGF0YSAoKSB7XFxyXFxuICAgIHJldHVybiB7XFxyXFxuICAgICAgc2hvd0Ryb3Bkb3duOiBmYWxzZSxcXHJcXG4gICAgICBub1Jlc3VsdHM6IHRydWUsXFxyXFxuICAgICAgY3VycmVudDogMCxcXHJcXG4gICAgICBpdGVtczogW10sXFxyXFxuICAgICAgdmFsOiAnJ1xcclxcbiAgICB9XFxyXFxuICB9LFxcclxcbiAgY29tcHV0ZWQ6IHtcXHJcXG4gICAgdGVtcGxhdGVIdG1sICgpIHsgcmV0dXJuIHR5cGVvZiB0aGlzLnRlbXBsYXRlID09PSAnc3RyaW5nJyA/ICc8c3Bhbj4nICsgdGhpcy50ZW1wbGF0ZSArICc8L3NwYW4+JyA6IG51bGwgfSxcXHJcXG4gICAgdG1wbCAoKSB7IHJldHVybiB0aGlzLl90bXBsfVxcclxcbiAgfSxcXHJcXG4gIHdhdGNoOiB7XFxyXFxuICAgIHZhbCAodmFsLCBvbGQpIHtcXHJcXG4gICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIHZhbClcXHJcXG4gICAgICBpZiAodmFsICE9PSBvbGQpIHRoaXMuX3VwZGF0ZSgpXFxyXFxuICAgIH0sXFxyXFxuICAgIHZhbHVlICh2YWwpIHtcXHJcXG4gICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkgeyB0aGlzLnZhbCA9IHZhbCB9XFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBtZXRob2RzOiB7XFxyXFxuICAgIHNldEl0ZW1zIChkYXRhKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcXHJcXG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLmFzeW5jS2V5ID8gZGF0YVt0aGlzLmFzeW5jS2V5XSA6IGRhdGFcXHJcXG4gICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHRoaXMubGltaXQpXFxyXFxuICAgICAgfSBlbHNlIHtcXHJcXG4gICAgICAgIHRoaXMuaXRlbXMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKHZhbHVlID0+IHtcXHJcXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHsgcmV0dXJuIHRydWUgfVxcclxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMubWF0Y2hDYXNlID8gdmFsdWUgOiB2YWx1ZS50b0xvd2VyQ2FzZSgpXFxyXFxuICAgICAgICAgIHZhciBxdWVyeSA9IHRoaXMubWF0Y2hDYXNlID8gdGhpcy52YWwgOiB0aGlzLnZhbC50b0xvd2VyQ2FzZSgpXFxyXFxuICAgICAgICAgIHJldHVybiB0aGlzLm1hdGNoU3RhcnQgPyB2YWx1ZS5pbmRleE9mKHF1ZXJ5KSA9PT0gMCA6IHZhbHVlLmluZGV4T2YocXVlcnkpICE9PSAtMVxcclxcbiAgICAgICAgfSkuc2xpY2UoMCwgdGhpcy5saW1pdClcXHJcXG4gICAgICB9XFxyXFxuICAgICAgdGhpcy5zaG93RHJvcGRvd24gPSB0aGlzLml0ZW1zLmxlbmd0aCA+IDBcXHJcXG4gICAgfSxcXHJcXG4gICAgcmVzZXQgKCkge1xcclxcbiAgICAgIHRoaXMuaXRlbXMgPSBbXVxcclxcbiAgICAgIHRoaXMudmFsID0gJydcXHJcXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxcclxcbiAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2VcXHJcXG4gICAgfSxcXHJcXG4gICAgc2V0QWN0aXZlIChpbmRleCkge1xcclxcbiAgICAgIHRoaXMuY3VycmVudCA9IGluZGV4XFxyXFxuICAgIH0sXFxyXFxuICAgIGlzQWN0aXZlIChpbmRleCkge1xcclxcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQgPT09IGluZGV4XFxyXFxuICAgIH0sXFxyXFxuICAgIGhpdCAoZSkge1xcclxcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxcclxcbiAgICAgIHRoaXMub25IaXQodGhpcy5pdGVtc1t0aGlzLmN1cnJlbnRdLCB0aGlzKVxcclxcbiAgICB9LFxcclxcbiAgICB1cCAoKSB7XFxyXFxuICAgICAgaWYgKHRoaXMuY3VycmVudCA+IDApIHRoaXMuY3VycmVudC0tXFxyXFxuICAgIH0sXFxyXFxuICAgIGRvd24gKCkge1xcclxcbiAgICAgIGlmICh0aGlzLmN1cnJlbnQgPCB0aGlzLml0ZW1zLmxlbmd0aCAtIDEpIHRoaXMuY3VycmVudCsrXFxyXFxuICAgIH1cXHJcXG4gIH0sXFxyXFxuICBjcmVhdGVkICgpIHtcXHJcXG4gICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlXFxyXFxuICAgIHRoaXMuX3RtcGwgPSB7XFxyXFxuICAgICAgdGVtcGxhdGU6IHRoaXMudGVtcGxhdGVIdG1sIHx8ICc8c3Ryb25nIHYtaHRtbD1cXFwiaXRlbVxcXCI+PC9zdHJvbmc+JyxcXHJcXG4gICAgICBwcm9wczoge1xcclxcbiAgICAgICAgaXRlbToge2RlZmF1bHQ6IG51bGx9XFxyXFxuICAgICAgfVxcclxcbiAgICB9XFxyXFxuICAgIHRoaXMuX3VwZGF0ZSA9IGRlbGF5ZXIoZnVuY3Rpb24gKCkge1xcclxcbiAgICAgIGlmICghdGhpcy52YWwpIHtcXHJcXG4gICAgICAgIHRoaXMucmVzZXQoKVxcclxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxyXFxuICAgICAgfVxcclxcbiAgICAgIGlmICh0aGlzLmFzeW5jKSB7XFxyXFxuICAgICAgICBnZXRKU09OKHRoaXMuYXN5bmMgKyB0aGlzLnZhbCkudGhlbihkYXRhID0+IHtcXHJcXG4gICAgICAgICAgdGhpcy5zZXRJdGVtcyhkYXRhKVxcclxcbiAgICAgICAgfSlcXHJcXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YSkge1xcclxcbiAgICAgICAgdGhpcy5zZXRJdGVtcyh0aGlzLmRhdGEpXFxyXFxuICAgICAgfVxcclxcbiAgICB9LCAnZGVsYXknLCBERUxBWSlcXHJcXG4gICAgdGhpcy5fdXBkYXRlKClcXHJcXG4gIH1cXHJcXG59XFxyXFxuPC9zY3JpcHQ+XFxyXFxuXFxyXFxuPHN0eWxlPlxcclxcbi5kcm9wZG93bi1tZW51ID4gbGkgPiBhIHtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG59XFxyXFxuPC9zdHlsZT5cIl0sXCJzb3VyY2VSb290XCI6XCJ3ZWJwYWNrOi8vXCJ9XSk7XG5cdFxuXHQvLyBleHBvcnRzXG5cblxuLyoqKi8gfSxcbi8qIDE5MCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0J3VzZSBzdHJpY3QnO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdFxuXHR2YXIgX3R5cGVvZjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5MSk7XG5cdFxuXHR2YXIgX3R5cGVvZjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90eXBlb2YyKTtcblx0XG5cdHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHR2YXIgREVMQVkgPSAzMDA7IC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdC8vXG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB7XG5cdCAgcHJvcHM6IHtcblx0ICAgIGFzeW5jOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgZGF0YTogeyB0eXBlOiBBcnJheSB9LFxuXHQgICAgZGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiBERUxBWSB9LFxuXHQgICAgYXN5bmNLZXk6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG5cdCAgICBsaW1pdDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDggfSxcblx0ICAgIG1hdGNoQ2FzZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgbWF0Y2hTdGFydDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuXHQgICAgb25IaXQ6IHtcblx0ICAgICAgdHlwZTogRnVuY3Rpb24sXG5cdCAgICAgIGRlZmF1bHQ6IGZ1bmN0aW9uIF9kZWZhdWx0KGl0ZW0pIHtcblx0ICAgICAgICB0aGlzLnJlc2V0KCk7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IGl0ZW07XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcgfSxcblx0ICAgIHRlbXBsYXRlOiB7IHR5cGU6IFN0cmluZyB9LFxuXHQgICAgdmFsdWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9XG5cdCAgfSxcblx0ICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkge1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgc2hvd0Ryb3Bkb3duOiBmYWxzZSxcblx0ICAgICAgbm9SZXN1bHRzOiB0cnVlLFxuXHQgICAgICBjdXJyZW50OiAwLFxuXHQgICAgICBpdGVtczogW10sXG5cdCAgICAgIHZhbDogJydcblx0ICAgIH07XG5cdCAgfSxcblx0XG5cdCAgY29tcHV0ZWQ6IHtcblx0ICAgIHRlbXBsYXRlSHRtbDogZnVuY3Rpb24gdGVtcGxhdGVIdG1sKCkge1xuXHQgICAgICByZXR1cm4gdHlwZW9mIHRoaXMudGVtcGxhdGUgPT09ICdzdHJpbmcnID8gJzxzcGFuPicgKyB0aGlzLnRlbXBsYXRlICsgJzwvc3Bhbj4nIDogbnVsbDtcblx0ICAgIH0sXG5cdCAgICB0bXBsOiBmdW5jdGlvbiB0bXBsKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fdG1wbDtcblx0ICAgIH1cblx0ICB9LFxuXHQgIHdhdGNoOiB7XG5cdCAgICB2YWw6IGZ1bmN0aW9uIHZhbChfdmFsLCBvbGQpIHtcblx0ICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCBfdmFsKTtcblx0ICAgICAgaWYgKF92YWwgIT09IG9sZCkgdGhpcy5fdXBkYXRlKCk7XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHZhbCkge1xuXHQgICAgICBpZiAodGhpcy52YWwgIT09IHZhbCkge1xuXHQgICAgICAgIHRoaXMudmFsID0gdmFsO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSxcblx0ICBtZXRob2RzOiB7XG5cdCAgICBzZXRJdGVtczogZnVuY3Rpb24gc2V0SXRlbXMoZGF0YSkge1xuXHQgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgaWYgKHRoaXMuYXN5bmMpIHtcblx0ICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy5hc3luY0tleSA/IGRhdGFbdGhpcy5hc3luY0tleV0gOiBkYXRhO1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuaXRlbXMgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgICAgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiAoMCwgX3R5cGVvZjMuZGVmYXVsdCkodmFsdWUpKSA9PT0gJ29iamVjdCcpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB2YWx1ZSA9IF90aGlzLm1hdGNoQ2FzZSA/IHZhbHVlIDogdmFsdWUudG9Mb3dlckNhc2UoKTtcblx0ICAgICAgICAgIHZhciBxdWVyeSA9IF90aGlzLm1hdGNoQ2FzZSA/IF90aGlzLnZhbCA6IF90aGlzLnZhbC50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzLm1hdGNoU3RhcnQgPyB2YWx1ZS5pbmRleE9mKHF1ZXJ5KSA9PT0gMCA6IHZhbHVlLmluZGV4T2YocXVlcnkpICE9PSAtMTtcblx0ICAgICAgICB9KS5zbGljZSgwLCB0aGlzLmxpbWl0KTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLnNob3dEcm9wZG93biA9IHRoaXMuaXRlbXMubGVuZ3RoID4gMDtcblx0ICAgIH0sXG5cdCAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG5cdCAgICAgIHRoaXMuaXRlbXMgPSBbXTtcblx0ICAgICAgdGhpcy52YWwgPSAnJztcblx0ICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cdCAgICAgIHRoaXMuc2hvd0Ryb3Bkb3duID0gZmFsc2U7XG5cdCAgICB9LFxuXHQgICAgc2V0QWN0aXZlOiBmdW5jdGlvbiBzZXRBY3RpdmUoaW5kZXgpIHtcblx0ICAgICAgdGhpcy5jdXJyZW50ID0gaW5kZXg7XG5cdCAgICB9LFxuXHQgICAgaXNBY3RpdmU6IGZ1bmN0aW9uIGlzQWN0aXZlKGluZGV4KSB7XG5cdCAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQgPT09IGluZGV4O1xuXHQgICAgfSxcblx0ICAgIGhpdDogZnVuY3Rpb24gaGl0KGUpIHtcblx0ICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICB0aGlzLm9uSGl0KHRoaXMuaXRlbXNbdGhpcy5jdXJyZW50XSwgdGhpcyk7XG5cdCAgICB9LFxuXHQgICAgdXA6IGZ1bmN0aW9uIHVwKCkge1xuXHQgICAgICBpZiAodGhpcy5jdXJyZW50ID4gMCkgdGhpcy5jdXJyZW50LS07XG5cdCAgICB9LFxuXHQgICAgZG93bjogZnVuY3Rpb24gZG93bigpIHtcblx0ICAgICAgaWYgKHRoaXMuY3VycmVudCA8IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkgdGhpcy5jdXJyZW50Kys7XG5cdCAgICB9XG5cdCAgfSxcblx0ICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkge1xuXHQgICAgdGhpcy52YWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgdGhpcy5fdG1wbCA9IHtcblx0ICAgICAgdGVtcGxhdGU6IHRoaXMudGVtcGxhdGVIdG1sIHx8ICc8c3Ryb25nIHYtaHRtbD1cIml0ZW1cIj48L3N0cm9uZz4nLFxuXHQgICAgICBwcm9wczoge1xuXHQgICAgICAgIGl0ZW06IHsgZGVmYXVsdDogbnVsbCB9XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdCAgICB0aGlzLl91cGRhdGUgPSAoMCwgX3V0aWxzLmRlbGF5ZXIpKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICBpZiAoIXRoaXMudmFsKSB7XG5cdCAgICAgICAgdGhpcy5yZXNldCgpO1xuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy5hc3luYykge1xuXHQgICAgICAgICgwLCBfdXRpbHMuZ2V0SlNPTikodGhpcy5hc3luYyArIHRoaXMudmFsKS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgICAgICAgICBfdGhpczIuc2V0SXRlbXMoZGF0YSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhKSB7XG5cdCAgICAgICAgdGhpcy5zZXRJdGVtcyh0aGlzLmRhdGEpO1xuXHQgICAgICB9XG5cdCAgICB9LCAnZGVsYXknLCBERUxBWSk7XG5cdCAgICB0aGlzLl91cGRhdGUoKTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblx0XG5cdHZhciBfaXRlcmF0b3IgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTtcblx0XG5cdHZhciBfaXRlcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXRlcmF0b3IpO1xuXHRcblx0dmFyIF9zeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5Mik7XG5cdFxuXHR2YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXHRcblx0dmFyIF90eXBlb2YgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBfaXRlcmF0b3IyLmRlZmF1bHQgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBfc3ltYm9sMi5kZWZhdWx0ICYmIG9iaiAhPT0gX3N5bWJvbDIuZGVmYXVsdC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YoX2l0ZXJhdG9yMi5kZWZhdWx0KSA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcblx0ICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mKG9iaik7XG5cdH0gOiBmdW5jdGlvbiAob2JqKSB7XG5cdCAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTkyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IF9fd2VicGFja19yZXF1aXJlX18oMTkzKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG4vKioqLyB9LFxuLyogMTkzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDE5NCk7XG5cdF9fd2VicGFja19yZXF1aXJlX18oMjAzKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXygyMDQpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fKDIwNSk7XG5cdG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KS5TeW1ib2w7XG5cbi8qKiovIH0sXG4vKiAxOTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdCd1c2Ugc3RyaWN0Jztcblx0Ly8gRUNNQVNjcmlwdCA2IHN5bWJvbHMgc2hpbVxuXHR2YXIgZ2xvYmFsICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpXG5cdCAgLCBoYXMgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpXG5cdCAgLCBERVNDUklQVE9SUyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpXG5cdCAgLCAkZXhwb3J0ICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNSlcblx0ICAsIHJlZGVmaW5lICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOClcblx0ICAsIE1FVEEgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTUpLktFWVxuXHQgICwgJGZhaWxzICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KVxuXHQgICwgc2hhcmVkICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQzKVxuXHQgICwgc2V0VG9TdHJpbmdUYWcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ3KVxuXHQgICwgdWlkICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KVxuXHQgICwgd2tzICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ4KVxuXHQgICwgd2tzRXh0ICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1KVxuXHQgICwgd2tzRGVmaW5lICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5Nilcblx0ICAsIGtleU9mICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOTcpXG5cdCAgLCBlbnVtS2V5cyAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk4KVxuXHQgICwgaXNBcnJheSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMSlcblx0ICAsIGFuT2JqZWN0ICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcblx0ICAsIHRvSU9iamVjdCAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIHRvUHJpbWl0aXZlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0ICAsIGNyZWF0ZURlc2MgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSlcblx0ICAsIF9jcmVhdGUgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMilcblx0ICAsIGdPUE5FeHQgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2MClcblx0ICAsICRHT1BEICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMDIpXG5cdCAgLCAkRFAgICAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpXG5cdCAgLCAka2V5cyAgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMzQpXG5cdCAgLCBnT1BEICAgICAgICAgICA9ICRHT1BELmZcblx0ICAsIGRQICAgICAgICAgICAgID0gJERQLmZcblx0ICAsIGdPUE4gICAgICAgICAgID0gZ09QTkV4dC5mXG5cdCAgLCAkU3ltYm9sICAgICAgICA9IGdsb2JhbC5TeW1ib2xcblx0ICAsICRKU09OICAgICAgICAgID0gZ2xvYmFsLkpTT05cblx0ICAsIF9zdHJpbmdpZnkgICAgID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5XG5cdCAgLCBQUk9UT1RZUEUgICAgICA9ICdwcm90b3R5cGUnXG5cdCAgLCBISURERU4gICAgICAgICA9IHdrcygnX2hpZGRlbicpXG5cdCAgLCBUT19QUklNSVRJVkUgICA9IHdrcygndG9QcmltaXRpdmUnKVxuXHQgICwgaXNFbnVtICAgICAgICAgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZVxuXHQgICwgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpXG5cdCAgLCBBbGxTeW1ib2xzICAgICA9IHNoYXJlZCgnc3ltYm9scycpXG5cdCAgLCBPUFN5bWJvbHMgICAgICA9IHNoYXJlZCgnb3Atc3ltYm9scycpXG5cdCAgLCBPYmplY3RQcm90byAgICA9IE9iamVjdFtQUk9UT1RZUEVdXG5cdCAgLCBVU0VfTkFUSVZFICAgICA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbidcblx0ICAsIFFPYmplY3QgICAgICAgID0gZ2xvYmFsLlFPYmplY3Q7XG5cdC8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xuXHR2YXIgc2V0dGVyID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblx0XG5cdC8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xuXHR2YXIgc2V0U3ltYm9sRGVzYyA9IERFU0NSSVBUT1JTICYmICRmYWlscyhmdW5jdGlvbigpe1xuXHQgIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcblx0ICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIGRQKHRoaXMsICdhJywge3ZhbHVlOiA3fSkuYTsgfVxuXHQgIH0pKS5hICE9IDc7XG5cdH0pID8gZnVuY3Rpb24oaXQsIGtleSwgRCl7XG5cdCAgdmFyIHByb3RvRGVzYyA9IGdPUEQoT2JqZWN0UHJvdG8sIGtleSk7XG5cdCAgaWYocHJvdG9EZXNjKWRlbGV0ZSBPYmplY3RQcm90b1trZXldO1xuXHQgIGRQKGl0LCBrZXksIEQpO1xuXHQgIGlmKHByb3RvRGVzYyAmJiBpdCAhPT0gT2JqZWN0UHJvdG8pZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcblx0fSA6IGRQO1xuXHRcblx0dmFyIHdyYXAgPSBmdW5jdGlvbih0YWcpe1xuXHQgIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG5cdCAgc3ltLl9rID0gdGFnO1xuXHQgIHJldHVybiBzeW07XG5cdH07XG5cdFxuXHR2YXIgaXNTeW1ib2wgPSBVU0VfTkFUSVZFICYmIHR5cGVvZiAkU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnID8gZnVuY3Rpb24oaXQpe1xuXHQgIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG5cdH0gOiBmdW5jdGlvbihpdCl7XG5cdCAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcblx0fTtcblx0XG5cdHZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKXtcblx0ICBpZihpdCA9PT0gT2JqZWN0UHJvdG8pJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKTtcblx0ICBhbk9iamVjdChpdCk7XG5cdCAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcblx0ICBhbk9iamVjdChEKTtcblx0ICBpZihoYXMoQWxsU3ltYm9scywga2V5KSl7XG5cdCAgICBpZighRC5lbnVtZXJhYmxlKXtcblx0ICAgICAgaWYoIWhhcyhpdCwgSElEREVOKSlkUChpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG5cdCAgICAgIGl0W0hJRERFTl1ba2V5XSA9IHRydWU7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICBpZihoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKWl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuXHQgICAgICBEID0gX2NyZWF0ZShELCB7ZW51bWVyYWJsZTogY3JlYXRlRGVzYygwLCBmYWxzZSl9KTtcblx0ICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG5cdCAgfSByZXR1cm4gZFAoaXQsIGtleSwgRCk7XG5cdH07XG5cdHZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApe1xuXHQgIGFuT2JqZWN0KGl0KTtcblx0ICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpXG5cdCAgICAsIGkgICAgPSAwXG5cdCAgICAsIGwgPSBrZXlzLmxlbmd0aFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobCA+IGkpJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG5cdCAgcmV0dXJuIGl0O1xuXHR9O1xuXHR2YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCl7XG5cdCAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xuXHR9O1xuXHR2YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KXtcblx0ICB2YXIgRSA9IGlzRW51bS5jYWxsKHRoaXMsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpO1xuXHQgIGlmKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKXJldHVybiBmYWxzZTtcblx0ICByZXR1cm4gRSB8fCAhaGFzKHRoaXMsIGtleSkgfHwgIWhhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IGhhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtrZXldID8gRSA6IHRydWU7XG5cdH07XG5cdHZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuXHQgIGl0ICA9IHRvSU9iamVjdChpdCk7XG5cdCAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcblx0ICBpZihpdCA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpcmV0dXJuO1xuXHQgIHZhciBEID0gZ09QRChpdCwga2V5KTtcblx0ICBpZihEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpRC5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0ICByZXR1cm4gRDtcblx0fTtcblx0dmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG5cdCAgdmFyIG5hbWVzICA9IGdPUE4odG9JT2JqZWN0KGl0KSlcblx0ICAgICwgcmVzdWx0ID0gW11cblx0ICAgICwgaSAgICAgID0gMFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSl7XG5cdCAgICBpZighaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIGtleSAhPSBISURERU4gJiYga2V5ICE9IE1FVEEpcmVzdWx0LnB1c2goa2V5KTtcblx0ICB9IHJldHVybiByZXN1bHQ7XG5cdH07XG5cdHZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KXtcblx0ICB2YXIgSVNfT1AgID0gaXQgPT09IE9iamVjdFByb3RvXG5cdCAgICAsIG5hbWVzICA9IGdPUE4oSVNfT1AgPyBPUFN5bWJvbHMgOiB0b0lPYmplY3QoaXQpKVxuXHQgICAgLCByZXN1bHQgPSBbXVxuXHQgICAgLCBpICAgICAgPSAwXG5cdCAgICAsIGtleTtcblx0ICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKXtcblx0ICAgIGlmKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAoSVNfT1AgPyBoYXMoT2JqZWN0UHJvdG8sIGtleSkgOiB0cnVlKSlyZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuXHQgIH0gcmV0dXJuIHJlc3VsdDtcblx0fTtcblx0XG5cdC8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuXHRpZighVVNFX05BVElWRSl7XG5cdCAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpe1xuXHQgICAgaWYodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG5cdCAgICB2YXIgdGFnID0gdWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcblx0ICAgIHZhciAkc2V0ID0gZnVuY3Rpb24odmFsdWUpe1xuXHQgICAgICBpZih0aGlzID09PSBPYmplY3RQcm90bykkc2V0LmNhbGwoT1BTeW1ib2xzLCB2YWx1ZSk7XG5cdCAgICAgIGlmKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcblx0ICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcblx0ICAgIH07XG5cdCAgICBpZihERVNDUklQVE9SUyAmJiBzZXR0ZXIpc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7Y29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6ICRzZXR9KTtcblx0ICAgIHJldHVybiB3cmFwKHRhZyk7XG5cdCAgfTtcblx0ICByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG5cdCAgICByZXR1cm4gdGhpcy5faztcblx0ICB9KTtcblx0XG5cdCAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdCAgJERQLmYgICA9ICRkZWZpbmVQcm9wZXJ0eTtcblx0ICBfX3dlYnBhY2tfcmVxdWlyZV9fKDYxKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG5cdCAgX193ZWJwYWNrX3JlcXVpcmVfXygyMDApLmYgID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXHQgIF9fd2VicGFja19yZXF1aXJlX18oMTk5KS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblx0XG5cdCAgaWYoREVTQ1JJUFRPUlMgJiYgIV9fd2VicGFja19yZXF1aXJlX18oMjcpKXtcblx0ICAgIHJlZGVmaW5lKE9iamVjdFByb3RvLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHRydWUpO1xuXHQgIH1cblx0XG5cdCAgd2tzRXh0LmYgPSBmdW5jdGlvbihuYW1lKXtcblx0ICAgIHJldHVybiB3cmFwKHdrcyhuYW1lKSk7XG5cdCAgfVxuXHR9XG5cdFxuXHQkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7U3ltYm9sOiAkU3ltYm9sfSk7XG5cdFxuXHRmb3IodmFyIHN5bWJvbHMgPSAoXG5cdCAgLy8gMTkuNC4yLjIsIDE5LjQuMi4zLCAxOS40LjIuNCwgMTkuNC4yLjYsIDE5LjQuMi44LCAxOS40LjIuOSwgMTkuNC4yLjEwLCAxOS40LjIuMTEsIDE5LjQuMi4xMiwgMTkuNC4yLjEzLCAxOS40LjIuMTRcblx0ICAnaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLHNwZWNpZXMsc3BsaXQsdG9QcmltaXRpdmUsdG9TdHJpbmdUYWcsdW5zY29wYWJsZXMnXG5cdCkuc3BsaXQoJywnKSwgaSA9IDA7IHN5bWJvbHMubGVuZ3RoID4gaTsgKXdrcyhzeW1ib2xzW2krK10pO1xuXHRcblx0Zm9yKHZhciBzeW1ib2xzID0gJGtleXMod2tzLnN0b3JlKSwgaSA9IDA7IHN5bWJvbHMubGVuZ3RoID4gaTsgKXdrc0RlZmluZShzeW1ib2xzW2krK10pO1xuXHRcblx0JGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ1N5bWJvbCcsIHtcblx0ICAvLyAxOS40LjIuMSBTeW1ib2wuZm9yKGtleSlcblx0ICAnZm9yJzogZnVuY3Rpb24oa2V5KXtcblx0ICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcblx0ICAgICAgPyBTeW1ib2xSZWdpc3RyeVtrZXldXG5cdCAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcblx0ICB9LFxuXHQgIC8vIDE5LjQuMi41IFN5bWJvbC5rZXlGb3Ioc3ltKVxuXHQgIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKGtleSl7XG5cdCAgICBpZihpc1N5bWJvbChrZXkpKXJldHVybiBrZXlPZihTeW1ib2xSZWdpc3RyeSwga2V5KTtcblx0ICAgIHRocm93IFR5cGVFcnJvcihrZXkgKyAnIGlzIG5vdCBhIHN5bWJvbCEnKTtcblx0ICB9LFxuXHQgIHVzZVNldHRlcjogZnVuY3Rpb24oKXsgc2V0dGVyID0gdHJ1ZTsgfSxcblx0ICB1c2VTaW1wbGU6IGZ1bmN0aW9uKCl7IHNldHRlciA9IGZhbHNlOyB9XG5cdH0pO1xuXHRcblx0JGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcblx0ICAvLyAxOS4xLjIuMiBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG5cdCAgY3JlYXRlOiAkY3JlYXRlLFxuXHQgIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuXHQgIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG5cdCAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcblx0ICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcblx0ICAvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG5cdCAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuXHQgIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG5cdCAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG5cdCAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuXHQgIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xuXHR9KTtcblx0XG5cdC8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuXHQkSlNPTiAmJiAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCAkZmFpbHMoZnVuY3Rpb24oKXtcblx0ICB2YXIgUyA9ICRTeW1ib2woKTtcblx0ICAvLyBNUyBFZGdlIGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyB7fVxuXHQgIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuXHQgIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG5cdCAgcmV0dXJuIF9zdHJpbmdpZnkoW1NdKSAhPSAnW251bGxdJyB8fCBfc3RyaW5naWZ5KHthOiBTfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcblx0fSkpLCAnSlNPTicsIHtcblx0ICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCl7XG5cdCAgICBpZihpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSlyZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcblx0ICAgIHZhciBhcmdzID0gW2l0XVxuXHQgICAgICAsIGkgICAgPSAxXG5cdCAgICAgICwgcmVwbGFjZXIsICRyZXBsYWNlcjtcblx0ICAgIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG5cdCAgICByZXBsYWNlciA9IGFyZ3NbMV07XG5cdCAgICBpZih0eXBlb2YgcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykkcmVwbGFjZXIgPSByZXBsYWNlcjtcblx0ICAgIGlmKCRyZXBsYWNlciB8fCAhaXNBcnJheShyZXBsYWNlcikpcmVwbGFjZXIgPSBmdW5jdGlvbihrZXksIHZhbHVlKXtcblx0ICAgICAgaWYoJHJlcGxhY2VyKXZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG5cdCAgICAgIGlmKCFpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIHZhbHVlO1xuXHQgICAgfTtcblx0ICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcblx0ICAgIHJldHVybiBfc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmdzKTtcblx0ICB9XG5cdH0pO1xuXHRcblx0Ly8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuXHQkU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSB8fCBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpO1xuXHQvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5cdHNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcblx0Ly8gMjAuMi4xLjkgTWF0aFtAQHRvU3RyaW5nVGFnXVxuXHRzZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuXHQvLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuXHRzZXRUb1N0cmluZ1RhZyhnbG9iYWwuSlNPTiwgJ0pTT04nLCB0cnVlKTtcblxuLyoqKi8gfSxcbi8qIDE5NSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIE1FVEEgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NCkoJ21ldGEnKVxuXHQgICwgaXNPYmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKVxuXHQgICwgaGFzICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI5KVxuXHQgICwgc2V0RGVzYyAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKS5mXG5cdCAgLCBpZCAgICAgICA9IDA7XG5cdHZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uKCl7XG5cdCAgcmV0dXJuIHRydWU7XG5cdH07XG5cdHZhciBGUkVFWkUgPSAhX193ZWJwYWNrX3JlcXVpcmVfXygxNikoZnVuY3Rpb24oKXtcblx0ICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xuXHR9KTtcblx0dmFyIHNldE1ldGEgPSBmdW5jdGlvbihpdCl7XG5cdCAgc2V0RGVzYyhpdCwgTUVUQSwge3ZhbHVlOiB7XG5cdCAgICBpOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSURcblx0ICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG5cdCAgfX0pO1xuXHR9O1xuXHR2YXIgZmFzdEtleSA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuXHQgIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcblx0ICBpZighaXNPYmplY3QoaXQpKXJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG5cdCAgaWYoIWhhcyhpdCwgTUVUQSkpe1xuXHQgICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3Rcblx0ICAgIGlmKCFpc0V4dGVuc2libGUoaXQpKXJldHVybiAnRic7XG5cdCAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuXHQgICAgaWYoIWNyZWF0ZSlyZXR1cm4gJ0UnO1xuXHQgICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcblx0ICAgIHNldE1ldGEoaXQpO1xuXHQgIC8vIHJldHVybiBvYmplY3QgSURcblx0ICB9IHJldHVybiBpdFtNRVRBXS5pO1xuXHR9O1xuXHR2YXIgZ2V0V2VhayA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuXHQgIGlmKCFoYXMoaXQsIE1FVEEpKXtcblx0ICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG5cdCAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gdHJ1ZTtcblx0ICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG5cdCAgICBpZighY3JlYXRlKXJldHVybiBmYWxzZTtcblx0ICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG5cdCAgICBzZXRNZXRhKGl0KTtcblx0ICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuXHQgIH0gcmV0dXJuIGl0W01FVEFdLnc7XG5cdH07XG5cdC8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xuXHR2YXIgb25GcmVlemUgPSBmdW5jdGlvbihpdCl7XG5cdCAgaWYoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKXNldE1ldGEoaXQpO1xuXHQgIHJldHVybiBpdDtcblx0fTtcblx0dmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcblx0ICBLRVk6ICAgICAgTUVUQSxcblx0ICBORUVEOiAgICAgZmFsc2UsXG5cdCAgZmFzdEtleTogIGZhc3RLZXksXG5cdCAgZ2V0V2VhazogIGdldFdlYWssXG5cdCAgb25GcmVlemU6IG9uRnJlZXplXG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTYgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnbG9iYWwgICAgICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oNilcblx0ICAsIGNvcmUgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KVxuXHQgICwgTElCUkFSWSAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KVxuXHQgICwgd2tzRXh0ICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDU1KVxuXHQgICwgZGVmaW5lUHJvcGVydHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKS5mO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuXHQgIHZhciAkU3ltYm9sID0gY29yZS5TeW1ib2wgfHwgKGNvcmUuU3ltYm9sID0gTElCUkFSWSA/IHt9IDogZ2xvYmFsLlN5bWJvbCB8fCB7fSk7XG5cdCAgaWYobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSlkZWZpbmVQcm9wZXJ0eSgkU3ltYm9sLCBuYW1lLCB7dmFsdWU6IHdrc0V4dC5mKG5hbWUpfSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAxOTcgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdHZhciBnZXRLZXlzICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KVxuXHQgICwgdG9JT2JqZWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNik7XG5cdG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBlbCl7XG5cdCAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG5cdCAgICAsIGtleXMgICA9IGdldEtleXMoTylcblx0ICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcblx0ICAgICwgaW5kZXggID0gMFxuXHQgICAgLCBrZXk7XG5cdCAgd2hpbGUobGVuZ3RoID4gaW5kZXgpaWYoT1trZXkgPSBrZXlzW2luZGV4KytdXSA9PT0gZWwpcmV0dXJuIGtleTtcblx0fTtcblxuLyoqKi8gfSxcbi8qIDE5OCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gYWxsIGVudW1lcmFibGUgb2JqZWN0IGtleXMsIGluY2x1ZGVzIHN5bWJvbHNcblx0dmFyIGdldEtleXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KVxuXHQgICwgZ09QUyAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMTk5KVxuXHQgICwgcElFICAgICA9IF9fd2VicGFja19yZXF1aXJlX18oMjAwKTtcblx0bW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG5cdCAgdmFyIHJlc3VsdCAgICAgPSBnZXRLZXlzKGl0KVxuXHQgICAgLCBnZXRTeW1ib2xzID0gZ09QUy5mO1xuXHQgIGlmKGdldFN5bWJvbHMpe1xuXHQgICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KVxuXHQgICAgICAsIGlzRW51bSAgPSBwSUUuZlxuXHQgICAgICAsIGkgICAgICAgPSAwXG5cdCAgICAgICwga2V5O1xuXHQgICAgd2hpbGUoc3ltYm9scy5sZW5ndGggPiBpKWlmKGlzRW51bS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pKXJlc3VsdC5wdXNoKGtleSk7XG5cdCAgfSByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMTk5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vKioqLyB9LFxuLyogMjAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRleHBvcnRzLmYgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqKi8gfSxcbi8qIDIwMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0Ly8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcblx0dmFyIGNvZiA9IF9fd2VicGFja19yZXF1aXJlX18oMzgpO1xuXHRtb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpe1xuXHQgIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xuXHR9O1xuXG4vKioqLyB9LFxuLyogMjAyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHR2YXIgcElFICAgICAgICAgICAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwMClcblx0ICAsIGNyZWF0ZURlc2MgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOSlcblx0ICAsIHRvSU9iamVjdCAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNilcblx0ICAsIHRvUHJpbWl0aXZlICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOClcblx0ICAsIGhhcyAgICAgICAgICAgID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSlcblx0ICAsIElFOF9ET01fREVGSU5FID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNClcblx0ICAsIGdPUEQgICAgICAgICAgID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblx0XG5cdGV4cG9ydHMuZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpID8gZ09QRCA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKXtcblx0ICBPID0gdG9JT2JqZWN0KE8pO1xuXHQgIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcblx0ICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuXHQgICAgcmV0dXJuIGdPUEQoTywgUCk7XG5cdCAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuXHQgIGlmKGhhcyhPLCBQKSlyZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG5cdH07XG5cbi8qKiovIH0sXG4vKiAyMDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cblxuLyoqKi8gfSxcbi8qIDIwNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0X193ZWJwYWNrX3JlcXVpcmVfXygxOTYpKCdhc3luY0l0ZXJhdG9yJyk7XG5cbi8qKiovIH0sXG4vKiAyMDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdF9fd2VicGFja19yZXF1aXJlX18oMTk2KSgnb2JzZXJ2YWJsZScpO1xuXG4vKioqLyB9LFxuLyogMjA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRtb2R1bGUuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uICgpe3ZhciBfdm09dGhpczt2YXIgX2g9X3ZtLiRjcmVhdGVFbGVtZW50O1xuXHQgIHJldHVybiBfdm0uX2MoJ2RpdicsIHtcblx0ICAgIGNsYXNzOiB7XG5cdCAgICAgICdvcGVuJzogX3ZtLnNob3dEcm9wZG93blxuXHQgICAgfSxcblx0ICAgIHN0YXRpY1N0eWxlOiB7XG5cdCAgICAgIFwicG9zaXRpb25cIjogXCJyZWxhdGl2ZVwiXG5cdCAgICB9XG5cdCAgfSwgW192bS5fYygnaW5wdXQnLCB7XG5cdCAgICBkaXJlY3RpdmVzOiBbe1xuXHQgICAgICBuYW1lOiBcIm1vZGVsXCIsXG5cdCAgICAgIHJhd05hbWU6IFwidi1tb2RlbFwiLFxuXHQgICAgICB2YWx1ZTogKF92bS52YWwpLFxuXHQgICAgICBleHByZXNzaW9uOiBcInZhbFwiXG5cdCAgICB9XSxcblx0ICAgIHN0YXRpY0NsYXNzOiBcImZvcm0tY29udHJvbFwiLFxuXHQgICAgYXR0cnM6IHtcblx0ICAgICAgXCJ0eXBlXCI6IFwidGV4dFwiLFxuXHQgICAgICBcImF1dG9jb21wbGV0ZVwiOiBcIm9mZlwiLFxuXHQgICAgICBcInBsYWNlaG9sZGVyXCI6IF92bS5wbGFjZWhvbGRlclxuXHQgICAgfSxcblx0ICAgIGRvbVByb3BzOiB7XG5cdCAgICAgIFwidmFsdWVcIjogX3ZtLl9zKF92bS52YWwpXG5cdCAgICB9LFxuXHQgICAgb246IHtcblx0ICAgICAgXCJibHVyXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIF92bS5zaG93RHJvcGRvd24gPSBmYWxzZVxuXHQgICAgICB9LFxuXHQgICAgICBcImtleWRvd25cIjogW2Z1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZG93blwiLCA0MCkpIHsgcmV0dXJuOyB9XG5cdCAgICAgICAgX3ZtLmRvd24oJGV2ZW50KVxuXHQgICAgICB9LCBmdW5jdGlvbigkZXZlbnQpIHtcblx0ICAgICAgICBpZiAoX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImVudGVyXCIsIDEzKSkgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0uaGl0KCRldmVudClcblx0ICAgICAgfSwgZnVuY3Rpb24oJGV2ZW50KSB7XG5cdCAgICAgICAgaWYgKF92bS5faygkZXZlbnQua2V5Q29kZSwgXCJlc2NcIiwgMjcpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS5yZXNldCgkZXZlbnQpXG5cdCAgICAgIH0sIGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmIChfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwidXBcIiwgMzgpKSB7IHJldHVybjsgfVxuXHQgICAgICAgIF92bS51cCgkZXZlbnQpXG5cdCAgICAgIH1dLFxuXHQgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgIGlmICgkZXZlbnQudGFyZ2V0LmNvbXBvc2luZykgeyByZXR1cm47IH1cblx0ICAgICAgICBfdm0udmFsID0gJGV2ZW50LnRhcmdldC52YWx1ZVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSksIF92bS5fdihcIiBcIiksIF92bS5fYygndWwnLCB7XG5cdCAgICByZWY6IFwiZHJvcGRvd25cIixcblx0ICAgIHN0YXRpY0NsYXNzOiBcImRyb3Bkb3duLW1lbnVcIlxuXHQgIH0sIF92bS5fbCgoX3ZtLml0ZW1zKSwgZnVuY3Rpb24oaXRlbSwgaSkge1xuXHQgICAgcmV0dXJuIF92bS5fYygnbGknLCB7XG5cdCAgICAgIGNsYXNzOiB7XG5cdCAgICAgICAgJ2FjdGl2ZSc6IF92bS5pc0FjdGl2ZShpKVxuXHQgICAgICB9XG5cdCAgICB9LCBbX3ZtLl9jKCdhJywge1xuXHQgICAgICBvbjoge1xuXHQgICAgICAgIFwibW91c2Vkb3duXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBfdm0uaGl0KCRldmVudClcblx0ICAgICAgICB9LFxuXHQgICAgICAgIFwibW91c2Vtb3ZlXCI6IGZ1bmN0aW9uKCRldmVudCkge1xuXHQgICAgICAgICAgX3ZtLnNldEFjdGl2ZShpKVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSwgW192bS5fYyhfdm0udG1wbCwge1xuXHQgICAgICB0YWc6IFwiY29tcG9uZW50XCIsXG5cdCAgICAgIGF0dHJzOiB7XG5cdCAgICAgICAgXCJpdGVtXCI6IGl0ZW1cblx0ICAgICAgfVxuXHQgICAgfSldLCAxKV0pXG5cdCAgfSkpXSlcblx0fSxzdGF0aWNSZW5kZXJGbnM6IFtdfVxuXHRpZiAoZmFsc2UpIHtcblx0ICBtb2R1bGUuaG90LmFjY2VwdCgpXG5cdCAgaWYgKG1vZHVsZS5ob3QuZGF0YSkge1xuXHQgICAgIHJlcXVpcmUoXCJ2dWUtaG90LXJlbG9hZC1hcGlcIikucmVyZW5kZXIoXCJkYXRhLXYtNWI1ZjVlOTRcIiwgbW9kdWxlLmV4cG9ydHMpXG5cdCAgfVxuXHR9XG5cbi8qKiovIH1cbi8qKioqKiovIF0pXG59KTtcbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZ1ZS1zdHJhcC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdnVlLXN0cmFwL2Rpc3QvdnVlLXN0cmFwLmpzXG4vLyBtb2R1bGUgaWQgPSA0OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\");\n\n/***/ },\n/* 50 */\n/***/ function(module, exports, __webpack_require__) {\n\neval(\"/* WEBPACK VAR INJECTION */(function(global) {/*!\\n * Vue.js v2.1.6\\n * (c) 2014-2016 Evan You\\n * Released under the MIT License.\\n */\\n(function (global, factory) {\\n true ? module.exports = factory() :\\n typeof define === 'function' && define.amd ? define(factory) :\\n (global.Vue = factory());\\n}(this, (function () { 'use strict';\\n\\n/* */\\n\\n/**\\n * Convert a value to a string that is actually rendered.\\n */\\nfunction _toString (val) {\\n return val == null\\n ? ''\\n : typeof val === 'object'\\n ? JSON.stringify(val, null, 2)\\n : String(val)\\n}\\n\\n/**\\n * Convert a input value to a number for persistence.\\n * If the conversion fails, return original string.\\n */\\nfunction toNumber (val) {\\n var n = parseFloat(val, 10);\\n return (n || n === 0) ? n : val\\n}\\n\\n/**\\n * Make a map and return a function for checking if a key\\n * is in that map.\\n */\\nfunction makeMap (\\n str,\\n expectsLowerCase\\n) {\\n var map = Object.create(null);\\n var list = str.split(',');\\n for (var i = 0; i < list.length; i++) {\\n map[list[i]] = true;\\n }\\n return expectsLowerCase\\n ? function (val) { return map[val.toLowerCase()]; }\\n : function (val) { return map[val]; }\\n}\\n\\n/**\\n * Check if a tag is a built-in tag.\\n */\\nvar isBuiltInTag = makeMap('slot,component', true);\\n\\n/**\\n * Remove an item from an array\\n */\\nfunction remove$1 (arr, item) {\\n if (arr.length) {\\n var index = arr.indexOf(item);\\n if (index > -1) {\\n return arr.splice(index, 1)\\n }\\n }\\n}\\n\\n/**\\n * Check whether the object has the property.\\n */\\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\\nfunction hasOwn (obj, key) {\\n return hasOwnProperty.call(obj, key)\\n}\\n\\n/**\\n * Check if value is primitive\\n */\\nfunction isPrimitive (value) {\\n return typeof value === 'string' || typeof value === 'number'\\n}\\n\\n/**\\n * Create a cached version of a pure function.\\n */\\nfunction cached (fn) {\\n var cache = Object.create(null);\\n return function cachedFn (str) {\\n var hit = cache[str];\\n return hit || (cache[str] = fn(str))\\n }\\n}\\n\\n/**\\n * Camelize a hyphen-delmited string.\\n */\\nvar camelizeRE = /-(\\\\w)/g;\\nvar camelize = cached(function (str) {\\n return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })\\n});\\n\\n/**\\n * Capitalize a string.\\n */\\nvar capitalize = cached(function (str) {\\n return str.charAt(0).toUpperCase() + str.slice(1)\\n});\\n\\n/**\\n * Hyphenate a camelCase string.\\n */\\nvar hyphenateRE = /([^-])([A-Z])/g;\\nvar hyphenate = cached(function (str) {\\n return str\\n .replace(hyphenateRE, '$1-$2')\\n .replace(hyphenateRE, '$1-$2')\\n .toLowerCase()\\n});\\n\\n/**\\n * Simple bind, faster than native\\n */\\nfunction bind$1 (fn, ctx) {\\n function boundFn (a) {\\n var l = arguments.length;\\n return l\\n ? l > 1\\n ? fn.apply(ctx, arguments)\\n : fn.call(ctx, a)\\n : fn.call(ctx)\\n }\\n // record original fn length\\n boundFn._length = fn.length;\\n return boundFn\\n}\\n\\n/**\\n * Convert an Array-like object to a real Array.\\n */\\nfunction toArray (list, start) {\\n start = start || 0;\\n var i = list.length - start;\\n var ret = new Array(i);\\n while (i--) {\\n ret[i] = list[i + start];\\n }\\n return ret\\n}\\n\\n/**\\n * Mix properties into target object.\\n */\\nfunction extend (to, _from) {\\n for (var key in _from) {\\n to[key] = _from[key];\\n }\\n return to\\n}\\n\\n/**\\n * Quick object check - this is primarily used to tell\\n * Objects from primitive values when we know the value\\n * is a JSON-compliant type.\\n */\\nfunction isObject (obj) {\\n return obj !== null && typeof obj === 'object'\\n}\\n\\n/**\\n * Strict object type check. Only returns true\\n * for plain JavaScript objects.\\n */\\nvar toString = Object.prototype.toString;\\nvar OBJECT_STRING = '[object Object]';\\nfunction isPlainObject (obj) {\\n return toString.call(obj) === OBJECT_STRING\\n}\\n\\n/**\\n * Merge an Array of Objects into a single Object.\\n */\\nfunction toObject (arr) {\\n var res = {};\\n for (var i = 0; i < arr.length; i++) {\\n if (arr[i]) {\\n extend(res, arr[i]);\\n }\\n }\\n return res\\n}\\n\\n/**\\n * Perform no operation.\\n */\\nfunction noop () {}\\n\\n/**\\n * Always return false.\\n */\\nvar no = function () { return false; };\\n\\n/**\\n * Return same value\\n */\\nvar identity = function (_) { return _; };\\n\\n/**\\n * Generate a static keys string from compiler modules.\\n */\\nfunction genStaticKeys (modules) {\\n return modules.reduce(function (keys, m) {\\n return keys.concat(m.staticKeys || [])\\n }, []).join(',')\\n}\\n\\n/**\\n * Check if two values are loosely equal - that is,\\n * if they are plain objects, do they have the same shape?\\n */\\nfunction looseEqual (a, b) {\\n /* eslint-disable eqeqeq */\\n return a == b || (\\n isObject(a) && isObject(b)\\n ? JSON.stringify(a) === JSON.stringify(b)\\n : false\\n )\\n /* eslint-enable eqeqeq */\\n}\\n\\nfunction looseIndexOf (arr, val) {\\n for (var i = 0; i < arr.length; i++) {\\n if (looseEqual(arr[i], val)) { return i }\\n }\\n return -1\\n}\\n\\n/* */\\n\\nvar config = {\\n /**\\n * Option merge strategies (used in core/util/options)\\n */\\n optionMergeStrategies: Object.create(null),\\n\\n /**\\n * Whether to suppress warnings.\\n */\\n silent: false,\\n\\n /**\\n * Whether to enable devtools\\n */\\n devtools: \\\"development\\\" !== 'production',\\n\\n /**\\n * Error handler for watcher errors\\n */\\n errorHandler: null,\\n\\n /**\\n * Ignore certain custom elements\\n */\\n ignoredElements: null,\\n\\n /**\\n * Custom user key aliases for v-on\\n */\\n keyCodes: Object.create(null),\\n\\n /**\\n * Check if a tag is reserved so that it cannot be registered as a\\n * component. This is platform-dependent and may be overwritten.\\n */\\n isReservedTag: no,\\n\\n /**\\n * Check if a tag is an unknown element.\\n * Platform-dependent.\\n */\\n isUnknownElement: no,\\n\\n /**\\n * Get the namespace of an element\\n */\\n getTagNamespace: noop,\\n\\n /**\\n * Parse the real tag name for the specific platform.\\n */\\n parsePlatformTagName: identity,\\n\\n /**\\n * Check if an attribute must be bound using property, e.g. value\\n * Platform-dependent.\\n */\\n mustUseProp: no,\\n\\n /**\\n * List of asset types that a component can own.\\n */\\n _assetTypes: [\\n 'component',\\n 'directive',\\n 'filter'\\n ],\\n\\n /**\\n * List of lifecycle hooks.\\n */\\n _lifecycleHooks: [\\n 'beforeCreate',\\n 'created',\\n 'beforeMount',\\n 'mounted',\\n 'beforeUpdate',\\n 'updated',\\n 'beforeDestroy',\\n 'destroyed',\\n 'activated',\\n 'deactivated'\\n ],\\n\\n /**\\n * Max circular updates allowed in a scheduler flush cycle.\\n */\\n _maxUpdateCount: 100\\n};\\n\\n/* */\\n\\n/**\\n * Check if a string starts with $ or _\\n */\\nfunction isReserved (str) {\\n var c = (str + '').charCodeAt(0);\\n return c === 0x24 || c === 0x5F\\n}\\n\\n/**\\n * Define a property.\\n */\\nfunction def (obj, key, val, enumerable) {\\n Object.defineProperty(obj, key, {\\n value: val,\\n enumerable: !!enumerable,\\n writable: true,\\n configurable: true\\n });\\n}\\n\\n/**\\n * Parse simple path.\\n */\\nvar bailRE = /[^\\\\w.$]/;\\nfunction parsePath (path) {\\n if (bailRE.test(path)) {\\n return\\n } else {\\n var segments = path.split('.');\\n return function (obj) {\\n for (var i = 0; i < segments.length; i++) {\\n if (!obj) { return }\\n obj = obj[segments[i]];\\n }\\n return obj\\n }\\n }\\n}\\n\\n/* */\\n/* globals MutationObserver */\\n\\n// can we use __proto__?\\nvar hasProto = '__proto__' in {};\\n\\n// Browser environment sniffing\\nvar inBrowser = typeof window !== 'undefined';\\nvar UA = inBrowser && window.navigator.userAgent.toLowerCase();\\nvar isIE = UA && /msie|trident/.test(UA);\\nvar isIE9 = UA && UA.indexOf('msie 9.0') > 0;\\nvar isEdge = UA && UA.indexOf('edge/') > 0;\\nvar isAndroid = UA && UA.indexOf('android') > 0;\\nvar isIOS = UA && /iphone|ipad|ipod|ios/.test(UA);\\n\\n// this needs to be lazy-evaled because vue may be required before\\n// vue-server-renderer can set VUE_ENV\\nvar _isServer;\\nvar isServerRendering = function () {\\n if (_isServer === undefined) {\\n /* istanbul ignore if */\\n if (!inBrowser && typeof global !== 'undefined') {\\n // detect presence of vue-server-renderer and avoid\\n // Webpack shimming the process\\n _isServer = global['process'].env.VUE_ENV === 'server';\\n } else {\\n _isServer = false;\\n }\\n }\\n return _isServer\\n};\\n\\n// detect devtools\\nvar devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\\n\\n/* istanbul ignore next */\\nfunction isNative (Ctor) {\\n return /native code/.test(Ctor.toString())\\n}\\n\\n/**\\n * Defer a task to execute it asynchronously.\\n */\\nvar nextTick = (function () {\\n var callbacks = [];\\n var pending = false;\\n var timerFunc;\\n\\n function nextTickHandler () {\\n pending = false;\\n var copies = callbacks.slice(0);\\n callbacks.length = 0;\\n for (var i = 0; i < copies.length; i++) {\\n copies[i]();\\n }\\n }\\n\\n // the nextTick behavior leverages the microtask queue, which can be accessed\\n // via either native Promise.then or MutationObserver.\\n // MutationObserver has wider support, however it is seriously bugged in\\n // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It\\n // completely stops working after triggering a few times... so, if native\\n // Promise is available, we will use it:\\n /* istanbul ignore if */\\n if (typeof Promise !== 'undefined' && isNative(Promise)) {\\n var p = Promise.resolve();\\n var logError = function (err) { console.error(err); };\\n timerFunc = function () {\\n p.then(nextTickHandler).catch(logError);\\n // in problematic UIWebViews, Promise.then doesn't completely break, but\\n // it can get stuck in a weird state where callbacks are pushed into the\\n // microtask queue but the queue isn't being flushed, until the browser\\n // needs to do some other work, e.g. handle a timer. Therefore we can\\n // \\\"force\\\" the microtask queue to be flushed by adding an empty timer.\\n if (isIOS) { setTimeout(noop); }\\n };\\n } else if (typeof MutationObserver !== 'undefined' && (\\n isNative(MutationObserver) ||\\n // PhantomJS and iOS 7.x\\n MutationObserver.toString() === '[object MutationObserverConstructor]'\\n )) {\\n // use MutationObserver where native Promise is not available,\\n // e.g. PhantomJS IE11, iOS7, Android 4.4\\n var counter = 1;\\n var observer = new MutationObserver(nextTickHandler);\\n var textNode = document.createTextNode(String(counter));\\n observer.observe(textNode, {\\n characterData: true\\n });\\n timerFunc = function () {\\n counter = (counter + 1) % 2;\\n textNode.data = String(counter);\\n };\\n } else {\\n // fallback to setTimeout\\n /* istanbul ignore next */\\n timerFunc = function () {\\n setTimeout(nextTickHandler, 0);\\n };\\n }\\n\\n return function queueNextTick (cb, ctx) {\\n var _resolve;\\n callbacks.push(function () {\\n if (cb) { cb.call(ctx); }\\n if (_resolve) { _resolve(ctx); }\\n });\\n if (!pending) {\\n pending = true;\\n timerFunc();\\n }\\n if (!cb && typeof Promise !== 'undefined') {\\n return new Promise(function (resolve) {\\n _resolve = resolve;\\n })\\n }\\n }\\n})();\\n\\nvar _Set;\\n/* istanbul ignore if */\\nif (typeof Set !== 'undefined' && isNative(Set)) {\\n // use native Set when available.\\n _Set = Set;\\n} else {\\n // a non-standard Set polyfill that only works with primitive keys.\\n _Set = (function () {\\n function Set () {\\n this.set = Object.create(null);\\n }\\n Set.prototype.has = function has (key) {\\n return this.set[key] === true\\n };\\n Set.prototype.add = function add (key) {\\n this.set[key] = true;\\n };\\n Set.prototype.clear = function clear () {\\n this.set = Object.create(null);\\n };\\n\\n return Set;\\n }());\\n}\\n\\nvar warn = noop;\\nvar formatComponentName;\\n\\n{\\n var hasConsole = typeof console !== 'undefined';\\n\\n warn = function (msg, vm) {\\n if (hasConsole && (!config.silent)) {\\n console.error(\\\"[Vue warn]: \\\" + msg + \\\" \\\" + (\\n vm ? formatLocation(formatComponentName(vm)) : ''\\n ));\\n }\\n };\\n\\n formatComponentName = function (vm) {\\n if (vm.$root === vm) {\\n return 'root instance'\\n }\\n var name = vm._isVue\\n ? vm.$options.name || vm.$options._componentTag\\n : vm.name;\\n return (\\n (name ? (\\\"component <\\\" + name + \\\">\\\") : \\\"anonymous component\\\") +\\n (vm._isVue && vm.$options.__file ? (\\\" at \\\" + (vm.$options.__file)) : '')\\n )\\n };\\n\\n var formatLocation = function (str) {\\n if (str === 'anonymous component') {\\n str += \\\" - use the \\\\\\\"name\\\\\\\" option for better debugging messages.\\\";\\n }\\n return (\\\"\\\\n(found in \\\" + str + \\\")\\\")\\n };\\n}\\n\\n/* */\\n\\n\\nvar uid$1 = 0;\\n\\n/**\\n * A dep is an observable that can have multiple\\n * directives subscribing to it.\\n */\\nvar Dep = function Dep () {\\n this.id = uid$1++;\\n this.subs = [];\\n};\\n\\nDep.prototype.addSub = function addSub (sub) {\\n this.subs.push(sub);\\n};\\n\\nDep.prototype.removeSub = function removeSub (sub) {\\n remove$1(this.subs, sub);\\n};\\n\\nDep.prototype.depend = function depend () {\\n if (Dep.target) {\\n Dep.target.addDep(this);\\n }\\n};\\n\\nDep.prototype.notify = function notify () {\\n // stablize the subscriber list first\\n var subs = this.subs.slice();\\n for (var i = 0, l = subs.length; i < l; i++) {\\n subs[i].update();\\n }\\n};\\n\\n// the current target watcher being evaluated.\\n// this is globally unique because there could be only one\\n// watcher being evaluated at any time.\\nDep.target = null;\\nvar targetStack = [];\\n\\nfunction pushTarget (_target) {\\n if (Dep.target) { targetStack.push(Dep.target); }\\n Dep.target = _target;\\n}\\n\\nfunction popTarget () {\\n Dep.target = targetStack.pop();\\n}\\n\\n/*\\n * not type checking this file because flow doesn't play well with\\n * dynamically accessing methods on Array prototype\\n */\\n\\nvar arrayProto = Array.prototype;\\nvar arrayMethods = Object.create(arrayProto);[\\n 'push',\\n 'pop',\\n 'shift',\\n 'unshift',\\n 'splice',\\n 'sort',\\n 'reverse'\\n]\\n.forEach(function (method) {\\n // cache original method\\n var original = arrayProto[method];\\n def(arrayMethods, method, function mutator () {\\n var arguments$1 = arguments;\\n\\n // avoid leaking arguments:\\n // http://jsperf.com/closure-with-arguments\\n var i = arguments.length;\\n var args = new Array(i);\\n while (i--) {\\n args[i] = arguments$1[i];\\n }\\n var result = original.apply(this, args);\\n var ob = this.__ob__;\\n var inserted;\\n switch (method) {\\n case 'push':\\n inserted = args;\\n break\\n case 'unshift':\\n inserted = args;\\n break\\n case 'splice':\\n inserted = args.slice(2);\\n break\\n }\\n if (inserted) { ob.observeArray(inserted); }\\n // notify change\\n ob.dep.notify();\\n return result\\n });\\n});\\n\\n/* */\\n\\nvar arrayKeys = Object.getOwnPropertyNames(arrayMethods);\\n\\n/**\\n * By default, when a reactive property is set, the new value is\\n * also converted to become reactive. However when passing down props,\\n * we don't want to force conversion because the value may be a nested value\\n * under a frozen data structure. Converting it would defeat the optimization.\\n */\\nvar observerState = {\\n shouldConvert: true,\\n isSettingProps: false\\n};\\n\\n/**\\n * Observer class that are attached to each observed\\n * object. Once attached, the observer converts target\\n * object's property keys into getter/setters that\\n * collect dependencies and dispatches updates.\\n */\\nvar Observer = function Observer (value) {\\n this.value = value;\\n this.dep = new Dep();\\n this.vmCount = 0;\\n def(value, '__ob__', this);\\n if (Array.isArray(value)) {\\n var augment = hasProto\\n ? protoAugment\\n : copyAugment;\\n augment(value, arrayMethods, arrayKeys);\\n this.observeArray(value);\\n } else {\\n this.walk(value);\\n }\\n};\\n\\n/**\\n * Walk through each property and convert them into\\n * getter/setters. This method should only be called when\\n * value type is Object.\\n */\\nObserver.prototype.walk = function walk (obj) {\\n var keys = Object.keys(obj);\\n for (var i = 0; i < keys.length; i++) {\\n defineReactive$$1(obj, keys[i], obj[keys[i]]);\\n }\\n};\\n\\n/**\\n * Observe a list of Array items.\\n */\\nObserver.prototype.observeArray = function observeArray (items) {\\n for (var i = 0, l = items.length; i < l; i++) {\\n observe(items[i]);\\n }\\n};\\n\\n// helpers\\n\\n/**\\n * Augment an target Object or Array by intercepting\\n * the prototype chain using __proto__\\n */\\nfunction protoAugment (target, src) {\\n /* eslint-disable no-proto */\\n target.__proto__ = src;\\n /* eslint-enable no-proto */\\n}\\n\\n/**\\n * Augment an target Object or Array by defining\\n * hidden properties.\\n */\\n/* istanbul ignore next */\\nfunction copyAugment (target, src, keys) {\\n for (var i = 0, l = keys.length; i < l; i++) {\\n var key = keys[i];\\n def(target, key, src[key]);\\n }\\n}\\n\\n/**\\n * Attempt to create an observer instance for a value,\\n * returns the new observer if successfully observed,\\n * or the existing observer if the value already has one.\\n */\\nfunction observe (value) {\\n if (!isObject(value)) {\\n return\\n }\\n var ob;\\n if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\\n ob = value.__ob__;\\n } else if (\\n observerState.shouldConvert &&\\n !isServerRendering() &&\\n (Array.isArray(value) || isPlainObject(value)) &&\\n Object.isExtensible(value) &&\\n !value._isVue\\n ) {\\n ob = new Observer(value);\\n }\\n return ob\\n}\\n\\n/**\\n * Define a reactive property on an Object.\\n */\\nfunction defineReactive$$1 (\\n obj,\\n key,\\n val,\\n customSetter\\n) {\\n var dep = new Dep();\\n\\n var property = Object.getOwnPropertyDescriptor(obj, key);\\n if (property && property.configurable === false) {\\n return\\n }\\n\\n // cater for pre-defined getter/setters\\n var getter = property && property.get;\\n var setter = property && property.set;\\n\\n var childOb = observe(val);\\n Object.defineProperty(obj, key, {\\n enumerable: true,\\n configurable: true,\\n get: function reactiveGetter () {\\n var value = getter ? getter.call(obj) : val;\\n if (Dep.target) {\\n dep.depend();\\n if (childOb) {\\n childOb.dep.depend();\\n }\\n if (Array.isArray(value)) {\\n dependArray(value);\\n }\\n }\\n return value\\n },\\n set: function reactiveSetter (newVal) {\\n var value = getter ? getter.call(obj) : val;\\n /* eslint-disable no-self-compare */\\n if (newVal === value || (newVal !== newVal && value !== value)) {\\n return\\n }\\n /* eslint-enable no-self-compare */\\n if (\\\"development\\\" !== 'production' && customSetter) {\\n customSetter();\\n }\\n if (setter) {\\n setter.call(obj, newVal);\\n } else {\\n val = newVal;\\n }\\n childOb = observe(newVal);\\n dep.notify();\\n }\\n });\\n}\\n\\n/**\\n * Set a property on an object. Adds the new property and\\n * triggers change notification if the property doesn't\\n * already exist.\\n */\\nfunction set$1 (obj, key, val) {\\n if (Array.isArray(obj)) {\\n obj.length = Math.max(obj.length, key);\\n obj.splice(key, 1, val);\\n return val\\n }\\n if (hasOwn(obj, key)) {\\n obj[key] = val;\\n return\\n }\\n var ob = obj.__ob__;\\n if (obj._isVue || (ob && ob.vmCount)) {\\n \\\"development\\\" !== 'production' && warn(\\n 'Avoid adding reactive properties to a Vue instance or its root $data ' +\\n 'at runtime - declare it upfront in the data option.'\\n );\\n return\\n }\\n if (!ob) {\\n obj[key] = val;\\n return\\n }\\n defineReactive$$1(ob.value, key, val);\\n ob.dep.notify();\\n return val\\n}\\n\\n/**\\n * Delete a property and trigger change if necessary.\\n */\\nfunction del (obj, key) {\\n var ob = obj.__ob__;\\n if (obj._isVue || (ob && ob.vmCount)) {\\n \\\"development\\\" !== 'production' && warn(\\n 'Avoid deleting properties on a Vue instance or its root $data ' +\\n '- just set it to null.'\\n );\\n return\\n }\\n if (!hasOwn(obj, key)) {\\n return\\n }\\n delete obj[key];\\n if (!ob) {\\n return\\n }\\n ob.dep.notify();\\n}\\n\\n/**\\n * Collect dependencies on array elements when the array is touched, since\\n * we cannot intercept array element access like property getters.\\n */\\nfunction dependArray (value) {\\n for (var e = (void 0), i = 0, l = value.length; i < l; i++) {\\n e = value[i];\\n e && e.__ob__ && e.__ob__.dep.depend();\\n if (Array.isArray(e)) {\\n dependArray(e);\\n }\\n }\\n}\\n\\n/* */\\n\\n/**\\n * Option overwriting strategies are functions that handle\\n * how to merge a parent option value and a child option\\n * value into the final value.\\n */\\nvar strats = config.optionMergeStrategies;\\n\\n/**\\n * Options with restrictions\\n */\\n{\\n strats.el = strats.propsData = function (parent, child, vm, key) {\\n if (!vm) {\\n warn(\\n \\\"option \\\\\\\"\\\" + key + \\\"\\\\\\\" can only be used during instance \\\" +\\n 'creation with the `new` keyword.'\\n );\\n }\\n return defaultStrat(parent, child)\\n };\\n}\\n\\n/**\\n * Helper that recursively merges two data objects together.\\n */\\nfunction mergeData (to, from) {\\n if (!from) { return to }\\n var key, toVal, fromVal;\\n var keys = Object.keys(from);\\n for (var i = 0; i < keys.length; i++) {\\n key = keys[i];\\n toVal = to[key];\\n fromVal = from[key];\\n if (!hasOwn(to, key)) {\\n set$1(to, key, fromVal);\\n } else if (isPlainObject(toVal) && isPlainObject(fromVal)) {\\n mergeData(toVal, fromVal);\\n }\\n }\\n return to\\n}\\n\\n/**\\n * Data\\n */\\nstrats.data = function (\\n parentVal,\\n childVal,\\n vm\\n) {\\n if (!vm) {\\n // in a Vue.extend merge, both should be functions\\n if (!childVal) {\\n return parentVal\\n }\\n if (typeof childVal !== 'function') {\\n \\\"development\\\" !== 'production' && warn(\\n 'The \\\"data\\\" option should be a function ' +\\n 'that returns a per-instance value in component ' +\\n 'definitions.',\\n vm\\n );\\n return parentVal\\n }\\n if (!parentVal) {\\n return childVal\\n }\\n // when parentVal & childVal are both present,\\n // we need to return a function that returns the\\n // merged result of both functions... no need to\\n // check if parentVal is a function here because\\n // it has to be a function to pass previous merges.\\n return function mergedDataFn () {\\n return mergeData(\\n childVal.call(this),\\n parentVal.call(this)\\n )\\n }\\n } else if (parentVal || childVal) {\\n return function mergedInstanceDataFn () {\\n // instance merge\\n var instanceData = typeof childVal === 'function'\\n ? childVal.call(vm)\\n : childVal;\\n var defaultData = typeof parentVal === 'function'\\n ? parentVal.call(vm)\\n : undefined;\\n if (instanceData) {\\n return mergeData(instanceData, defaultData)\\n } else {\\n return defaultData\\n }\\n }\\n }\\n};\\n\\n/**\\n * Hooks and param attributes are merged as arrays.\\n */\\nfunction mergeHook (\\n parentVal,\\n childVal\\n) {\\n return childVal\\n ? parentVal\\n ? parentVal.concat(childVal)\\n : Array.isArray(childVal)\\n ? childVal\\n : [childVal]\\n : parentVal\\n}\\n\\nconfig._lifecycleHooks.forEach(function (hook) {\\n strats[hook] = mergeHook;\\n});\\n\\n/**\\n * Assets\\n *\\n * When a vm is present (instance creation), we need to do\\n * a three-way merge between constructor options, instance\\n * options and parent options.\\n */\\nfunction mergeAssets (parentVal, childVal) {\\n var res = Object.create(parentVal || null);\\n return childVal\\n ? extend(res, childVal)\\n : res\\n}\\n\\nconfig._assetTypes.forEach(function (type) {\\n strats[type + 's'] = mergeAssets;\\n});\\n\\n/**\\n * Watchers.\\n *\\n * Watchers hashes should not overwrite one\\n * another, so we merge them as arrays.\\n */\\nstrats.watch = function (parentVal, childVal) {\\n /* istanbul ignore if */\\n if (!childVal) { return parentVal }\\n if (!parentVal) { return childVal }\\n var ret = {};\\n extend(ret, parentVal);\\n for (var key in childVal) {\\n var parent = ret[key];\\n var child = childVal[key];\\n if (parent && !Array.isArray(parent)) {\\n parent = [parent];\\n }\\n ret[key] = parent\\n ? parent.concat(child)\\n : [child];\\n }\\n return ret\\n};\\n\\n/**\\n * Other object hashes.\\n */\\nstrats.props =\\nstrats.methods =\\nstrats.computed = function (parentVal, childVal) {\\n if (!childVal) { return parentVal }\\n if (!parentVal) { return childVal }\\n var ret = Object.create(null);\\n extend(ret, parentVal);\\n extend(ret, childVal);\\n return ret\\n};\\n\\n/**\\n * Default strategy.\\n */\\nvar defaultStrat = function (parentVal, childVal) {\\n return childVal === undefined\\n ? parentVal\\n : childVal\\n};\\n\\n/**\\n * Validate component names\\n */\\nfunction checkComponents (options) {\\n for (var key in options.components) {\\n var lower = key.toLowerCase();\\n if (isBuiltInTag(lower) || config.isReservedTag(lower)) {\\n warn(\\n 'Do not use built-in or reserved HTML elements as component ' +\\n 'id: ' + key\\n );\\n }\\n }\\n}\\n\\n/**\\n * Ensure all props option syntax are normalized into the\\n * Object-based format.\\n */\\nfunction normalizeProps (options) {\\n var props = options.props;\\n if (!props) { return }\\n var res = {};\\n var i, val, name;\\n if (Array.isArray(props)) {\\n i = props.length;\\n while (i--) {\\n val = props[i];\\n if (typeof val === 'string') {\\n name = camelize(val);\\n res[name] = { type: null };\\n } else {\\n warn('props must be strings when using array syntax.');\\n }\\n }\\n } else if (isPlainObject(props)) {\\n for (var key in props) {\\n val = props[key];\\n name = camelize(key);\\n res[name] = isPlainObject(val)\\n ? val\\n : { type: val };\\n }\\n }\\n options.props = res;\\n}\\n\\n/**\\n * Normalize raw function directives into object format.\\n */\\nfunction normalizeDirectives (options) {\\n var dirs = options.directives;\\n if (dirs) {\\n for (var key in dirs) {\\n var def = dirs[key];\\n if (typeof def === 'function') {\\n dirs[key] = { bind: def, update: def };\\n }\\n }\\n }\\n}\\n\\n/**\\n * Merge two option objects into a new one.\\n * Core utility used in both instantiation and inheritance.\\n */\\nfunction mergeOptions (\\n parent,\\n child,\\n vm\\n) {\\n {\\n checkComponents(child);\\n }\\n normalizeProps(child);\\n normalizeDirectives(child);\\n var extendsFrom = child.extends;\\n if (extendsFrom) {\\n parent = typeof extendsFrom === 'function'\\n ? mergeOptions(parent, extendsFrom.options, vm)\\n : mergeOptions(parent, extendsFrom, vm);\\n }\\n if (child.mixins) {\\n for (var i = 0, l = child.mixins.length; i < l; i++) {\\n var mixin = child.mixins[i];\\n if (mixin.prototype instanceof Vue$3) {\\n mixin = mixin.options;\\n }\\n parent = mergeOptions(parent, mixin, vm);\\n }\\n }\\n var options = {};\\n var key;\\n for (key in parent) {\\n mergeField(key);\\n }\\n for (key in child) {\\n if (!hasOwn(parent, key)) {\\n mergeField(key);\\n }\\n }\\n function mergeField (key) {\\n var strat = strats[key] || defaultStrat;\\n options[key] = strat(parent[key], child[key], vm, key);\\n }\\n return options\\n}\\n\\n/**\\n * Resolve an asset.\\n * This function is used because child instances need access\\n * to assets defined in its ancestor chain.\\n */\\nfunction resolveAsset (\\n options,\\n type,\\n id,\\n warnMissing\\n) {\\n /* istanbul ignore if */\\n if (typeof id !== 'string') {\\n return\\n }\\n var assets = options[type];\\n // check local registration variations first\\n if (hasOwn(assets, id)) { return assets[id] }\\n var camelizedId = camelize(id);\\n if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }\\n var PascalCaseId = capitalize(camelizedId);\\n if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }\\n // fallback to prototype chain\\n var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];\\n if (\\\"development\\\" !== 'production' && warnMissing && !res) {\\n warn(\\n 'Failed to resolve ' + type.slice(0, -1) + ': ' + id,\\n options\\n );\\n }\\n return res\\n}\\n\\n/* */\\n\\nfunction validateProp (\\n key,\\n propOptions,\\n propsData,\\n vm\\n) {\\n var prop = propOptions[key];\\n var absent = !hasOwn(propsData, key);\\n var value = propsData[key];\\n // handle boolean props\\n if (isBooleanType(prop.type)) {\\n if (absent && !hasOwn(prop, 'default')) {\\n value = false;\\n } else if (value === '' || value === hyphenate(key)) {\\n value = true;\\n }\\n }\\n // check default value\\n if (value === undefined) {\\n value = getPropDefaultValue(vm, prop, key);\\n // since the default value is a fresh copy,\\n // make sure to observe it.\\n var prevShouldConvert = observerState.shouldConvert;\\n observerState.shouldConvert = true;\\n observe(value);\\n observerState.shouldConvert = prevShouldConvert;\\n }\\n {\\n assertProp(prop, key, value, vm, absent);\\n }\\n return value\\n}\\n\\n/**\\n * Get the default value of a prop.\\n */\\nfunction getPropDefaultValue (vm, prop, key) {\\n // no default, return undefined\\n if (!hasOwn(prop, 'default')) {\\n return undefined\\n }\\n var def = prop.default;\\n // warn against non-factory defaults for Object & Array\\n if (isObject(def)) {\\n \\\"development\\\" !== 'production' && warn(\\n 'Invalid default value for prop \\\"' + key + '\\\": ' +\\n 'Props with type Object/Array must use a factory function ' +\\n 'to return the default value.',\\n vm\\n );\\n }\\n // the raw prop value was also undefined from previous render,\\n // return previous default value to avoid unnecessary watcher trigger\\n if (vm && vm.$options.propsData &&\\n vm.$options.propsData[key] === undefined &&\\n vm[key] !== undefined) {\\n return vm[key]\\n }\\n // call factory function for non-Function types\\n return typeof def === 'function' && prop.type !== Function\\n ? def.call(vm)\\n : def\\n}\\n\\n/**\\n * Assert whether a prop is valid.\\n */\\nfunction assertProp (\\n prop,\\n name,\\n value,\\n vm,\\n absent\\n) {\\n if (prop.required && absent) {\\n warn(\\n 'Missing required prop: \\\"' + name + '\\\"',\\n vm\\n );\\n return\\n }\\n if (value == null && !prop.required) {\\n return\\n }\\n var type = prop.type;\\n var valid = !type || type === true;\\n var expectedTypes = [];\\n if (type) {\\n if (!Array.isArray(type)) {\\n type = [type];\\n }\\n for (var i = 0; i < type.length && !valid; i++) {\\n var assertedType = assertType(value, type[i]);\\n expectedTypes.push(assertedType.expectedType);\\n valid = assertedType.valid;\\n }\\n }\\n if (!valid) {\\n warn(\\n 'Invalid prop: type check failed for prop \\\"' + name + '\\\".' +\\n ' Expected ' + expectedTypes.map(capitalize).join(', ') +\\n ', got ' + Object.prototype.toString.call(value).slice(8, -1) + '.',\\n vm\\n );\\n return\\n }\\n var validator = prop.validator;\\n if (validator) {\\n if (!validator(value)) {\\n warn(\\n 'Invalid prop: custom validator check failed for prop \\\"' + name + '\\\".',\\n vm\\n );\\n }\\n }\\n}\\n\\n/**\\n * Assert the type of a value\\n */\\nfunction assertType (value, type) {\\n var valid;\\n var expectedType = getType(type);\\n if (expectedType === 'String') {\\n valid = typeof value === (expectedType = 'string');\\n } else if (expectedType === 'Number') {\\n valid = typeof value === (expectedType = 'number');\\n } else if (expectedType === 'Boolean') {\\n valid = typeof value === (expectedType = 'boolean');\\n } else if (expectedType === 'Function') {\\n valid = typeof value === (expectedType = 'function');\\n } else if (expectedType === 'Object') {\\n valid = isPlainObject(value);\\n } else if (expectedType === 'Array') {\\n valid = Array.isArray(value);\\n } else {\\n valid = value instanceof type;\\n }\\n return {\\n valid: valid,\\n expectedType: expectedType\\n }\\n}\\n\\n/**\\n * Use function string name to check built-in types,\\n * because a simple equality check will fail when running\\n * across different vms / iframes.\\n */\\nfunction getType (fn) {\\n var match = fn && fn.toString().match(/^\\\\s*function (\\\\w+)/);\\n return match && match[1]\\n}\\n\\nfunction isBooleanType (fn) {\\n if (!Array.isArray(fn)) {\\n return getType(fn) === 'Boolean'\\n }\\n for (var i = 0, len = fn.length; i < len; i++) {\\n if (getType(fn[i]) === 'Boolean') {\\n return true\\n }\\n }\\n /* istanbul ignore next */\\n return false\\n}\\n\\n\\n\\nvar util = Object.freeze({\\n\\tdefineReactive: defineReactive$$1,\\n\\t_toString: _toString,\\n\\ttoNumber: toNumber,\\n\\tmakeMap: makeMap,\\n\\tisBuiltInTag: isBuiltInTag,\\n\\tremove: remove$1,\\n\\thasOwn: hasOwn,\\n\\tisPrimitive: isPrimitive,\\n\\tcached: cached,\\n\\tcamelize: camelize,\\n\\tcapitalize: capitalize,\\n\\thyphenate: hyphenate,\\n\\tbind: bind$1,\\n\\ttoArray: toArray,\\n\\textend: extend,\\n\\tisObject: isObject,\\n\\tisPlainObject: isPlainObject,\\n\\ttoObject: toObject,\\n\\tnoop: noop,\\n\\tno: no,\\n\\tidentity: identity,\\n\\tgenStaticKeys: genStaticKeys,\\n\\tlooseEqual: looseEqual,\\n\\tlooseIndexOf: looseIndexOf,\\n\\tisReserved: isReserved,\\n\\tdef: def,\\n\\tparsePath: parsePath,\\n\\thasProto: hasProto,\\n\\tinBrowser: inBrowser,\\n\\tUA: UA,\\n\\tisIE: isIE,\\n\\tisIE9: isIE9,\\n\\tisEdge: isEdge,\\n\\tisAndroid: isAndroid,\\n\\tisIOS: isIOS,\\n\\tisServerRendering: isServerRendering,\\n\\tdevtools: devtools,\\n\\tnextTick: nextTick,\\n\\tget _Set () { return _Set; },\\n\\tmergeOptions: mergeOptions,\\n\\tresolveAsset: resolveAsset,\\n\\tget warn () { return warn; },\\n\\tget formatComponentName () { return formatComponentName; },\\n\\tvalidateProp: validateProp\\n});\\n\\n/* not type checking this file because flow doesn't play well with Proxy */\\n\\nvar initProxy;\\n\\n{\\n var allowedGlobals = makeMap(\\n 'Infinity,undefined,NaN,isFinite,isNaN,' +\\n 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +\\n 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +\\n 'require' // for Webpack/Browserify\\n );\\n\\n var warnNonPresent = function (target, key) {\\n warn(\\n \\\"Property or method \\\\\\\"\\\" + key + \\\"\\\\\\\" is not defined on the instance but \\\" +\\n \\\"referenced during render. Make sure to declare reactive data \\\" +\\n \\\"properties in the data option.\\\",\\n target\\n );\\n };\\n\\n var hasProxy =\\n typeof Proxy !== 'undefined' &&\\n Proxy.toString().match(/native code/);\\n\\n if (hasProxy) {\\n var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta');\\n config.keyCodes = new Proxy(config.keyCodes, {\\n set: function set (target, key, value) {\\n if (isBuiltInModifier(key)) {\\n warn((\\\"Avoid overwriting built-in modifier in config.keyCodes: .\\\" + key));\\n return false\\n } else {\\n target[key] = value;\\n return true\\n }\\n }\\n });\\n }\\n\\n var hasHandler = {\\n has: function has (target, key) {\\n var has = key in target;\\n var isAllowed = allowedGlobals(key) || key.charAt(0) === '_';\\n if (!has && !isAllowed) {\\n warnNonPresent(target, key);\\n }\\n return has || !isAllowed\\n }\\n };\\n\\n var getHandler = {\\n get: function get (target, key) {\\n if (typeof key === 'string' && !(key in target)) {\\n warnNonPresent(target, key);\\n }\\n return target[key]\\n }\\n };\\n\\n initProxy = function initProxy (vm) {\\n if (hasProxy) {\\n // determine which proxy handler to use\\n var options = vm.$options;\\n var handlers = options.render && options.render._withStripped\\n ? getHandler\\n : hasHandler;\\n vm._renderProxy = new Proxy(vm, handlers);\\n } else {\\n vm._renderProxy = vm;\\n }\\n };\\n}\\n\\n/* */\\n\\n\\nvar queue = [];\\nvar has$1 = {};\\nvar circular = {};\\nvar waiting = false;\\nvar flushing = false;\\nvar index = 0;\\n\\n/**\\n * Reset the scheduler's state.\\n */\\nfunction resetSchedulerState () {\\n queue.length = 0;\\n has$1 = {};\\n {\\n circular = {};\\n }\\n waiting = flushing = false;\\n}\\n\\n/**\\n * Flush both queues and run the watchers.\\n */\\nfunction flushSchedulerQueue () {\\n flushing = true;\\n\\n // Sort queue before flush.\\n // This ensures that:\\n // 1. Components are updated from parent to child. (because parent is always\\n // created before the child)\\n // 2. A component's user watchers are run before its render watcher (because\\n // user watchers are created before the render watcher)\\n // 3. If a component is destroyed during a parent component's watcher run,\\n // its watchers can be skipped.\\n queue.sort(function (a, b) { return a.id - b.id; });\\n\\n // do not cache length because more watchers might be pushed\\n // as we run existing watchers\\n for (index = 0; index < queue.length; index++) {\\n var watcher = queue[index];\\n var id = watcher.id;\\n has$1[id] = null;\\n watcher.run();\\n // in dev build, check and stop circular updates.\\n if (\\\"development\\\" !== 'production' && has$1[id] != null) {\\n circular[id] = (circular[id] || 0) + 1;\\n if (circular[id] > config._maxUpdateCount) {\\n warn(\\n 'You may have an infinite update loop ' + (\\n watcher.user\\n ? (\\\"in watcher with expression \\\\\\\"\\\" + (watcher.expression) + \\\"\\\\\\\"\\\")\\n : \\\"in a component render function.\\\"\\n ),\\n watcher.vm\\n );\\n break\\n }\\n }\\n }\\n\\n // devtool hook\\n /* istanbul ignore if */\\n if (devtools && config.devtools) {\\n devtools.emit('flush');\\n }\\n\\n resetSchedulerState();\\n}\\n\\n/**\\n * Push a watcher into the watcher queue.\\n * Jobs with duplicate IDs will be skipped unless it's\\n * pushed when the queue is being flushed.\\n */\\nfunction queueWatcher (watcher) {\\n var id = watcher.id;\\n if (has$1[id] == null) {\\n has$1[id] = true;\\n if (!flushing) {\\n queue.push(watcher);\\n } else {\\n // if already flushing, splice the watcher based on its id\\n // if already past its id, it will be run next immediately.\\n var i = queue.length - 1;\\n while (i >= 0 && queue[i].id > watcher.id) {\\n i--;\\n }\\n queue.splice(Math.max(i, index) + 1, 0, watcher);\\n }\\n // queue the flush\\n if (!waiting) {\\n waiting = true;\\n nextTick(flushSchedulerQueue);\\n }\\n }\\n}\\n\\n/* */\\n\\nvar uid$2 = 0;\\n\\n/**\\n * A watcher parses an expression, collects dependencies,\\n * and fires callback when the expression value changes.\\n * This is used for both the $watch() api and directives.\\n */\\nvar Watcher = function Watcher (\\n vm,\\n expOrFn,\\n cb,\\n options\\n) {\\n if ( options === void 0 ) options = {};\\n\\n this.vm = vm;\\n vm._watchers.push(this);\\n // options\\n this.deep = !!options.deep;\\n this.user = !!options.user;\\n this.lazy = !!options.lazy;\\n this.sync = !!options.sync;\\n this.expression = expOrFn.toString();\\n this.cb = cb;\\n this.id = ++uid$2; // uid for batching\\n this.active = true;\\n this.dirty = this.lazy; // for lazy watchers\\n this.deps = [];\\n this.newDeps = [];\\n this.depIds = new _Set();\\n this.newDepIds = new _Set();\\n // parse expression for getter\\n if (typeof expOrFn === 'function') {\\n this.getter = expOrFn;\\n } else {\\n this.getter = parsePath(expOrFn);\\n if (!this.getter) {\\n this.getter = function () {};\\n \\\"development\\\" !== 'production' && warn(\\n \\\"Failed watching path: \\\\\\\"\\\" + expOrFn + \\\"\\\\\\\" \\\" +\\n 'Watcher only accepts simple dot-delimited paths. ' +\\n 'For full control, use a function instead.',\\n vm\\n );\\n }\\n }\\n this.value = this.lazy\\n ? undefined\\n : this.get();\\n};\\n\\n/**\\n * Evaluate the getter, and re-collect dependencies.\\n */\\nWatcher.prototype.get = function get () {\\n pushTarget(this);\\n var value = this.getter.call(this.vm, this.vm);\\n // \\\"touch\\\" every property so they are all tracked as\\n // dependencies for deep watching\\n if (this.deep) {\\n traverse(value);\\n }\\n popTarget();\\n this.cleanupDeps();\\n return value\\n};\\n\\n/**\\n * Add a dependency to this directive.\\n */\\nWatcher.prototype.addDep = function addDep (dep) {\\n var id = dep.id;\\n if (!this.newDepIds.has(id)) {\\n this.newDepIds.add(id);\\n this.newDeps.push(dep);\\n if (!this.depIds.has(id)) {\\n dep.addSub(this);\\n }\\n }\\n};\\n\\n/**\\n * Clean up for dependency collection.\\n */\\nWatcher.prototype.cleanupDeps = function cleanupDeps () {\\n var this$1 = this;\\n\\n var i = this.deps.length;\\n while (i--) {\\n var dep = this$1.deps[i];\\n if (!this$1.newDepIds.has(dep.id)) {\\n dep.removeSub(this$1);\\n }\\n }\\n var tmp = this.depIds;\\n this.depIds = this.newDepIds;\\n this.newDepIds = tmp;\\n this.newDepIds.clear();\\n tmp = this.deps;\\n this.deps = this.newDeps;\\n this.newDeps = tmp;\\n this.newDeps.length = 0;\\n};\\n\\n/**\\n * Subscriber interface.\\n * Will be called when a dependency changes.\\n */\\nWatcher.prototype.update = function update () {\\n /* istanbul ignore else */\\n if (this.lazy) {\\n this.dirty = true;\\n } else if (this.sync) {\\n this.run();\\n } else {\\n queueWatcher(this);\\n }\\n};\\n\\n/**\\n * Scheduler job interface.\\n * Will be called by the scheduler.\\n */\\nWatcher.prototype.run = function run () {\\n if (this.active) {\\n var value = this.get();\\n if (\\n value !== this.value ||\\n // Deep watchers and watchers on Object/Arrays should fire even\\n // when the value is the same, because the value may\\n // have mutated.\\n isObject(value) ||\\n this.deep\\n ) {\\n // set new value\\n var oldValue = this.value;\\n this.value = value;\\n if (this.user) {\\n try {\\n this.cb.call(this.vm, value, oldValue);\\n } catch (e) {\\n /* istanbul ignore else */\\n if (config.errorHandler) {\\n config.errorHandler.call(null, e, this.vm);\\n } else {\\n \\\"development\\\" !== 'production' && warn(\\n (\\\"Error in watcher \\\\\\\"\\\" + (this.expression) + \\\"\\\\\\\"\\\"),\\n this.vm\\n );\\n throw e\\n }\\n }\\n } else {\\n this.cb.call(this.vm, value, oldValue);\\n }\\n }\\n }\\n};\\n\\n/**\\n * Evaluate the value of the watcher.\\n * This only gets called for lazy watchers.\\n */\\nWatcher.prototype.evaluate = function evaluate () {\\n this.value = this.get();\\n this.dirty = false;\\n};\\n\\n/**\\n * Depend on all deps collected by this watcher.\\n */\\nWatcher.prototype.depend = function depend () {\\n var this$1 = this;\\n\\n var i = this.deps.length;\\n while (i--) {\\n this$1.deps[i].depend();\\n }\\n};\\n\\n/**\\n * Remove self from all dependencies' subscriber list.\\n */\\nWatcher.prototype.teardown = function teardown () {\\n var this$1 = this;\\n\\n if (this.active) {\\n // remove self from vm's watcher list\\n // this is a somewhat expensive operation so we skip it\\n // if the vm is being destroyed or is performing a v-for\\n // re-render (the watcher list is then filtered by v-for).\\n if (!this.vm._isBeingDestroyed && !this.vm._vForRemoving) {\\n remove$1(this.vm._watchers, this);\\n }\\n var i = this.deps.length;\\n while (i--) {\\n this$1.deps[i].removeSub(this$1);\\n }\\n this.active = false;\\n }\\n};\\n\\n/**\\n * Recursively traverse an object to evoke all converted\\n * getters, so that every nested property inside the object\\n * is collected as a \\\"deep\\\" dependency.\\n */\\nvar seenObjects = new _Set();\\nfunction traverse (val) {\\n seenObjects.clear();\\n _traverse(val, seenObjects);\\n}\\n\\nfunction _traverse (val, seen) {\\n var i, keys;\\n var isA = Array.isArray(val);\\n if ((!isA && !isObject(val)) || !Object.isExtensible(val)) {\\n return\\n }\\n if (val.__ob__) {\\n var depId = val.__ob__.dep.id;\\n if (seen.has(depId)) {\\n return\\n }\\n seen.add(depId);\\n }\\n if (isA) {\\n i = val.length;\\n while (i--) { _traverse(val[i], seen); }\\n } else {\\n keys = Object.keys(val);\\n i = keys.length;\\n while (i--) { _traverse(val[keys[i]], seen); }\\n }\\n}\\n\\n/* */\\n\\nfunction initState (vm) {\\n vm._watchers = [];\\n initProps(vm);\\n initMethods(vm);\\n initData(vm);\\n initComputed(vm);\\n initWatch(vm);\\n}\\n\\nvar isReservedProp = { key: 1, ref: 1, slot: 1 };\\n\\nfunction initProps (vm) {\\n var props = vm.$options.props;\\n if (props) {\\n var propsData = vm.$options.propsData || {};\\n var keys = vm.$options._propKeys = Object.keys(props);\\n var isRoot = !vm.$parent;\\n // root instance props should be converted\\n observerState.shouldConvert = isRoot;\\n var loop = function ( i ) {\\n var key = keys[i];\\n /* istanbul ignore else */\\n {\\n if (isReservedProp[key]) {\\n warn(\\n (\\\"\\\\\\\"\\\" + key + \\\"\\\\\\\" is a reserved attribute and cannot be used as component prop.\\\"),\\n vm\\n );\\n }\\n defineReactive$$1(vm, key, validateProp(key, props, propsData, vm), function () {\\n if (vm.$parent && !observerState.isSettingProps) {\\n warn(\\n \\\"Avoid mutating a prop directly since the value will be \\\" +\\n \\\"overwritten whenever the parent component re-renders. \\\" +\\n \\\"Instead, use a data or computed property based on the prop's \\\" +\\n \\\"value. Prop being mutated: \\\\\\\"\\\" + key + \\\"\\\\\\\"\\\",\\n vm\\n );\\n }\\n });\\n }\\n };\\n\\n for (var i = 0; i < keys.length; i++) loop( i );\\n observerState.shouldConvert = true;\\n }\\n}\\n\\nfunction initData (vm) {\\n var data = vm.$options.data;\\n data = vm._data = typeof data === 'function'\\n ? data.call(vm)\\n : data || {};\\n if (!isPlainObject(data)) {\\n data = {};\\n \\\"development\\\" !== 'production' && warn(\\n 'data functions should return an object:\\\\n' +\\n 'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',\\n vm\\n );\\n }\\n // proxy data on instance\\n var keys = Object.keys(data);\\n var props = vm.$options.props;\\n var i = keys.length;\\n while (i--) {\\n if (props && hasOwn(props, keys[i])) {\\n \\\"development\\\" !== 'production' && warn(\\n \\\"The data property \\\\\\\"\\\" + (keys[i]) + \\\"\\\\\\\" is already declared as a prop. \\\" +\\n \\\"Use prop default value instead.\\\",\\n vm\\n );\\n } else {\\n proxy(vm, keys[i]);\\n }\\n }\\n // observe data\\n observe(data);\\n data.__ob__ && data.__ob__.vmCount++;\\n}\\n\\nvar computedSharedDefinition = {\\n enumerable: true,\\n configurable: true,\\n get: noop,\\n set: noop\\n};\\n\\nfunction initComputed (vm) {\\n var computed = vm.$options.computed;\\n if (computed) {\\n for (var key in computed) {\\n var userDef = computed[key];\\n if (typeof userDef === 'function') {\\n computedSharedDefinition.get = makeComputedGetter(userDef, vm);\\n computedSharedDefinition.set = noop;\\n } else {\\n computedSharedDefinition.get = userDef.get\\n ? userDef.cache !== false\\n ? makeComputedGetter(userDef.get, vm)\\n : bind$1(userDef.get, vm)\\n : noop;\\n computedSharedDefinition.set = userDef.set\\n ? bind$1(userDef.set, vm)\\n : noop;\\n }\\n Object.defineProperty(vm, key, computedSharedDefinition);\\n }\\n }\\n}\\n\\nfunction makeComputedGetter (getter, owner) {\\n var watcher = new Watcher(owner, getter, noop, {\\n lazy: true\\n });\\n return function computedGetter () {\\n if (watcher.dirty) {\\n watcher.evaluate();\\n }\\n if (Dep.target) {\\n watcher.depend();\\n }\\n return watcher.value\\n }\\n}\\n\\nfunction initMethods (vm) {\\n var methods = vm.$options.methods;\\n if (methods) {\\n for (var key in methods) {\\n vm[key] = methods[key] == null ? noop : bind$1(methods[key], vm);\\n if (\\\"development\\\" !== 'production' && methods[key] == null) {\\n warn(\\n \\\"method \\\\\\\"\\\" + key + \\\"\\\\\\\" has an undefined value in the component definition. \\\" +\\n \\\"Did you reference the function correctly?\\\",\\n vm\\n );\\n }\\n }\\n }\\n}\\n\\nfunction initWatch (vm) {\\n var watch = vm.$options.watch;\\n if (watch) {\\n for (var key in watch) {\\n var handler = watch[key];\\n if (Array.isArray(handler)) {\\n for (var i = 0; i < handler.length; i++) {\\n createWatcher(vm, key, handler[i]);\\n }\\n } else {\\n createWatcher(vm, key, handler);\\n }\\n }\\n }\\n}\\n\\nfunction createWatcher (vm, key, handler) {\\n var options;\\n if (isPlainObject(handler)) {\\n options = handler;\\n handler = handler.handler;\\n }\\n if (typeof handler === 'string') {\\n handler = vm[handler];\\n }\\n vm.$watch(key, handler, options);\\n}\\n\\nfunction stateMixin (Vue) {\\n // flow somehow has problems with directly declared definition object\\n // when using Object.defineProperty, so we have to procedurally build up\\n // the object here.\\n var dataDef = {};\\n dataDef.get = function () {\\n return this._data\\n };\\n {\\n dataDef.set = function (newData) {\\n warn(\\n 'Avoid replacing instance root $data. ' +\\n 'Use nested data properties instead.',\\n this\\n );\\n };\\n }\\n Object.defineProperty(Vue.prototype, '$data', dataDef);\\n\\n Vue.prototype.$set = set$1;\\n Vue.prototype.$delete = del;\\n\\n Vue.prototype.$watch = function (\\n expOrFn,\\n cb,\\n options\\n ) {\\n var vm = this;\\n options = options || {};\\n options.user = true;\\n var watcher = new Watcher(vm, expOrFn, cb, options);\\n if (options.immediate) {\\n cb.call(vm, watcher.value);\\n }\\n return function unwatchFn () {\\n watcher.teardown();\\n }\\n };\\n}\\n\\nfunction proxy (vm, key) {\\n if (!isReserved(key)) {\\n Object.defineProperty(vm, key, {\\n configurable: true,\\n enumerable: true,\\n get: function proxyGetter () {\\n return vm._data[key]\\n },\\n set: function proxySetter (val) {\\n vm._data[key] = val;\\n }\\n });\\n }\\n}\\n\\n/* */\\n\\nvar VNode = function VNode (\\n tag,\\n data,\\n children,\\n text,\\n elm,\\n context,\\n componentOptions\\n) {\\n this.tag = tag;\\n this.data = data;\\n this.children = children;\\n this.text = text;\\n this.elm = elm;\\n this.ns = undefined;\\n this.context = context;\\n this.functionalContext = undefined;\\n this.key = data && data.key;\\n this.componentOptions = componentOptions;\\n this.child = undefined;\\n this.parent = undefined;\\n this.raw = false;\\n this.isStatic = false;\\n this.isRootInsert = true;\\n this.isComment = false;\\n this.isCloned = false;\\n this.isOnce = false;\\n};\\n\\nvar createEmptyVNode = function () {\\n var node = new VNode();\\n node.text = '';\\n node.isComment = true;\\n return node\\n};\\n\\nfunction createTextVNode (val) {\\n return new VNode(undefined, undefined, undefined, String(val))\\n}\\n\\n// optimized shallow clone\\n// used for static nodes and slot nodes because they may be reused across\\n// multiple renders, cloning them avoids errors when DOM manipulations rely\\n// on their elm reference.\\nfunction cloneVNode (vnode) {\\n var cloned = new VNode(\\n vnode.tag,\\n vnode.data,\\n vnode.children,\\n vnode.text,\\n vnode.elm,\\n vnode.context,\\n vnode.componentOptions\\n );\\n cloned.ns = vnode.ns;\\n cloned.isStatic = vnode.isStatic;\\n cloned.key = vnode.key;\\n cloned.isCloned = true;\\n return cloned\\n}\\n\\nfunction cloneVNodes (vnodes) {\\n var res = new Array(vnodes.length);\\n for (var i = 0; i < vnodes.length; i++) {\\n res[i] = cloneVNode(vnodes[i]);\\n }\\n return res\\n}\\n\\n/* */\\n\\nvar activeInstance = null;\\n\\nfunction initLifecycle (vm) {\\n var options = vm.$options;\\n\\n // locate first non-abstract parent\\n var parent = options.parent;\\n if (parent && !options.abstract) {\\n while (parent.$options.abstract && parent.$parent) {\\n parent = parent.$parent;\\n }\\n parent.$children.push(vm);\\n }\\n\\n vm.$parent = parent;\\n vm.$root = parent ? parent.$root : vm;\\n\\n vm.$children = [];\\n vm.$refs = {};\\n\\n vm._watcher = null;\\n vm._inactive = false;\\n vm._isMounted = false;\\n vm._isDestroyed = false;\\n vm._isBeingDestroyed = false;\\n}\\n\\nfunction lifecycleMixin (Vue) {\\n Vue.prototype._mount = function (\\n el,\\n hydrating\\n ) {\\n var vm = this;\\n vm.$el = el;\\n if (!vm.$options.render) {\\n vm.$options.render = createEmptyVNode;\\n {\\n /* istanbul ignore if */\\n if (vm.$options.template && vm.$options.template.charAt(0) !== '#') {\\n warn(\\n 'You are using the runtime-only build of Vue where the template ' +\\n 'option is not available. Either pre-compile the templates into ' +\\n 'render functions, or use the compiler-included build.',\\n vm\\n );\\n } else {\\n warn(\\n 'Failed to mount component: template or render function not defined.',\\n vm\\n );\\n }\\n }\\n }\\n callHook(vm, 'beforeMount');\\n vm._watcher = new Watcher(vm, function () {\\n vm._update(vm._render(), hydrating);\\n }, noop);\\n hydrating = false;\\n // manually mounted instance, call mounted on self\\n // mounted is called for render-created child components in its inserted hook\\n if (vm.$vnode == null) {\\n vm._isMounted = true;\\n callHook(vm, 'mounted');\\n }\\n return vm\\n };\\n\\n Vue.prototype._update = function (vnode, hydrating) {\\n var vm = this;\\n if (vm._isMounted) {\\n callHook(vm, 'beforeUpdate');\\n }\\n var prevEl = vm.$el;\\n var prevVnode = vm._vnode;\\n var prevActiveInstance = activeInstance;\\n activeInstance = vm;\\n vm._vnode = vnode;\\n // Vue.prototype.__patch__ is injected in entry points\\n // based on the rendering backend used.\\n if (!prevVnode) {\\n // initial render\\n vm.$el = vm.__patch__(\\n vm.$el, vnode, hydrating, false /* removeOnly */,\\n vm.$options._parentElm,\\n vm.$options._refElm\\n );\\n } else {\\n // updates\\n vm.$el = vm.__patch__(prevVnode, vnode);\\n }\\n activeInstance = prevActiveInstance;\\n // update __vue__ reference\\n if (prevEl) {\\n prevEl.__vue__ = null;\\n }\\n if (vm.$el) {\\n vm.$el.__vue__ = vm;\\n }\\n // if parent is an HOC, update its $el as well\\n if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {\\n vm.$parent.$el = vm.$el;\\n }\\n if (vm._isMounted) {\\n callHook(vm, 'updated');\\n }\\n };\\n\\n Vue.prototype._updateFromParent = function (\\n propsData,\\n listeners,\\n parentVnode,\\n renderChildren\\n ) {\\n var vm = this;\\n var hasChildren = !!(vm.$options._renderChildren || renderChildren);\\n vm.$options._parentVnode = parentVnode;\\n vm.$vnode = parentVnode; // update vm's placeholder node without re-render\\n if (vm._vnode) { // update child tree's parent\\n vm._vnode.parent = parentVnode;\\n }\\n vm.$options._renderChildren = renderChildren;\\n // update props\\n if (propsData && vm.$options.props) {\\n observerState.shouldConvert = false;\\n {\\n observerState.isSettingProps = true;\\n }\\n var propKeys = vm.$options._propKeys || [];\\n for (var i = 0; i < propKeys.length; i++) {\\n var key = propKeys[i];\\n vm[key] = validateProp(key, vm.$options.props, propsData, vm);\\n }\\n observerState.shouldConvert = true;\\n {\\n observerState.isSettingProps = false;\\n }\\n vm.$options.propsData = propsData;\\n }\\n // update listeners\\n if (listeners) {\\n var oldListeners = vm.$options._parentListeners;\\n vm.$options._parentListeners = listeners;\\n vm._updateListeners(listeners, oldListeners);\\n }\\n // resolve slots + force update if has children\\n if (hasChildren) {\\n vm.$slots = resolveSlots(renderChildren, parentVnode.context);\\n vm.$forceUpdate();\\n }\\n };\\n\\n Vue.prototype.$forceUpdate = function () {\\n var vm = this;\\n if (vm._watcher) {\\n vm._watcher.update();\\n }\\n };\\n\\n Vue.prototype.$destroy = function () {\\n var vm = this;\\n if (vm._isBeingDestroyed) {\\n return\\n }\\n callHook(vm, 'beforeDestroy');\\n vm._isBeingDestroyed = true;\\n // remove self from parent\\n var parent = vm.$parent;\\n if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {\\n remove$1(parent.$children, vm);\\n }\\n // teardown watchers\\n if (vm._watcher) {\\n vm._watcher.teardown();\\n }\\n var i = vm._watchers.length;\\n while (i--) {\\n vm._watchers[i].teardown();\\n }\\n // remove reference from data ob\\n // frozen object may not have observer.\\n if (vm._data.__ob__) {\\n vm._data.__ob__.vmCount--;\\n }\\n // call the last hook...\\n vm._isDestroyed = true;\\n callHook(vm, 'destroyed');\\n // turn off all instance listeners.\\n vm.$off();\\n // remove __vue__ reference\\n if (vm.$el) {\\n vm.$el.__vue__ = null;\\n }\\n // invoke destroy hooks on current rendered tree\\n vm.__patch__(vm._vnode, null);\\n };\\n}\\n\\nfunction callHook (vm, hook) {\\n var handlers = vm.$options[hook];\\n if (handlers) {\\n for (var i = 0, j = handlers.length; i < j; i++) {\\n handlers[i].call(vm);\\n }\\n }\\n vm.$emit('hook:' + hook);\\n}\\n\\n/* */\\n\\nvar hooks = { init: init, prepatch: prepatch, insert: insert, destroy: destroy$1 };\\nvar hooksToMerge = Object.keys(hooks);\\n\\nfunction createComponent (\\n Ctor,\\n data,\\n context,\\n children,\\n tag\\n) {\\n if (!Ctor) {\\n return\\n }\\n\\n var baseCtor = context.$options._base;\\n if (isObject(Ctor)) {\\n Ctor = baseCtor.extend(Ctor);\\n }\\n\\n if (typeof Ctor !== 'function') {\\n {\\n warn((\\\"Invalid Component definition: \\\" + (String(Ctor))), context);\\n }\\n return\\n }\\n\\n // async component\\n if (!Ctor.cid) {\\n if (Ctor.resolved) {\\n Ctor = Ctor.resolved;\\n } else {\\n Ctor = resolveAsyncComponent(Ctor, baseCtor, function () {\\n // it's ok to queue this on every render because\\n // $forceUpdate is buffered by the scheduler.\\n context.$forceUpdate();\\n });\\n if (!Ctor) {\\n // return nothing if this is indeed an async component\\n // wait for the callback to trigger parent update.\\n return\\n }\\n }\\n }\\n\\n // resolve constructor options in case global mixins are applied after\\n // component constructor creation\\n resolveConstructorOptions(Ctor);\\n\\n data = data || {};\\n\\n // extract props\\n var propsData = extractProps(data, Ctor);\\n\\n // functional component\\n if (Ctor.options.functional) {\\n return createFunctionalComponent(Ctor, propsData, data, context, children)\\n }\\n\\n // extract listeners, since these needs to be treated as\\n // child component listeners instead of DOM listeners\\n var listeners = data.on;\\n // replace with listeners with .native modifier\\n data.on = data.nativeOn;\\n\\n if (Ctor.options.abstract) {\\n // abstract components do not keep anything\\n // other than props & listeners\\n data = {};\\n }\\n\\n // merge component management hooks onto the placeholder node\\n mergeHooks(data);\\n\\n // return a placeholder vnode\\n var name = Ctor.options.name || tag;\\n var vnode = new VNode(\\n (\\\"vue-component-\\\" + (Ctor.cid) + (name ? (\\\"-\\\" + name) : '')),\\n data, undefined, undefined, undefined, context,\\n { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children }\\n );\\n return vnode\\n}\\n\\nfunction createFunctionalComponent (\\n Ctor,\\n propsData,\\n data,\\n context,\\n children\\n) {\\n var props = {};\\n var propOptions = Ctor.options.props;\\n if (propOptions) {\\n for (var key in propOptions) {\\n props[key] = validateProp(key, propOptions, propsData);\\n }\\n }\\n // ensure the createElement function in functional components\\n // gets a unique context - this is necessary for correct named slot check\\n var _context = Object.create(context);\\n var h = function (a, b, c, d) { return createElement(_context, a, b, c, d, true); };\\n var vnode = Ctor.options.render.call(null, h, {\\n props: props,\\n data: data,\\n parent: context,\\n children: children,\\n slots: function () { return resolveSlots(children, context); }\\n });\\n if (vnode instanceof VNode) {\\n vnode.functionalContext = context;\\n if (data.slot) {\\n (vnode.data || (vnode.data = {})).slot = data.slot;\\n }\\n }\\n return vnode\\n}\\n\\nfunction createComponentInstanceForVnode (\\n vnode, // we know it's MountedComponentVNode but flow doesn't\\n parent, // activeInstance in lifecycle state\\n parentElm,\\n refElm\\n) {\\n var vnodeComponentOptions = vnode.componentOptions;\\n var options = {\\n _isComponent: true,\\n parent: parent,\\n propsData: vnodeComponentOptions.propsData,\\n _componentTag: vnodeComponentOptions.tag,\\n _parentVnode: vnode,\\n _parentListeners: vnodeComponentOptions.listeners,\\n _renderChildren: vnodeComponentOptions.children,\\n _parentElm: parentElm || null,\\n _refElm: refElm || null\\n };\\n // check inline-template render functions\\n var inlineTemplate = vnode.data.inlineTemplate;\\n if (inlineTemplate) {\\n options.render = inlineTemplate.render;\\n options.staticRenderFns = inlineTemplate.staticRenderFns;\\n }\\n return new vnodeComponentOptions.Ctor(options)\\n}\\n\\nfunction init (\\n vnode,\\n hydrating,\\n parentElm,\\n refElm\\n) {\\n if (!vnode.child || vnode.child._isDestroyed) {\\n var child = vnode.child = createComponentInstanceForVnode(\\n vnode,\\n activeInstance,\\n parentElm,\\n refElm\\n );\\n child.$mount(hydrating ? vnode.elm : undefined, hydrating);\\n } else if (vnode.data.keepAlive) {\\n // kept-alive components, treat as a patch\\n var mountedNode = vnode; // work around flow\\n prepatch(mountedNode, mountedNode);\\n }\\n}\\n\\nfunction prepatch (\\n oldVnode,\\n vnode\\n) {\\n var options = vnode.componentOptions;\\n var child = vnode.child = oldVnode.child;\\n child._updateFromParent(\\n options.propsData, // updated props\\n options.listeners, // updated listeners\\n vnode, // new parent vnode\\n options.children // new children\\n );\\n}\\n\\nfunction insert (vnode) {\\n if (!vnode.child._isMounted) {\\n vnode.child._isMounted = true;\\n callHook(vnode.child, 'mounted');\\n }\\n if (vnode.data.keepAlive) {\\n vnode.child._inactive = false;\\n callHook(vnode.child, 'activated');\\n }\\n}\\n\\nfunction destroy$1 (vnode) {\\n if (!vnode.child._isDestroyed) {\\n if (!vnode.data.keepAlive) {\\n vnode.child.$destroy();\\n } else {\\n vnode.child._inactive = true;\\n callHook(vnode.child, 'deactivated');\\n }\\n }\\n}\\n\\nfunction resolveAsyncComponent (\\n factory,\\n baseCtor,\\n cb\\n) {\\n if (factory.requested) {\\n // pool callbacks\\n factory.pendingCallbacks.push(cb);\\n } else {\\n factory.requested = true;\\n var cbs = factory.pendingCallbacks = [cb];\\n var sync = true;\\n\\n var resolve = function (res) {\\n if (isObject(res)) {\\n res = baseCtor.extend(res);\\n }\\n // cache resolved\\n factory.resolved = res;\\n // invoke callbacks only if this is not a synchronous resolve\\n // (async resolves are shimmed as synchronous during SSR)\\n if (!sync) {\\n for (var i = 0, l = cbs.length; i < l; i++) {\\n cbs[i](res);\\n }\\n }\\n };\\n\\n var reject = function (reason) {\\n \\\"development\\\" !== 'production' && warn(\\n \\\"Failed to resolve async component: \\\" + (String(factory)) +\\n (reason ? (\\\"\\\\nReason: \\\" + reason) : '')\\n );\\n };\\n\\n var res = factory(resolve, reject);\\n\\n // handle promise\\n if (res && typeof res.then === 'function' && !factory.resolved) {\\n res.then(resolve, reject);\\n }\\n\\n sync = false;\\n // return in case resolved synchronously\\n return factory.resolved\\n }\\n}\\n\\nfunction extractProps (data, Ctor) {\\n // we are only extracting raw values here.\\n // validation and default values are handled in the child\\n // component itself.\\n var propOptions = Ctor.options.props;\\n if (!propOptions) {\\n return\\n }\\n var res = {};\\n var attrs = data.attrs;\\n var props = data.props;\\n var domProps = data.domProps;\\n if (attrs || props || domProps) {\\n for (var key in propOptions) {\\n var altKey = hyphenate(key);\\n checkProp(res, props, key, altKey, true) ||\\n checkProp(res, attrs, key, altKey) ||\\n checkProp(res, domProps, key, altKey);\\n }\\n }\\n return res\\n}\\n\\nfunction checkProp (\\n res,\\n hash,\\n key,\\n altKey,\\n preserve\\n) {\\n if (hash) {\\n if (hasOwn(hash, key)) {\\n res[key] = hash[key];\\n if (!preserve) {\\n delete hash[key];\\n }\\n return true\\n } else if (hasOwn(hash, altKey)) {\\n res[key] = hash[altKey];\\n if (!preserve) {\\n delete hash[altKey];\\n }\\n return true\\n }\\n }\\n return false\\n}\\n\\nfunction mergeHooks (data) {\\n if (!data.hook) {\\n data.hook = {};\\n }\\n for (var i = 0; i < hooksToMerge.length; i++) {\\n var key = hooksToMerge[i];\\n var fromParent = data.hook[key];\\n var ours = hooks[key];\\n data.hook[key] = fromParent ? mergeHook$1(ours, fromParent) : ours;\\n }\\n}\\n\\nfunction mergeHook$1 (one, two) {\\n return function (a, b, c, d) {\\n one(a, b, c, d);\\n two(a, b, c, d);\\n }\\n}\\n\\n/* */\\n\\nfunction mergeVNodeHook (def, hookKey, hook, key) {\\n key = key + hookKey;\\n var injectedHash = def.__injected || (def.__injected = {});\\n if (!injectedHash[key]) {\\n injectedHash[key] = true;\\n var oldHook = def[hookKey];\\n if (oldHook) {\\n def[hookKey] = function () {\\n oldHook.apply(this, arguments);\\n hook.apply(this, arguments);\\n };\\n } else {\\n def[hookKey] = hook;\\n }\\n }\\n}\\n\\n/* */\\n\\nfunction updateListeners (\\n on,\\n oldOn,\\n add,\\n remove$$1,\\n vm\\n) {\\n var name, cur, old, fn, event, capture, once;\\n for (name in on) {\\n cur = on[name];\\n old = oldOn[name];\\n if (!cur) {\\n \\\"development\\\" !== 'production' && warn(\\n \\\"Invalid handler for event \\\\\\\"\\\" + name + \\\"\\\\\\\": got \\\" + String(cur),\\n vm\\n );\\n } else if (!old) {\\n once = name.charAt(0) === '~'; // Prefixed last, checked first\\n event = once ? name.slice(1) : name;\\n capture = event.charAt(0) === '!';\\n event = capture ? event.slice(1) : event;\\n if (Array.isArray(cur)) {\\n add(event, (cur.invoker = arrInvoker(cur)), once, capture);\\n } else {\\n if (!cur.invoker) {\\n fn = cur;\\n cur = on[name] = {};\\n cur.fn = fn;\\n cur.invoker = fnInvoker(cur);\\n }\\n add(event, cur.invoker, once, capture);\\n }\\n } else if (cur !== old) {\\n if (Array.isArray(old)) {\\n old.length = cur.length;\\n for (var i = 0; i < old.length; i++) { old[i] = cur[i]; }\\n on[name] = old;\\n } else {\\n old.fn = cur;\\n on[name] = old;\\n }\\n }\\n }\\n for (name in oldOn) {\\n if (!on[name]) {\\n once = name.charAt(0) === '~'; // Prefixed last, checked first\\n event = once ? name.slice(1) : name;\\n capture = event.charAt(0) === '!';\\n event = capture ? event.slice(1) : event;\\n remove$$1(event, oldOn[name].invoker, capture);\\n }\\n }\\n}\\n\\nfunction arrInvoker (arr) {\\n return function (ev) {\\n var arguments$1 = arguments;\\n\\n var single = arguments.length === 1;\\n for (var i = 0; i < arr.length; i++) {\\n single ? arr[i](ev) : arr[i].apply(null, arguments$1);\\n }\\n }\\n}\\n\\nfunction fnInvoker (o) {\\n return function (ev) {\\n var single = arguments.length === 1;\\n single ? o.fn(ev) : o.fn.apply(null, arguments);\\n }\\n}\\n\\n/* */\\n\\nfunction normalizeChildren (children) {\\n return isPrimitive(children)\\n ? [createTextVNode(children)]\\n : Array.isArray(children)\\n ? normalizeArrayChildren(children)\\n : undefined\\n}\\n\\nfunction normalizeArrayChildren (children, nestedIndex) {\\n var res = [];\\n var i, c, last;\\n for (i = 0; i < children.length; i++) {\\n c = children[i];\\n if (c == null || typeof c === 'boolean') { continue }\\n last = res[res.length - 1];\\n // nested\\n if (Array.isArray(c)) {\\n res.push.apply(res, normalizeArrayChildren(c, ((nestedIndex || '') + \\\"_\\\" + i)));\\n } else if (isPrimitive(c)) {\\n if (last && last.text) {\\n last.text += String(c);\\n } else if (c !== '') {\\n // convert primitive to vnode\\n res.push(createTextVNode(c));\\n }\\n } else {\\n if (c.text && last && last.text) {\\n res[res.length - 1] = createTextVNode(last.text + c.text);\\n } else {\\n // default key for nested array children (likely generated by v-for)\\n if (c.tag && c.key == null && nestedIndex != null) {\\n c.key = \\\"__vlist\\\" + nestedIndex + \\\"_\\\" + i + \\\"__\\\";\\n }\\n res.push(c);\\n }\\n }\\n }\\n return res\\n}\\n\\n/* */\\n\\nfunction getFirstComponentChild (children) {\\n return children && children.filter(function (c) { return c && c.componentOptions; })[0]\\n}\\n\\n/* */\\n\\n// wrapper function for providing a more flexible interface\\n// without getting yelled at by flow\\nfunction createElement (\\n context,\\n tag,\\n data,\\n children,\\n needNormalization,\\n alwaysNormalize\\n) {\\n if (Array.isArray(data) || isPrimitive(data)) {\\n needNormalization = children;\\n children = data;\\n data = undefined;\\n }\\n if (alwaysNormalize) { needNormalization = true; }\\n return _createElement(context, tag, data, children, needNormalization)\\n}\\n\\nfunction _createElement (\\n context,\\n tag,\\n data,\\n children,\\n needNormalization\\n) {\\n if (data && data.__ob__) {\\n \\\"development\\\" !== 'production' && warn(\\n \\\"Avoid using observed data object as vnode data: \\\" + (JSON.stringify(data)) + \\\"\\\\n\\\" +\\n 'Always create fresh vnode data objects in each render!',\\n context\\n );\\n return createEmptyVNode()\\n }\\n if (!tag) {\\n // in case of component :is set to falsy value\\n return createEmptyVNode()\\n }\\n // support single function children as default scoped slot\\n if (Array.isArray(children) &&\\n typeof children[0] === 'function') {\\n data = data || {};\\n data.scopedSlots = { default: children[0] };\\n children.length = 0;\\n }\\n if (needNormalization) {\\n children = normalizeChildren(children);\\n }\\n var vnode, ns;\\n if (typeof tag === 'string') {\\n var Ctor;\\n ns = config.getTagNamespace(tag);\\n if (config.isReservedTag(tag)) {\\n // platform built-in elements\\n vnode = new VNode(\\n config.parsePlatformTagName(tag), data, children,\\n undefined, undefined, context\\n );\\n } else if ((Ctor = resolveAsset(context.$options, 'components', tag))) {\\n // component\\n vnode = createComponent(Ctor, data, context, children, tag);\\n } else {\\n // unknown or unlisted namespaced elements\\n // check at runtime because it may get assigned a namespace when its\\n // parent normalizes children\\n ns = tag === 'foreignObject' ? 'xhtml' : ns;\\n vnode = new VNode(\\n tag, data, children,\\n undefined, undefined, context\\n );\\n }\\n } else {\\n // direct component options / constructor\\n vnode = createComponent(tag, data, context, children);\\n }\\n if (vnode) {\\n if (ns) { applyNS(vnode, ns); }\\n return vnode\\n } else {\\n return createEmptyVNode()\\n }\\n}\\n\\nfunction applyNS (vnode, ns) {\\n vnode.ns = ns;\\n if (vnode.children) {\\n for (var i = 0, l = vnode.children.length; i < l; i++) {\\n var child = vnode.children[i];\\n if (child.tag && !child.ns) {\\n applyNS(child, ns);\\n }\\n }\\n }\\n}\\n\\n/* */\\n\\nfunction initRender (vm) {\\n vm.$vnode = null; // the placeholder node in parent tree\\n vm._vnode = null; // the root of the child tree\\n vm._staticTrees = null;\\n var parentVnode = vm.$options._parentVnode;\\n var renderContext = parentVnode && parentVnode.context;\\n vm.$slots = resolveSlots(vm.$options._renderChildren, renderContext);\\n vm.$scopedSlots = {};\\n // bind the createElement fn to this instance\\n // so that we get proper render context inside it.\\n // args order: tag, data, children, needNormalization, alwaysNormalize\\n // internal version is used by render functions compiled from templates\\n vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };\\n // normalization is always applied for the public version, used in\\n // user-written render functions.\\n vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };\\n if (vm.$options.el) {\\n vm.$mount(vm.$options.el);\\n }\\n}\\n\\nfunction renderMixin (Vue) {\\n Vue.prototype.$nextTick = function (fn) {\\n return nextTick(fn, this)\\n };\\n\\n Vue.prototype._render = function () {\\n var vm = this;\\n var ref = vm.$options;\\n var render = ref.render;\\n var staticRenderFns = ref.staticRenderFns;\\n var _parentVnode = ref._parentVnode;\\n\\n if (vm._isMounted) {\\n // clone slot nodes on re-renders\\n for (var key in vm.$slots) {\\n vm.$slots[key] = cloneVNodes(vm.$slots[key]);\\n }\\n }\\n\\n if (_parentVnode && _parentVnode.data.scopedSlots) {\\n vm.$scopedSlots = _parentVnode.data.scopedSlots;\\n }\\n\\n if (staticRenderFns && !vm._staticTrees) {\\n vm._staticTrees = [];\\n }\\n // set parent vnode. this allows render functions to have access\\n // to the data on the placeholder node.\\n vm.$vnode = _parentVnode;\\n // render self\\n var vnode;\\n try {\\n vnode = render.call(vm._renderProxy, vm.$createElement);\\n } catch (e) {\\n /* istanbul ignore else */\\n if (config.errorHandler) {\\n config.errorHandler.call(null, e, vm);\\n } else {\\n {\\n warn((\\\"Error when rendering \\\" + (formatComponentName(vm)) + \\\":\\\"));\\n }\\n throw e\\n }\\n // return previous vnode to prevent render error causing blank component\\n vnode = vm._vnode;\\n }\\n // return empty vnode in case the render function errored out\\n if (!(vnode instanceof VNode)) {\\n if (\\\"development\\\" !== 'production' && Array.isArray(vnode)) {\\n warn(\\n 'Multiple root nodes returned from render function. Render function ' +\\n 'should return a single root node.',\\n vm\\n );\\n }\\n vnode = createEmptyVNode();\\n }\\n // set parent\\n vnode.parent = _parentVnode;\\n return vnode\\n };\\n\\n // toString for mustaches\\n Vue.prototype._s = _toString;\\n // convert text to vnode\\n Vue.prototype._v = createTextVNode;\\n // number conversion\\n Vue.prototype._n = toNumber;\\n // empty vnode\\n Vue.prototype._e = createEmptyVNode;\\n // loose equal\\n Vue.prototype._q = looseEqual;\\n // loose indexOf\\n Vue.prototype._i = looseIndexOf;\\n\\n // render static tree by index\\n Vue.prototype._m = function renderStatic (\\n index,\\n isInFor\\n ) {\\n var tree = this._staticTrees[index];\\n // if has already-rendered static tree and not inside v-for,\\n // we can reuse the same tree by doing a shallow clone.\\n if (tree && !isInFor) {\\n return Array.isArray(tree)\\n ? cloneVNodes(tree)\\n : cloneVNode(tree)\\n }\\n // otherwise, render a fresh tree.\\n tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy);\\n markStatic(tree, (\\\"__static__\\\" + index), false);\\n return tree\\n };\\n\\n // mark node as static (v-once)\\n Vue.prototype._o = function markOnce (\\n tree,\\n index,\\n key\\n ) {\\n markStatic(tree, (\\\"__once__\\\" + index + (key ? (\\\"_\\\" + key) : \\\"\\\")), true);\\n return tree\\n };\\n\\n function markStatic (tree, key, isOnce) {\\n if (Array.isArray(tree)) {\\n for (var i = 0; i < tree.length; i++) {\\n if (tree[i] && typeof tree[i] !== 'string') {\\n markStaticNode(tree[i], (key + \\\"_\\\" + i), isOnce);\\n }\\n }\\n } else {\\n markStaticNode(tree, key, isOnce);\\n }\\n }\\n\\n function markStaticNode (node, key, isOnce) {\\n node.isStatic = true;\\n node.key = key;\\n node.isOnce = isOnce;\\n }\\n\\n // filter resolution helper\\n Vue.prototype._f = function resolveFilter (id) {\\n return resolveAsset(this.$options, 'filters', id, true) || identity\\n };\\n\\n // render v-for\\n Vue.prototype._l = function renderList (\\n val,\\n render\\n ) {\\n var ret, i, l, keys, key;\\n if (Array.isArray(val)) {\\n ret = new Array(val.length);\\n for (i = 0, l = val.length; i < l; i++) {\\n ret[i] = render(val[i], i);\\n }\\n } else if (typeof val === 'number') {\\n ret = new Array(val);\\n for (i = 0; i < val; i++) {\\n ret[i] = render(i + 1, i);\\n }\\n } else if (isObject(val)) {\\n keys = Object.keys(val);\\n ret = new Array(keys.length);\\n for (i = 0, l = keys.length; i < l; i++) {\\n key = keys[i];\\n ret[i] = render(val[key], key, i);\\n }\\n }\\n return ret\\n };\\n\\n // renderSlot\\n Vue.prototype._t = function (\\n name,\\n fallback,\\n props\\n ) {\\n var scopedSlotFn = this.$scopedSlots[name];\\n if (scopedSlotFn) { // scoped slot\\n return scopedSlotFn(props || {}) || fallback\\n } else {\\n var slotNodes = this.$slots[name];\\n // warn duplicate slot usage\\n if (slotNodes && \\\"development\\\" !== 'production') {\\n slotNodes._rendered && warn(\\n \\\"Duplicate presence of slot \\\\\\\"\\\" + name + \\\"\\\\\\\" found in the same render tree \\\" +\\n \\\"- this will likely cause render errors.\\\",\\n this\\n );\\n slotNodes._rendered = true;\\n }\\n return slotNodes || fallback\\n }\\n };\\n\\n // apply v-bind object\\n Vue.prototype._b = function bindProps (\\n data,\\n tag,\\n value,\\n asProp\\n ) {\\n if (value) {\\n if (!isObject(value)) {\\n \\\"development\\\" !== 'production' && warn(\\n 'v-bind without argument expects an Object or Array value',\\n this\\n );\\n } else {\\n if (Array.isArray(value)) {\\n value = toObject(value);\\n }\\n for (var key in value) {\\n if (key === 'class' || key === 'style') {\\n data[key] = value[key];\\n } else {\\n var hash = asProp || config.mustUseProp(tag, key)\\n ? data.domProps || (data.domProps = {})\\n : data.attrs || (data.attrs = {});\\n hash[key] = value[key];\\n }\\n }\\n }\\n }\\n return data\\n };\\n\\n // check v-on keyCodes\\n Vue.prototype._k = function checkKeyCodes (\\n eventKeyCode,\\n key,\\n builtInAlias\\n ) {\\n var keyCodes = config.keyCodes[key] || builtInAlias;\\n if (Array.isArray(keyCodes)) {\\n return keyCodes.indexOf(eventKeyCode) === -1\\n } else {\\n return keyCodes !== eventKeyCode\\n }\\n };\\n}\\n\\nfunction resolveSlots (\\n children,\\n context\\n) {\\n var slots = {};\\n if (!children) {\\n return slots\\n }\\n var defaultSlot = [];\\n var name, child;\\n for (var i = 0, l = children.length; i < l; i++) {\\n child = children[i];\\n // named slots should only be respected if the vnode was rendered in the\\n // same context.\\n if ((child.context === context || child.functionalContext === context) &&\\n child.data && (name = child.data.slot)) {\\n var slot = (slots[name] || (slots[name] = []));\\n if (child.tag === 'template') {\\n slot.push.apply(slot, child.children);\\n } else {\\n slot.push(child);\\n }\\n } else {\\n defaultSlot.push(child);\\n }\\n }\\n // ignore single whitespace\\n if (defaultSlot.length && !(\\n defaultSlot.length === 1 &&\\n (defaultSlot[0].text === ' ' || defaultSlot[0].isComment)\\n )) {\\n slots.default = defaultSlot;\\n }\\n return slots\\n}\\n\\n/* */\\n\\nfunction initEvents (vm) {\\n vm._events = Object.create(null);\\n // init parent attached events\\n var listeners = vm.$options._parentListeners;\\n var add = function (event, fn, once) {\\n once ? vm.$once(event, fn) : vm.$on(event, fn);\\n };\\n var remove$$1 = bind$1(vm.$off, vm);\\n vm._updateListeners = function (listeners, oldListeners) {\\n updateListeners(listeners, oldListeners || {}, add, remove$$1, vm);\\n };\\n if (listeners) {\\n vm._updateListeners(listeners);\\n }\\n}\\n\\nfunction eventsMixin (Vue) {\\n Vue.prototype.$on = function (event, fn) {\\n var vm = this;(vm._events[event] || (vm._events[event] = [])).push(fn);\\n return vm\\n };\\n\\n Vue.prototype.$once = function (event, fn) {\\n var vm = this;\\n function on () {\\n vm.$off(event, on);\\n fn.apply(vm, arguments);\\n }\\n on.fn = fn;\\n vm.$on(event, on);\\n return vm\\n };\\n\\n Vue.prototype.$off = function (event, fn) {\\n var vm = this;\\n // all\\n if (!arguments.length) {\\n vm._events = Object.create(null);\\n return vm\\n }\\n // specific event\\n var cbs = vm._events[event];\\n if (!cbs) {\\n return vm\\n }\\n if (arguments.length === 1) {\\n vm._events[event] = null;\\n return vm\\n }\\n // specific handler\\n var cb;\\n var i = cbs.length;\\n while (i--) {\\n cb = cbs[i];\\n if (cb === fn || cb.fn === fn) {\\n cbs.splice(i, 1);\\n break\\n }\\n }\\n return vm\\n };\\n\\n Vue.prototype.$emit = function (event) {\\n var vm = this;\\n var cbs = vm._events[event];\\n if (cbs) {\\n cbs = cbs.length > 1 ? toArray(cbs) : cbs;\\n var args = toArray(arguments, 1);\\n for (var i = 0, l = cbs.length; i < l; i++) {\\n cbs[i].apply(vm, args);\\n }\\n }\\n return vm\\n };\\n}\\n\\n/* */\\n\\nvar uid = 0;\\n\\nfunction initMixin (Vue) {\\n Vue.prototype._init = function (options) {\\n var vm = this;\\n // a uid\\n vm._uid = uid++;\\n // a flag to avoid this being observed\\n vm._isVue = true;\\n // merge options\\n if (options && options._isComponent) {\\n // optimize internal component instantiation\\n // since dynamic options merging is pretty slow, and none of the\\n // internal component options needs special treatment.\\n initInternalComponent(vm, options);\\n } else {\\n vm.$options = mergeOptions(\\n resolveConstructorOptions(vm.constructor),\\n options || {},\\n vm\\n );\\n }\\n /* istanbul ignore else */\\n {\\n initProxy(vm);\\n }\\n // expose real self\\n vm._self = vm;\\n initLifecycle(vm);\\n initEvents(vm);\\n callHook(vm, 'beforeCreate');\\n initState(vm);\\n callHook(vm, 'created');\\n initRender(vm);\\n };\\n}\\n\\nfunction initInternalComponent (vm, options) {\\n var opts = vm.$options = Object.create(vm.constructor.options);\\n // doing this because it's faster than dynamic enumeration.\\n opts.parent = options.parent;\\n opts.propsData = options.propsData;\\n opts._parentVnode = options._parentVnode;\\n opts._parentListeners = options._parentListeners;\\n opts._renderChildren = options._renderChildren;\\n opts._componentTag = options._componentTag;\\n opts._parentElm = options._parentElm;\\n opts._refElm = options._refElm;\\n if (options.render) {\\n opts.render = options.render;\\n opts.staticRenderFns = options.staticRenderFns;\\n }\\n}\\n\\nfunction resolveConstructorOptions (Ctor) {\\n var options = Ctor.options;\\n if (Ctor.super) {\\n var superOptions = Ctor.super.options;\\n var cachedSuperOptions = Ctor.superOptions;\\n var extendOptions = Ctor.extendOptions;\\n if (superOptions !== cachedSuperOptions) {\\n // super option changed\\n Ctor.superOptions = superOptions;\\n extendOptions.render = options.render;\\n extendOptions.staticRenderFns = options.staticRenderFns;\\n extendOptions._scopeId = options._scopeId;\\n options = Ctor.options = mergeOptions(superOptions, extendOptions);\\n if (options.name) {\\n options.components[options.name] = Ctor;\\n }\\n }\\n }\\n return options\\n}\\n\\nfunction Vue$3 (options) {\\n if (\\\"development\\\" !== 'production' &&\\n !(this instanceof Vue$3)) {\\n warn('Vue is a constructor and should be called with the `new` keyword');\\n }\\n this._init(options);\\n}\\n\\ninitMixin(Vue$3);\\nstateMixin(Vue$3);\\neventsMixin(Vue$3);\\nlifecycleMixin(Vue$3);\\nrenderMixin(Vue$3);\\n\\n/* */\\n\\nfunction initUse (Vue) {\\n Vue.use = function (plugin) {\\n /* istanbul ignore if */\\n if (plugin.installed) {\\n return\\n }\\n // additional parameters\\n var args = toArray(arguments, 1);\\n args.unshift(this);\\n if (typeof plugin.install === 'function') {\\n plugin.install.apply(plugin, args);\\n } else {\\n plugin.apply(null, args);\\n }\\n plugin.installed = true;\\n return this\\n };\\n}\\n\\n/* */\\n\\nfunction initMixin$1 (Vue) {\\n Vue.mixin = function (mixin) {\\n this.options = mergeOptions(this.options, mixin);\\n };\\n}\\n\\n/* */\\n\\nfunction initExtend (Vue) {\\n /**\\n * Each instance constructor, including Vue, has a unique\\n * cid. This enables us to create wrapped \\\"child\\n * constructors\\\" for prototypal inheritance and cache them.\\n */\\n Vue.cid = 0;\\n var cid = 1;\\n\\n /**\\n * Class inheritance\\n */\\n Vue.extend = function (extendOptions) {\\n extendOptions = extendOptions || {};\\n var Super = this;\\n var SuperId = Super.cid;\\n var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});\\n if (cachedCtors[SuperId]) {\\n return cachedCtors[SuperId]\\n }\\n var name = extendOptions.name || Super.options.name;\\n {\\n if (!/^[a-zA-Z][\\\\w-]*$/.test(name)) {\\n warn(\\n 'Invalid component name: \\\"' + name + '\\\". Component names ' +\\n 'can only contain alphanumeric characters and the hyphen, ' +\\n 'and must start with a letter.'\\n );\\n }\\n }\\n var Sub = function VueComponent (options) {\\n this._init(options);\\n };\\n Sub.prototype = Object.create(Super.prototype);\\n Sub.prototype.constructor = Sub;\\n Sub.cid = cid++;\\n Sub.options = mergeOptions(\\n Super.options,\\n extendOptions\\n );\\n Sub['super'] = Super;\\n // allow further extension/mixin/plugin usage\\n Sub.extend = Super.extend;\\n Sub.mixin = Super.mixin;\\n Sub.use = Super.use;\\n // create asset registers, so extended classes\\n // can have their private assets too.\\n config._assetTypes.forEach(function (type) {\\n Sub[type] = Super[type];\\n });\\n // enable recursive self-lookup\\n if (name) {\\n Sub.options.components[name] = Sub;\\n }\\n // keep a reference to the super options at extension time.\\n // later at instantiation we can check if Super's options have\\n // been updated.\\n Sub.superOptions = Super.options;\\n Sub.extendOptions = extendOptions;\\n // cache constructor\\n cachedCtors[SuperId] = Sub;\\n return Sub\\n };\\n}\\n\\n/* */\\n\\nfunction initAssetRegisters (Vue) {\\n /**\\n * Create asset registration methods.\\n */\\n config._assetTypes.forEach(function (type) {\\n Vue[type] = function (\\n id,\\n definition\\n ) {\\n if (!definition) {\\n return this.options[type + 's'][id]\\n } else {\\n /* istanbul ignore if */\\n {\\n if (type === 'component' && config.isReservedTag(id)) {\\n warn(\\n 'Do not use built-in or reserved HTML elements as component ' +\\n 'id: ' + id\\n );\\n }\\n }\\n if (type === 'component' && isPlainObject(definition)) {\\n definition.name = definition.name || id;\\n definition = this.options._base.extend(definition);\\n }\\n if (type === 'directive' && typeof definition === 'function') {\\n definition = { bind: definition, update: definition };\\n }\\n this.options[type + 's'][id] = definition;\\n return definition\\n }\\n };\\n });\\n}\\n\\n/* */\\n\\nvar patternTypes = [String, RegExp];\\n\\nfunction matches (pattern, name) {\\n if (typeof pattern === 'string') {\\n return pattern.split(',').indexOf(name) > -1\\n } else {\\n return pattern.test(name)\\n }\\n}\\n\\nvar KeepAlive = {\\n name: 'keep-alive',\\n abstract: true,\\n props: {\\n include: patternTypes,\\n exclude: patternTypes\\n },\\n created: function created () {\\n this.cache = Object.create(null);\\n },\\n render: function render () {\\n var vnode = getFirstComponentChild(this.$slots.default);\\n if (vnode && vnode.componentOptions) {\\n var opts = vnode.componentOptions;\\n // check pattern\\n var name = opts.Ctor.options.name || opts.tag;\\n if (name && (\\n (this.include && !matches(this.include, name)) ||\\n (this.exclude && matches(this.exclude, name))\\n )) {\\n return vnode\\n }\\n var key = vnode.key == null\\n // same constructor may get registered as different local components\\n // so cid alone is not enough (#3269)\\n ? opts.Ctor.cid + (opts.tag ? (\\\"::\\\" + (opts.tag)) : '')\\n : vnode.key;\\n if (this.cache[key]) {\\n vnode.child = this.cache[key].child;\\n } else {\\n this.cache[key] = vnode;\\n }\\n vnode.data.keepAlive = true;\\n }\\n return vnode\\n },\\n destroyed: function destroyed () {\\n var this$1 = this;\\n\\n for (var key in this.cache) {\\n var vnode = this$1.cache[key];\\n callHook(vnode.child, 'deactivated');\\n vnode.child.$destroy();\\n }\\n }\\n};\\n\\nvar builtInComponents = {\\n KeepAlive: KeepAlive\\n};\\n\\n/* */\\n\\nfunction initGlobalAPI (Vue) {\\n // config\\n var configDef = {};\\n configDef.get = function () { return config; };\\n {\\n configDef.set = function () {\\n warn(\\n 'Do not replace the Vue.config object, set individual fields instead.'\\n );\\n };\\n }\\n Object.defineProperty(Vue, 'config', configDef);\\n Vue.util = util;\\n Vue.set = set$1;\\n Vue.delete = del;\\n Vue.nextTick = nextTick;\\n\\n Vue.options = Object.create(null);\\n config._assetTypes.forEach(function (type) {\\n Vue.options[type + 's'] = Object.create(null);\\n });\\n\\n // this is used to identify the \\\"base\\\" constructor to extend all plain-object\\n // components with in Weex's multi-instance scenarios.\\n Vue.options._base = Vue;\\n\\n extend(Vue.options.components, builtInComponents);\\n\\n initUse(Vue);\\n initMixin$1(Vue);\\n initExtend(Vue);\\n initAssetRegisters(Vue);\\n}\\n\\ninitGlobalAPI(Vue$3);\\n\\nObject.defineProperty(Vue$3.prototype, '$isServer', {\\n get: isServerRendering\\n});\\n\\nVue$3.version = '2.1.6';\\n\\n/* */\\n\\n// attributes that should be using props for binding\\nvar acceptValue = makeMap('input,textarea,option,select');\\nvar mustUseProp = function (tag, attr) {\\n return (\\n (attr === 'value' && acceptValue(tag)) ||\\n (attr === 'selected' && tag === 'option') ||\\n (attr === 'checked' && tag === 'input') ||\\n (attr === 'muted' && tag === 'video')\\n )\\n};\\n\\nvar isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');\\n\\nvar isBooleanAttr = makeMap(\\n 'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +\\n 'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +\\n 'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +\\n 'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +\\n 'required,reversed,scoped,seamless,selected,sortable,translate,' +\\n 'truespeed,typemustmatch,visible'\\n);\\n\\nvar xlinkNS = 'http://www.w3.org/1999/xlink';\\n\\nvar isXlink = function (name) {\\n return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'\\n};\\n\\nvar getXlinkProp = function (name) {\\n return isXlink(name) ? name.slice(6, name.length) : ''\\n};\\n\\nvar isFalsyAttrValue = function (val) {\\n return val == null || val === false\\n};\\n\\n/* */\\n\\nfunction genClassForVnode (vnode) {\\n var data = vnode.data;\\n var parentNode = vnode;\\n var childNode = vnode;\\n while (childNode.child) {\\n childNode = childNode.child._vnode;\\n if (childNode.data) {\\n data = mergeClassData(childNode.data, data);\\n }\\n }\\n while ((parentNode = parentNode.parent)) {\\n if (parentNode.data) {\\n data = mergeClassData(data, parentNode.data);\\n }\\n }\\n return genClassFromData(data)\\n}\\n\\nfunction mergeClassData (child, parent) {\\n return {\\n staticClass: concat(child.staticClass, parent.staticClass),\\n class: child.class\\n ? [child.class, parent.class]\\n : parent.class\\n }\\n}\\n\\nfunction genClassFromData (data) {\\n var dynamicClass = data.class;\\n var staticClass = data.staticClass;\\n if (staticClass || dynamicClass) {\\n return concat(staticClass, stringifyClass(dynamicClass))\\n }\\n /* istanbul ignore next */\\n return ''\\n}\\n\\nfunction concat (a, b) {\\n return a ? b ? (a + ' ' + b) : a : (b || '')\\n}\\n\\nfunction stringifyClass (value) {\\n var res = '';\\n if (!value) {\\n return res\\n }\\n if (typeof value === 'string') {\\n return value\\n }\\n if (Array.isArray(value)) {\\n var stringified;\\n for (var i = 0, l = value.length; i < l; i++) {\\n if (value[i]) {\\n if ((stringified = stringifyClass(value[i]))) {\\n res += stringified + ' ';\\n }\\n }\\n }\\n return res.slice(0, -1)\\n }\\n if (isObject(value)) {\\n for (var key in value) {\\n if (value[key]) { res += key + ' '; }\\n }\\n return res.slice(0, -1)\\n }\\n /* istanbul ignore next */\\n return res\\n}\\n\\n/* */\\n\\nvar namespaceMap = {\\n svg: 'http://www.w3.org/2000/svg',\\n math: 'http://www.w3.org/1998/Math/MathML',\\n xhtml: 'http://www.w3.org/1999/xhtml'\\n};\\n\\nvar isHTMLTag = makeMap(\\n 'html,body,base,head,link,meta,style,title,' +\\n 'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +\\n 'div,dd,dl,dt,figcaption,figure,hr,img,li,main,ol,p,pre,ul,' +\\n 'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +\\n 's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +\\n 'embed,object,param,source,canvas,script,noscript,del,ins,' +\\n 'caption,col,colgroup,table,thead,tbody,td,th,tr,' +\\n 'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +\\n 'output,progress,select,textarea,' +\\n 'details,dialog,menu,menuitem,summary,' +\\n 'content,element,shadow,template'\\n);\\n\\n// this map is intentionally selective, only covering SVG elements that may\\n// contain child elements.\\nvar isSVG = makeMap(\\n 'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,' +\\n 'font-face,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +\\n 'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',\\n true\\n);\\n\\nvar isPreTag = function (tag) { return tag === 'pre'; };\\n\\nvar isReservedTag = function (tag) {\\n return isHTMLTag(tag) || isSVG(tag)\\n};\\n\\nfunction getTagNamespace (tag) {\\n if (isSVG(tag)) {\\n return 'svg'\\n }\\n // basic support for MathML\\n // note it doesn't support other MathML elements being component roots\\n if (tag === 'math') {\\n return 'math'\\n }\\n}\\n\\nvar unknownElementCache = Object.create(null);\\nfunction isUnknownElement (tag) {\\n /* istanbul ignore if */\\n if (!inBrowser) {\\n return true\\n }\\n if (isReservedTag(tag)) {\\n return false\\n }\\n tag = tag.toLowerCase();\\n /* istanbul ignore if */\\n if (unknownElementCache[tag] != null) {\\n return unknownElementCache[tag]\\n }\\n var el = document.createElement(tag);\\n if (tag.indexOf('-') > -1) {\\n // http://stackoverflow.com/a/28210364/1070244\\n return (unknownElementCache[tag] = (\\n el.constructor === window.HTMLUnknownElement ||\\n el.constructor === window.HTMLElement\\n ))\\n } else {\\n return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))\\n }\\n}\\n\\n/* */\\n\\n/**\\n * Query an element selector if it's not an element already.\\n */\\nfunction query (el) {\\n if (typeof el === 'string') {\\n var selector = el;\\n el = document.querySelector(el);\\n if (!el) {\\n \\\"development\\\" !== 'production' && warn(\\n 'Cannot find element: ' + selector\\n );\\n return document.createElement('div')\\n }\\n }\\n return el\\n}\\n\\n/* */\\n\\nfunction createElement$1 (tagName, vnode) {\\n var elm = document.createElement(tagName);\\n if (tagName !== 'select') {\\n return elm\\n }\\n if (vnode.data && vnode.data.attrs && 'multiple' in vnode.data.attrs) {\\n elm.setAttribute('multiple', 'multiple');\\n }\\n return elm\\n}\\n\\nfunction createElementNS (namespace, tagName) {\\n return document.createElementNS(namespaceMap[namespace], tagName)\\n}\\n\\nfunction createTextNode (text) {\\n return document.createTextNode(text)\\n}\\n\\nfunction createComment (text) {\\n return document.createComment(text)\\n}\\n\\nfunction insertBefore (parentNode, newNode, referenceNode) {\\n parentNode.insertBefore(newNode, referenceNode);\\n}\\n\\nfunction removeChild (node, child) {\\n node.removeChild(child);\\n}\\n\\nfunction appendChild (node, child) {\\n node.appendChild(child);\\n}\\n\\nfunction parentNode (node) {\\n return node.parentNode\\n}\\n\\nfunction nextSibling (node) {\\n return node.nextSibling\\n}\\n\\nfunction tagName (node) {\\n return node.tagName\\n}\\n\\nfunction setTextContent (node, text) {\\n node.textContent = text;\\n}\\n\\nfunction setAttribute (node, key, val) {\\n node.setAttribute(key, val);\\n}\\n\\n\\nvar nodeOps = Object.freeze({\\n\\tcreateElement: createElement$1,\\n\\tcreateElementNS: createElementNS,\\n\\tcreateTextNode: createTextNode,\\n\\tcreateComment: createComment,\\n\\tinsertBefore: insertBefore,\\n\\tremoveChild: removeChild,\\n\\tappendChild: appendChild,\\n\\tparentNode: parentNode,\\n\\tnextSibling: nextSibling,\\n\\ttagName: tagName,\\n\\tsetTextContent: setTextContent,\\n\\tsetAttribute: setAttribute\\n});\\n\\n/* */\\n\\nvar ref = {\\n create: function create (_, vnode) {\\n registerRef(vnode);\\n },\\n update: function update (oldVnode, vnode) {\\n if (oldVnode.data.ref !== vnode.data.ref) {\\n registerRef(oldVnode, true);\\n registerRef(vnode);\\n }\\n },\\n destroy: function destroy (vnode) {\\n registerRef(vnode, true);\\n }\\n};\\n\\nfunction registerRef (vnode, isRemoval) {\\n var key = vnode.data.ref;\\n if (!key) { return }\\n\\n var vm = vnode.context;\\n var ref = vnode.child || vnode.elm;\\n var refs = vm.$refs;\\n if (isRemoval) {\\n if (Array.isArray(refs[key])) {\\n remove$1(refs[key], ref);\\n } else if (refs[key] === ref) {\\n refs[key] = undefined;\\n }\\n } else {\\n if (vnode.data.refInFor) {\\n if (Array.isArray(refs[key]) && refs[key].indexOf(ref) < 0) {\\n refs[key].push(ref);\\n } else {\\n refs[key] = [ref];\\n }\\n } else {\\n refs[key] = ref;\\n }\\n }\\n}\\n\\n/**\\n * Virtual DOM patching algorithm based on Snabbdom by\\n * Simon Friis Vindum (@paldepind)\\n * Licensed under the MIT License\\n * https://github.com/paldepind/snabbdom/blob/master/LICENSE\\n *\\n * modified by Evan You (@yyx990803)\\n *\\n\\n/*\\n * Not type-checking this because this file is perf-critical and the cost\\n * of making flow understand it is not worth it.\\n */\\n\\nvar emptyNode = new VNode('', {}, []);\\n\\nvar hooks$1 = ['create', 'activate', 'update', 'remove', 'destroy'];\\n\\nfunction isUndef (s) {\\n return s == null\\n}\\n\\nfunction isDef (s) {\\n return s != null\\n}\\n\\nfunction sameVnode (vnode1, vnode2) {\\n return (\\n vnode1.key === vnode2.key &&\\n vnode1.tag === vnode2.tag &&\\n vnode1.isComment === vnode2.isComment &&\\n !vnode1.data === !vnode2.data\\n )\\n}\\n\\nfunction createKeyToOldIdx (children, beginIdx, endIdx) {\\n var i, key;\\n var map = {};\\n for (i = beginIdx; i <= endIdx; ++i) {\\n key = children[i].key;\\n if (isDef(key)) { map[key] = i; }\\n }\\n return map\\n}\\n\\nfunction createPatchFunction (backend) {\\n var i, j;\\n var cbs = {};\\n\\n var modules = backend.modules;\\n var nodeOps = backend.nodeOps;\\n\\n for (i = 0; i < hooks$1.length; ++i) {\\n cbs[hooks$1[i]] = [];\\n for (j = 0; j < modules.length; ++j) {\\n if (modules[j][hooks$1[i]] !== undefined) { cbs[hooks$1[i]].push(modules[j][hooks$1[i]]); }\\n }\\n }\\n\\n function emptyNodeAt (elm) {\\n return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)\\n }\\n\\n function createRmCb (childElm, listeners) {\\n function remove$$1 () {\\n if (--remove$$1.listeners === 0) {\\n removeElement(childElm);\\n }\\n }\\n remove$$1.listeners = listeners;\\n return remove$$1\\n }\\n\\n function removeElement (el) {\\n var parent = nodeOps.parentNode(el);\\n // element may have already been removed due to v-html\\n if (parent) {\\n nodeOps.removeChild(parent, el);\\n }\\n }\\n\\n var inPre = 0;\\n function createElm (vnode, insertedVnodeQueue, parentElm, refElm, nested) {\\n vnode.isRootInsert = !nested; // for transition enter check\\n if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {\\n return\\n }\\n\\n var data = vnode.data;\\n var children = vnode.children;\\n var tag = vnode.tag;\\n if (isDef(tag)) {\\n {\\n if (data && data.pre) {\\n inPre++;\\n }\\n if (\\n !inPre &&\\n !vnode.ns &&\\n !(config.ignoredElements && config.ignoredElements.indexOf(tag) > -1) &&\\n config.isUnknownElement(tag)\\n ) {\\n warn(\\n 'Unknown custom element: <' + tag + '> - did you ' +\\n 'register the component correctly? For recursive components, ' +\\n 'make sure to provide the \\\"name\\\" option.',\\n vnode.context\\n );\\n }\\n }\\n vnode.elm = vnode.ns\\n ? nodeOps.createElementNS(vnode.ns, tag)\\n : nodeOps.createElement(tag, vnode);\\n setScope(vnode);\\n\\n /* istanbul ignore if */\\n {\\n createChildren(vnode, children, insertedVnodeQueue);\\n if (isDef(data)) {\\n invokeCreateHooks(vnode, insertedVnodeQueue);\\n }\\n insert(parentElm, vnode.elm, refElm);\\n }\\n\\n if (\\\"development\\\" !== 'production' && data && data.pre) {\\n inPre--;\\n }\\n } else if (vnode.isComment) {\\n vnode.elm = nodeOps.createComment(vnode.text);\\n insert(parentElm, vnode.elm, refElm);\\n } else {\\n vnode.elm = nodeOps.createTextNode(vnode.text);\\n insert(parentElm, vnode.elm, refElm);\\n }\\n }\\n\\n function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\\n var i = vnode.data;\\n if (isDef(i)) {\\n var isReactivated = isDef(vnode.child) && i.keepAlive;\\n if (isDef(i = i.hook) && isDef(i = i.init)) {\\n i(vnode, false /* hydrating */, parentElm, refElm);\\n }\\n // after calling the init hook, if the vnode is a child component\\n // it should've created a child instance and mounted it. the child\\n // component also has set the placeholder vnode's elm.\\n // in that case we can just return the element and be done.\\n if (isDef(vnode.child)) {\\n initComponent(vnode, insertedVnodeQueue);\\n if (isReactivated) {\\n reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);\\n }\\n return true\\n }\\n }\\n }\\n\\n function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\\n var i;\\n // hack for #4339: a reactivated component with inner transition\\n // does not trigger because the inner node's created hooks are not called\\n // again. It's not ideal to involve module-specific logic in here but\\n // there doesn't seem to be a better way to do it.\\n var innerNode = vnode;\\n while (innerNode.child) {\\n innerNode = innerNode.child._vnode;\\n if (isDef(i = innerNode.data) && isDef(i = i.transition)) {\\n for (i = 0; i < cbs.activate.length; ++i) {\\n cbs.activate[i](emptyNode, innerNode);\\n }\\n insertedVnodeQueue.push(innerNode);\\n break\\n }\\n }\\n // unlike a newly created component,\\n // a reactivated keep-alive component doesn't insert itself\\n insert(parentElm, vnode.elm, refElm);\\n }\\n\\n function insert (parent, elm, ref) {\\n if (parent) {\\n if (ref) {\\n nodeOps.insertBefore(parent, elm, ref);\\n } else {\\n nodeOps.appendChild(parent, elm);\\n }\\n }\\n }\\n\\n function createChildren (vnode, children, insertedVnodeQueue) {\\n if (Array.isArray(children)) {\\n for (var i = 0; i < children.length; ++i) {\\n createElm(children[i], insertedVnodeQueue, vnode.elm, null, true);\\n }\\n } else if (isPrimitive(vnode.text)) {\\n nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(vnode.text));\\n }\\n }\\n\\n function isPatchable (vnode) {\\n while (vnode.child) {\\n vnode = vnode.child._vnode;\\n }\\n return isDef(vnode.tag)\\n }\\n\\n function invokeCreateHooks (vnode, insertedVnodeQueue) {\\n for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\\n cbs.create[i$1](emptyNode, vnode);\\n }\\n i = vnode.data.hook; // Reuse variable\\n if (isDef(i)) {\\n if (i.create) { i.create(emptyNode, vnode); }\\n if (i.insert) { insertedVnodeQueue.push(vnode); }\\n }\\n }\\n\\n function initComponent (vnode, insertedVnodeQueue) {\\n if (vnode.data.pendingInsert) {\\n insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);\\n }\\n vnode.elm = vnode.child.$el;\\n if (isPatchable(vnode)) {\\n invokeCreateHooks(vnode, insertedVnodeQueue);\\n setScope(vnode);\\n } else {\\n // empty component root.\\n // skip all element-related modules except for ref (#3455)\\n registerRef(vnode);\\n // make sure to invoke the insert hook\\n insertedVnodeQueue.push(vnode);\\n }\\n }\\n\\n // set scope id attribute for scoped CSS.\\n // this is implemented as a special case to avoid the overhead\\n // of going through the normal attribute patching process.\\n function setScope (vnode) {\\n var i;\\n if (isDef(i = vnode.context) && isDef(i = i.$options._scopeId)) {\\n nodeOps.setAttribute(vnode.elm, i, '');\\n }\\n if (isDef(i = activeInstance) &&\\n i !== vnode.context &&\\n isDef(i = i.$options._scopeId)) {\\n nodeOps.setAttribute(vnode.elm, i, '');\\n }\\n }\\n\\n function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {\\n for (; startIdx <= endIdx; ++startIdx) {\\n createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm);\\n }\\n }\\n\\n function invokeDestroyHook (vnode) {\\n var i, j;\\n var data = vnode.data;\\n if (isDef(data)) {\\n if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }\\n for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }\\n }\\n if (isDef(i = vnode.children)) {\\n for (j = 0; j < vnode.children.length; ++j) {\\n invokeDestroyHook(vnode.children[j]);\\n }\\n }\\n }\\n\\n function removeVnodes (parentElm, vnodes, startIdx, endIdx) {\\n for (; startIdx <= endIdx; ++startIdx) {\\n var ch = vnodes[startIdx];\\n if (isDef(ch)) {\\n if (isDef(ch.tag)) {\\n removeAndInvokeRemoveHook(ch);\\n invokeDestroyHook(ch);\\n } else { // Text node\\n nodeOps.removeChild(parentElm, ch.elm);\\n }\\n }\\n }\\n }\\n\\n function removeAndInvokeRemoveHook (vnode, rm) {\\n if (rm || isDef(vnode.data)) {\\n var listeners = cbs.remove.length + 1;\\n if (!rm) {\\n // directly removing\\n rm = createRmCb(vnode.elm, listeners);\\n } else {\\n // we have a recursively passed down rm callback\\n // increase the listeners count\\n rm.listeners += listeners;\\n }\\n // recursively invoke hooks on child component root node\\n if (isDef(i = vnode.child) && isDef(i = i._vnode) && isDef(i.data)) {\\n removeAndInvokeRemoveHook(i, rm);\\n }\\n for (i = 0; i < cbs.remove.length; ++i) {\\n cbs.remove[i](vnode, rm);\\n }\\n if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {\\n i(vnode, rm);\\n } else {\\n rm();\\n }\\n } else {\\n removeElement(vnode.elm);\\n }\\n }\\n\\n function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {\\n var oldStartIdx = 0;\\n var newStartIdx = 0;\\n var oldEndIdx = oldCh.length - 1;\\n var oldStartVnode = oldCh[0];\\n var oldEndVnode = oldCh[oldEndIdx];\\n var newEndIdx = newCh.length - 1;\\n var newStartVnode = newCh[0];\\n var newEndVnode = newCh[newEndIdx];\\n var oldKeyToIdx, idxInOld, elmToMove, refElm;\\n\\n // removeOnly is a special flag used only by \\n // to ensure removed elements stay in correct relative positions\\n // during leaving transitions\\n var canMove = !removeOnly;\\n\\n while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\\n if (isUndef(oldStartVnode)) {\\n oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left\\n } else if (isUndef(oldEndVnode)) {\\n oldEndVnode = oldCh[--oldEndIdx];\\n } else if (sameVnode(oldStartVnode, newStartVnode)) {\\n patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);\\n oldStartVnode = oldCh[++oldStartIdx];\\n newStartVnode = newCh[++newStartIdx];\\n } else if (sameVnode(oldEndVnode, newEndVnode)) {\\n patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);\\n oldEndVnode = oldCh[--oldEndIdx];\\n newEndVnode = newCh[--newEndIdx];\\n } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right\\n patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);\\n canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));\\n oldStartVnode = oldCh[++oldStartIdx];\\n newEndVnode = newCh[--newEndIdx];\\n } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left\\n patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);\\n canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\\n oldEndVnode = oldCh[--oldEndIdx];\\n newStartVnode = newCh[++newStartIdx];\\n } else {\\n if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }\\n idxInOld = isDef(newStartVnode.key) ? oldKeyToIdx[newStartVnode.key] : null;\\n if (isUndef(idxInOld)) { // New element\\n createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm);\\n newStartVnode = newCh[++newStartIdx];\\n } else {\\n elmToMove = oldCh[idxInOld];\\n /* istanbul ignore if */\\n if (\\\"development\\\" !== 'production' && !elmToMove) {\\n warn(\\n 'It seems there are duplicate keys that is causing an update error. ' +\\n 'Make sure each v-for item has a unique key.'\\n );\\n }\\n if (sameVnode(elmToMove, newStartVnode)) {\\n patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);\\n oldCh[idxInOld] = undefined;\\n canMove && nodeOps.insertBefore(parentElm, newStartVnode.elm, oldStartVnode.elm);\\n newStartVnode = newCh[++newStartIdx];\\n } else {\\n // same key but different element. treat as new element\\n createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm);\\n newStartVnode = newCh[++newStartIdx];\\n }\\n }\\n }\\n }\\n if (oldStartIdx > oldEndIdx) {\\n refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;\\n addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);\\n } else if (newStartIdx > newEndIdx) {\\n removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);\\n }\\n }\\n\\n function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) {\\n if (oldVnode === vnode) {\\n return\\n }\\n // reuse element for static trees.\\n // note we only do this if the vnode is cloned -\\n // if the new node is not cloned it means the render functions have been\\n // reset by the hot-reload-api and we need to do a proper re-render.\\n if (vnode.isStatic &&\\n oldVnode.isStatic &&\\n vnode.key === oldVnode.key &&\\n (vnode.isCloned || vnode.isOnce)) {\\n vnode.elm = oldVnode.elm;\\n vnode.child = oldVnode.child;\\n return\\n }\\n var i;\\n var data = vnode.data;\\n var hasData = isDef(data);\\n if (hasData && isDef(i = data.hook) && isDef(i = i.prepatch)) {\\n i(oldVnode, vnode);\\n }\\n var elm = vnode.elm = oldVnode.elm;\\n var oldCh = oldVnode.children;\\n var ch = vnode.children;\\n if (hasData && isPatchable(vnode)) {\\n for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }\\n if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }\\n }\\n if (isUndef(vnode.text)) {\\n if (isDef(oldCh) && isDef(ch)) {\\n if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }\\n } else if (isDef(ch)) {\\n if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }\\n addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);\\n } else if (isDef(oldCh)) {\\n removeVnodes(elm, oldCh, 0, oldCh.length - 1);\\n } else if (isDef(oldVnode.text)) {\\n nodeOps.setTextContent(elm, '');\\n }\\n } else if (oldVnode.text !== vnode.text) {\\n nodeOps.setTextContent(elm, vnode.text);\\n }\\n if (hasData) {\\n if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }\\n }\\n }\\n\\n function invokeInsertHook (vnode, queue, initial) {\\n // delay insert hooks for component root nodes, invoke them after the\\n // element is really inserted\\n if (initial && vnode.parent) {\\n vnode.parent.data.pendingInsert = queue;\\n } else {\\n for (var i = 0; i < queue.length; ++i) {\\n queue[i].data.hook.insert(queue[i]);\\n }\\n }\\n }\\n\\n var bailed = false;\\n // list of modules that can skip create hook during hydration because they\\n // are already rendered on the client or has no need for initialization\\n var isRenderedModule = makeMap('attrs,style,class,staticClass,staticStyle,key');\\n\\n // Note: this is a browser-only function so we can assume elms are DOM nodes.\\n function hydrate (elm, vnode, insertedVnodeQueue) {\\n {\\n if (!assertNodeMatch(elm, vnode)) {\\n return false\\n }\\n }\\n vnode.elm = elm;\\n var tag = vnode.tag;\\n var data = vnode.data;\\n var children = vnode.children;\\n if (isDef(data)) {\\n if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }\\n if (isDef(i = vnode.child)) {\\n // child component. it should have hydrated its own tree.\\n initComponent(vnode, insertedVnodeQueue);\\n return true\\n }\\n }\\n if (isDef(tag)) {\\n if (isDef(children)) {\\n // empty element, allow client to pick up and populate children\\n if (!elm.hasChildNodes()) {\\n createChildren(vnode, children, insertedVnodeQueue);\\n } else {\\n var childrenMatch = true;\\n var childNode = elm.firstChild;\\n for (var i$1 = 0; i$1 < children.length; i$1++) {\\n if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue)) {\\n childrenMatch = false;\\n break\\n }\\n childNode = childNode.nextSibling;\\n }\\n // if childNode is not null, it means the actual childNodes list is\\n // longer than the virtual children list.\\n if (!childrenMatch || childNode) {\\n if (\\\"development\\\" !== 'production' &&\\n typeof console !== 'undefined' &&\\n !bailed) {\\n bailed = true;\\n console.warn('Parent: ', elm);\\n console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);\\n }\\n return false\\n }\\n }\\n }\\n if (isDef(data)) {\\n for (var key in data) {\\n if (!isRenderedModule(key)) {\\n invokeCreateHooks(vnode, insertedVnodeQueue);\\n break\\n }\\n }\\n }\\n }\\n return true\\n }\\n\\n function assertNodeMatch (node, vnode) {\\n if (vnode.tag) {\\n return (\\n vnode.tag.indexOf('vue-component') === 0 ||\\n vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())\\n )\\n } else {\\n return _toString(vnode.text) === node.data\\n }\\n }\\n\\n return function patch (oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) {\\n if (!vnode) {\\n if (oldVnode) { invokeDestroyHook(oldVnode); }\\n return\\n }\\n\\n var elm, parent;\\n var isInitialPatch = false;\\n var insertedVnodeQueue = [];\\n\\n if (!oldVnode) {\\n // empty mount (likely as component), create new root element\\n isInitialPatch = true;\\n createElm(vnode, insertedVnodeQueue, parentElm, refElm);\\n } else {\\n var isRealElement = isDef(oldVnode.nodeType);\\n if (!isRealElement && sameVnode(oldVnode, vnode)) {\\n // patch existing root node\\n patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly);\\n } else {\\n if (isRealElement) {\\n // mounting to a real element\\n // check if this is server-rendered content and if we can perform\\n // a successful hydration.\\n if (oldVnode.nodeType === 1 && oldVnode.hasAttribute('server-rendered')) {\\n oldVnode.removeAttribute('server-rendered');\\n hydrating = true;\\n }\\n if (hydrating) {\\n if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {\\n invokeInsertHook(vnode, insertedVnodeQueue, true);\\n return oldVnode\\n } else {\\n warn(\\n 'The client-side rendered virtual DOM tree is not matching ' +\\n 'server-rendered content. This is likely caused by incorrect ' +\\n 'HTML markup, for example nesting block-level elements inside ' +\\n '

, or missing . Bailing hydration and performing ' +\\n 'full client-side render.'\\n );\\n }\\n }\\n // either not server-rendered, or hydration failed.\\n // create an empty node and replace it\\n oldVnode = emptyNodeAt(oldVnode);\\n }\\n\\n // replacing existing element\\n elm = oldVnode.elm;\\n parent = nodeOps.parentNode(elm);\\n createElm(vnode, insertedVnodeQueue, parent, nodeOps.nextSibling(elm));\\n\\n if (vnode.parent) {\\n // component root element replaced.\\n // update parent placeholder node element, recursively\\n var ancestor = vnode.parent;\\n while (ancestor) {\\n ancestor.elm = vnode.elm;\\n ancestor = ancestor.parent;\\n }\\n if (isPatchable(vnode)) {\\n for (var i = 0; i < cbs.create.length; ++i) {\\n cbs.create[i](emptyNode, vnode.parent);\\n }\\n }\\n }\\n\\n if (parent !== null) {\\n removeVnodes(parent, [oldVnode], 0, 0);\\n } else if (isDef(oldVnode.tag)) {\\n invokeDestroyHook(oldVnode);\\n }\\n }\\n }\\n\\n invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);\\n return vnode.elm\\n }\\n}\\n\\n/* */\\n\\nvar directives = {\\n create: updateDirectives,\\n update: updateDirectives,\\n destroy: function unbindDirectives (vnode) {\\n updateDirectives(vnode, emptyNode);\\n }\\n};\\n\\nfunction updateDirectives (oldVnode, vnode) {\\n if (oldVnode.data.directives || vnode.data.directives) {\\n _update(oldVnode, vnode);\\n }\\n}\\n\\nfunction _update (oldVnode, vnode) {\\n var isCreate = oldVnode === emptyNode;\\n var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);\\n var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);\\n\\n var dirsWithInsert = [];\\n var dirsWithPostpatch = [];\\n\\n var key, oldDir, dir;\\n for (key in newDirs) {\\n oldDir = oldDirs[key];\\n dir = newDirs[key];\\n if (!oldDir) {\\n // new directive, bind\\n callHook$1(dir, 'bind', vnode, oldVnode);\\n if (dir.def && dir.def.inserted) {\\n dirsWithInsert.push(dir);\\n }\\n } else {\\n // existing directive, update\\n dir.oldValue = oldDir.value;\\n callHook$1(dir, 'update', vnode, oldVnode);\\n if (dir.def && dir.def.componentUpdated) {\\n dirsWithPostpatch.push(dir);\\n }\\n }\\n }\\n\\n if (dirsWithInsert.length) {\\n var callInsert = function () {\\n for (var i = 0; i < dirsWithInsert.length; i++) {\\n callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);\\n }\\n };\\n if (isCreate) {\\n mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'insert', callInsert, 'dir-insert');\\n } else {\\n callInsert();\\n }\\n }\\n\\n if (dirsWithPostpatch.length) {\\n mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'postpatch', function () {\\n for (var i = 0; i < dirsWithPostpatch.length; i++) {\\n callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);\\n }\\n }, 'dir-postpatch');\\n }\\n\\n if (!isCreate) {\\n for (key in oldDirs) {\\n if (!newDirs[key]) {\\n // no longer present, unbind\\n callHook$1(oldDirs[key], 'unbind', oldVnode);\\n }\\n }\\n }\\n}\\n\\nvar emptyModifiers = Object.create(null);\\n\\nfunction normalizeDirectives$1 (\\n dirs,\\n vm\\n) {\\n var res = Object.create(null);\\n if (!dirs) {\\n return res\\n }\\n var i, dir;\\n for (i = 0; i < dirs.length; i++) {\\n dir = dirs[i];\\n if (!dir.modifiers) {\\n dir.modifiers = emptyModifiers;\\n }\\n res[getRawDirName(dir)] = dir;\\n dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);\\n }\\n return res\\n}\\n\\nfunction getRawDirName (dir) {\\n return dir.rawName || ((dir.name) + \\\".\\\" + (Object.keys(dir.modifiers || {}).join('.')))\\n}\\n\\nfunction callHook$1 (dir, hook, vnode, oldVnode) {\\n var fn = dir.def && dir.def[hook];\\n if (fn) {\\n fn(vnode.elm, dir, vnode, oldVnode);\\n }\\n}\\n\\nvar baseModules = [\\n ref,\\n directives\\n];\\n\\n/* */\\n\\nfunction updateAttrs (oldVnode, vnode) {\\n if (!oldVnode.data.attrs && !vnode.data.attrs) {\\n return\\n }\\n var key, cur, old;\\n var elm = vnode.elm;\\n var oldAttrs = oldVnode.data.attrs || {};\\n var attrs = vnode.data.attrs || {};\\n // clone observed objects, as the user probably wants to mutate it\\n if (attrs.__ob__) {\\n attrs = vnode.data.attrs = extend({}, attrs);\\n }\\n\\n for (key in attrs) {\\n cur = attrs[key];\\n old = oldAttrs[key];\\n if (old !== cur) {\\n setAttr(elm, key, cur);\\n }\\n }\\n // #4391: in IE9, setting type can reset value for input[type=radio]\\n /* istanbul ignore if */\\n if (isIE9 && attrs.value !== oldAttrs.value) {\\n setAttr(elm, 'value', attrs.value);\\n }\\n for (key in oldAttrs) {\\n if (attrs[key] == null) {\\n if (isXlink(key)) {\\n elm.removeAttributeNS(xlinkNS, getXlinkProp(key));\\n } else if (!isEnumeratedAttr(key)) {\\n elm.removeAttribute(key);\\n }\\n }\\n }\\n}\\n\\nfunction setAttr (el, key, value) {\\n if (isBooleanAttr(key)) {\\n // set attribute for blank value\\n // e.g. \\n if (isFalsyAttrValue(value)) {\\n el.removeAttribute(key);\\n } else {\\n el.setAttribute(key, key);\\n }\\n } else if (isEnumeratedAttr(key)) {\\n el.setAttribute(key, isFalsyAttrValue(value) || value === 'false' ? 'false' : 'true');\\n } else if (isXlink(key)) {\\n if (isFalsyAttrValue(value)) {\\n el.removeAttributeNS(xlinkNS, getXlinkProp(key));\\n } else {\\n el.setAttributeNS(xlinkNS, key, value);\\n }\\n } else {\\n if (isFalsyAttrValue(value)) {\\n el.removeAttribute(key);\\n } else {\\n el.setAttribute(key, value);\\n }\\n }\\n}\\n\\nvar attrs = {\\n create: updateAttrs,\\n update: updateAttrs\\n};\\n\\n/* */\\n\\nfunction updateClass (oldVnode, vnode) {\\n var el = vnode.elm;\\n var data = vnode.data;\\n var oldData = oldVnode.data;\\n if (!data.staticClass && !data.class &&\\n (!oldData || (!oldData.staticClass && !oldData.class))) {\\n return\\n }\\n\\n var cls = genClassForVnode(vnode);\\n\\n // handle transition classes\\n var transitionClass = el._transitionClasses;\\n if (transitionClass) {\\n cls = concat(cls, stringifyClass(transitionClass));\\n }\\n\\n // set the class\\n if (cls !== el._prevClass) {\\n el.setAttribute('class', cls);\\n el._prevClass = cls;\\n }\\n}\\n\\nvar klass = {\\n create: updateClass,\\n update: updateClass\\n};\\n\\n/* */\\n\\nvar target;\\n\\nfunction add$1 (event, handler, once, capture) {\\n if (once) {\\n var oldHandler = handler;\\n handler = function (ev) {\\n remove$2(event, handler, capture);\\n arguments.length === 1\\n ? oldHandler(ev)\\n : oldHandler.apply(null, arguments);\\n };\\n }\\n target.addEventListener(event, handler, capture);\\n}\\n\\nfunction remove$2 (event, handler, capture) {\\n target.removeEventListener(event, handler, capture);\\n}\\n\\nfunction updateDOMListeners (oldVnode, vnode) {\\n if (!oldVnode.data.on && !vnode.data.on) {\\n return\\n }\\n var on = vnode.data.on || {};\\n var oldOn = oldVnode.data.on || {};\\n target = vnode.elm;\\n updateListeners(on, oldOn, add$1, remove$2, vnode.context);\\n}\\n\\nvar events = {\\n create: updateDOMListeners,\\n update: updateDOMListeners\\n};\\n\\n/* */\\n\\nfunction updateDOMProps (oldVnode, vnode) {\\n if (!oldVnode.data.domProps && !vnode.data.domProps) {\\n return\\n }\\n var key, cur;\\n var elm = vnode.elm;\\n var oldProps = oldVnode.data.domProps || {};\\n var props = vnode.data.domProps || {};\\n // clone observed objects, as the user probably wants to mutate it\\n if (props.__ob__) {\\n props = vnode.data.domProps = extend({}, props);\\n }\\n\\n for (key in oldProps) {\\n if (props[key] == null) {\\n elm[key] = '';\\n }\\n }\\n for (key in props) {\\n cur = props[key];\\n // ignore children if the node has textContent or innerHTML,\\n // as these will throw away existing DOM nodes and cause removal errors\\n // on subsequent patches (#3360)\\n if (key === 'textContent' || key === 'innerHTML') {\\n if (vnode.children) { vnode.children.length = 0; }\\n if (cur === oldProps[key]) { continue }\\n }\\n if (key === 'value') {\\n // store value as _value as well since\\n // non-string values will be stringified\\n elm._value = cur;\\n // avoid resetting cursor position when value is the same\\n var strCur = cur == null ? '' : String(cur);\\n if (!elm.composing && (\\n (document.activeElement !== elm && elm.value !== strCur) ||\\n isValueChanged(vnode, strCur)\\n )) {\\n elm.value = strCur;\\n }\\n } else {\\n elm[key] = cur;\\n }\\n }\\n}\\n\\nfunction isValueChanged (vnode, newVal) {\\n var value = vnode.elm.value;\\n var modifiers = vnode.elm._vModifiers; // injected by v-model runtime\\n if ((modifiers && modifiers.number) || vnode.elm.type === 'number') {\\n return toNumber(value) !== toNumber(newVal)\\n }\\n if (modifiers && modifiers.trim) {\\n return value.trim() !== newVal.trim()\\n }\\n return value !== newVal\\n}\\n\\nvar domProps = {\\n create: updateDOMProps,\\n update: updateDOMProps\\n};\\n\\n/* */\\n\\nvar parseStyleText = cached(function (cssText) {\\n var res = {};\\n var listDelimiter = /;(?![^(]*\\\\))/g;\\n var propertyDelimiter = /:(.+)/;\\n cssText.split(listDelimiter).forEach(function (item) {\\n if (item) {\\n var tmp = item.split(propertyDelimiter);\\n tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());\\n }\\n });\\n return res\\n});\\n\\n// merge static and dynamic style data on the same vnode\\nfunction normalizeStyleData (data) {\\n var style = normalizeStyleBinding(data.style);\\n // static style is pre-processed into an object during compilation\\n // and is always a fresh object, so it's safe to merge into it\\n return data.staticStyle\\n ? extend(data.staticStyle, style)\\n : style\\n}\\n\\n// normalize possible array / string values into Object\\nfunction normalizeStyleBinding (bindingStyle) {\\n if (Array.isArray(bindingStyle)) {\\n return toObject(bindingStyle)\\n }\\n if (typeof bindingStyle === 'string') {\\n return parseStyleText(bindingStyle)\\n }\\n return bindingStyle\\n}\\n\\n/**\\n * parent component style should be after child's\\n * so that parent component's style could override it\\n */\\nfunction getStyle (vnode, checkChild) {\\n var res = {};\\n var styleData;\\n\\n if (checkChild) {\\n var childNode = vnode;\\n while (childNode.child) {\\n childNode = childNode.child._vnode;\\n if (childNode.data && (styleData = normalizeStyleData(childNode.data))) {\\n extend(res, styleData);\\n }\\n }\\n }\\n\\n if ((styleData = normalizeStyleData(vnode.data))) {\\n extend(res, styleData);\\n }\\n\\n var parentNode = vnode;\\n while ((parentNode = parentNode.parent)) {\\n if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {\\n extend(res, styleData);\\n }\\n }\\n return res\\n}\\n\\n/* */\\n\\nvar cssVarRE = /^--/;\\nvar importantRE = /\\\\s*!important$/;\\nvar setProp = function (el, name, val) {\\n /* istanbul ignore if */\\n if (cssVarRE.test(name)) {\\n el.style.setProperty(name, val);\\n } else if (importantRE.test(val)) {\\n el.style.setProperty(name, val.replace(importantRE, ''), 'important');\\n } else {\\n el.style[normalize(name)] = val;\\n }\\n};\\n\\nvar prefixes = ['Webkit', 'Moz', 'ms'];\\n\\nvar testEl;\\nvar normalize = cached(function (prop) {\\n testEl = testEl || document.createElement('div');\\n prop = camelize(prop);\\n if (prop !== 'filter' && (prop in testEl.style)) {\\n return prop\\n }\\n var upper = prop.charAt(0).toUpperCase() + prop.slice(1);\\n for (var i = 0; i < prefixes.length; i++) {\\n var prefixed = prefixes[i] + upper;\\n if (prefixed in testEl.style) {\\n return prefixed\\n }\\n }\\n});\\n\\nfunction updateStyle (oldVnode, vnode) {\\n var data = vnode.data;\\n var oldData = oldVnode.data;\\n\\n if (!data.staticStyle && !data.style &&\\n !oldData.staticStyle && !oldData.style) {\\n return\\n }\\n\\n var cur, name;\\n var el = vnode.elm;\\n var oldStaticStyle = oldVnode.data.staticStyle;\\n var oldStyleBinding = oldVnode.data.style || {};\\n\\n // if static style exists, stylebinding already merged into it when doing normalizeStyleData\\n var oldStyle = oldStaticStyle || oldStyleBinding;\\n\\n var style = normalizeStyleBinding(vnode.data.style) || {};\\n\\n vnode.data.style = style.__ob__ ? extend({}, style) : style;\\n\\n var newStyle = getStyle(vnode, true);\\n\\n for (name in oldStyle) {\\n if (newStyle[name] == null) {\\n setProp(el, name, '');\\n }\\n }\\n for (name in newStyle) {\\n cur = newStyle[name];\\n if (cur !== oldStyle[name]) {\\n // ie9 setting to null has no effect, must use empty string\\n setProp(el, name, cur == null ? '' : cur);\\n }\\n }\\n}\\n\\nvar style = {\\n create: updateStyle,\\n update: updateStyle\\n};\\n\\n/* */\\n\\n/**\\n * Add class with compatibility for SVG since classList is not supported on\\n * SVG elements in IE\\n */\\nfunction addClass (el, cls) {\\n /* istanbul ignore if */\\n if (!cls || !cls.trim()) {\\n return\\n }\\n\\n /* istanbul ignore else */\\n if (el.classList) {\\n if (cls.indexOf(' ') > -1) {\\n cls.split(/\\\\s+/).forEach(function (c) { return el.classList.add(c); });\\n } else {\\n el.classList.add(cls);\\n }\\n } else {\\n var cur = ' ' + el.getAttribute('class') + ' ';\\n if (cur.indexOf(' ' + cls + ' ') < 0) {\\n el.setAttribute('class', (cur + cls).trim());\\n }\\n }\\n}\\n\\n/**\\n * Remove class with compatibility for SVG since classList is not supported on\\n * SVG elements in IE\\n */\\nfunction removeClass (el, cls) {\\n /* istanbul ignore if */\\n if (!cls || !cls.trim()) {\\n return\\n }\\n\\n /* istanbul ignore else */\\n if (el.classList) {\\n if (cls.indexOf(' ') > -1) {\\n cls.split(/\\\\s+/).forEach(function (c) { return el.classList.remove(c); });\\n } else {\\n el.classList.remove(cls);\\n }\\n } else {\\n var cur = ' ' + el.getAttribute('class') + ' ';\\n var tar = ' ' + cls + ' ';\\n while (cur.indexOf(tar) >= 0) {\\n cur = cur.replace(tar, ' ');\\n }\\n el.setAttribute('class', cur.trim());\\n }\\n}\\n\\n/* */\\n\\nvar hasTransition = inBrowser && !isIE9;\\nvar TRANSITION = 'transition';\\nvar ANIMATION = 'animation';\\n\\n// Transition property/event sniffing\\nvar transitionProp = 'transition';\\nvar transitionEndEvent = 'transitionend';\\nvar animationProp = 'animation';\\nvar animationEndEvent = 'animationend';\\nif (hasTransition) {\\n /* istanbul ignore if */\\n if (window.ontransitionend === undefined &&\\n window.onwebkittransitionend !== undefined) {\\n transitionProp = 'WebkitTransition';\\n transitionEndEvent = 'webkitTransitionEnd';\\n }\\n if (window.onanimationend === undefined &&\\n window.onwebkitanimationend !== undefined) {\\n animationProp = 'WebkitAnimation';\\n animationEndEvent = 'webkitAnimationEnd';\\n }\\n}\\n\\nvar raf = (inBrowser && window.requestAnimationFrame) || setTimeout;\\nfunction nextFrame (fn) {\\n raf(function () {\\n raf(fn);\\n });\\n}\\n\\nfunction addTransitionClass (el, cls) {\\n (el._transitionClasses || (el._transitionClasses = [])).push(cls);\\n addClass(el, cls);\\n}\\n\\nfunction removeTransitionClass (el, cls) {\\n if (el._transitionClasses) {\\n remove$1(el._transitionClasses, cls);\\n }\\n removeClass(el, cls);\\n}\\n\\nfunction whenTransitionEnds (\\n el,\\n expectedType,\\n cb\\n) {\\n var ref = getTransitionInfo(el, expectedType);\\n var type = ref.type;\\n var timeout = ref.timeout;\\n var propCount = ref.propCount;\\n if (!type) { return cb() }\\n var event = type === TRANSITION ? transitionEndEvent : animationEndEvent;\\n var ended = 0;\\n var end = function () {\\n el.removeEventListener(event, onEnd);\\n cb();\\n };\\n var onEnd = function (e) {\\n if (e.target === el) {\\n if (++ended >= propCount) {\\n end();\\n }\\n }\\n };\\n setTimeout(function () {\\n if (ended < propCount) {\\n end();\\n }\\n }, timeout + 1);\\n el.addEventListener(event, onEnd);\\n}\\n\\nvar transformRE = /\\\\b(transform|all)(,|$)/;\\n\\nfunction getTransitionInfo (el, expectedType) {\\n var styles = window.getComputedStyle(el);\\n var transitioneDelays = styles[transitionProp + 'Delay'].split(', ');\\n var transitionDurations = styles[transitionProp + 'Duration'].split(', ');\\n var transitionTimeout = getTimeout(transitioneDelays, transitionDurations);\\n var animationDelays = styles[animationProp + 'Delay'].split(', ');\\n var animationDurations = styles[animationProp + 'Duration'].split(', ');\\n var animationTimeout = getTimeout(animationDelays, animationDurations);\\n\\n var type;\\n var timeout = 0;\\n var propCount = 0;\\n /* istanbul ignore if */\\n if (expectedType === TRANSITION) {\\n if (transitionTimeout > 0) {\\n type = TRANSITION;\\n timeout = transitionTimeout;\\n propCount = transitionDurations.length;\\n }\\n } else if (expectedType === ANIMATION) {\\n if (animationTimeout > 0) {\\n type = ANIMATION;\\n timeout = animationTimeout;\\n propCount = animationDurations.length;\\n }\\n } else {\\n timeout = Math.max(transitionTimeout, animationTimeout);\\n type = timeout > 0\\n ? transitionTimeout > animationTimeout\\n ? TRANSITION\\n : ANIMATION\\n : null;\\n propCount = type\\n ? type === TRANSITION\\n ? transitionDurations.length\\n : animationDurations.length\\n : 0;\\n }\\n var hasTransform =\\n type === TRANSITION &&\\n transformRE.test(styles[transitionProp + 'Property']);\\n return {\\n type: type,\\n timeout: timeout,\\n propCount: propCount,\\n hasTransform: hasTransform\\n }\\n}\\n\\nfunction getTimeout (delays, durations) {\\n /* istanbul ignore next */\\n while (delays.length < durations.length) {\\n delays = delays.concat(delays);\\n }\\n\\n return Math.max.apply(null, durations.map(function (d, i) {\\n return toMs(d) + toMs(delays[i])\\n }))\\n}\\n\\nfunction toMs (s) {\\n return Number(s.slice(0, -1)) * 1000\\n}\\n\\n/* */\\n\\nfunction enter (vnode, toggleDisplay) {\\n var el = vnode.elm;\\n\\n // call leave callback now\\n if (el._leaveCb) {\\n el._leaveCb.cancelled = true;\\n el._leaveCb();\\n }\\n\\n var data = resolveTransition(vnode.data.transition);\\n if (!data) {\\n return\\n }\\n\\n /* istanbul ignore if */\\n if (el._enterCb || el.nodeType !== 1) {\\n return\\n }\\n\\n var css = data.css;\\n var type = data.type;\\n var enterClass = data.enterClass;\\n var enterActiveClass = data.enterActiveClass;\\n var appearClass = data.appearClass;\\n var appearActiveClass = data.appearActiveClass;\\n var beforeEnter = data.beforeEnter;\\n var enter = data.enter;\\n var afterEnter = data.afterEnter;\\n var enterCancelled = data.enterCancelled;\\n var beforeAppear = data.beforeAppear;\\n var appear = data.appear;\\n var afterAppear = data.afterAppear;\\n var appearCancelled = data.appearCancelled;\\n\\n // activeInstance will always be the component managing this\\n // transition. One edge case to check is when the is placed\\n // as the root node of a child component. In that case we need to check\\n // 's parent for appear check.\\n var context = activeInstance;\\n var transitionNode = activeInstance.$vnode;\\n while (transitionNode && transitionNode.parent) {\\n transitionNode = transitionNode.parent;\\n context = transitionNode.context;\\n }\\n\\n var isAppear = !context._isMounted || !vnode.isRootInsert;\\n\\n if (isAppear && !appear && appear !== '') {\\n return\\n }\\n\\n var startClass = isAppear ? appearClass : enterClass;\\n var activeClass = isAppear ? appearActiveClass : enterActiveClass;\\n var beforeEnterHook = isAppear ? (beforeAppear || beforeEnter) : beforeEnter;\\n var enterHook = isAppear ? (typeof appear === 'function' ? appear : enter) : enter;\\n var afterEnterHook = isAppear ? (afterAppear || afterEnter) : afterEnter;\\n var enterCancelledHook = isAppear ? (appearCancelled || enterCancelled) : enterCancelled;\\n\\n var expectsCSS = css !== false && !isIE9;\\n var userWantsControl =\\n enterHook &&\\n // enterHook may be a bound method which exposes\\n // the length of original fn as _length\\n (enterHook._length || enterHook.length) > 1;\\n\\n var cb = el._enterCb = once(function () {\\n if (expectsCSS) {\\n removeTransitionClass(el, activeClass);\\n }\\n if (cb.cancelled) {\\n if (expectsCSS) {\\n removeTransitionClass(el, startClass);\\n }\\n enterCancelledHook && enterCancelledHook(el);\\n } else {\\n afterEnterHook && afterEnterHook(el);\\n }\\n el._enterCb = null;\\n });\\n\\n if (!vnode.data.show) {\\n // remove pending leave element on enter by injecting an insert hook\\n mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'insert', function () {\\n var parent = el.parentNode;\\n var pendingNode = parent && parent._pending && parent._pending[vnode.key];\\n if (pendingNode &&\\n pendingNode.context === vnode.context &&\\n pendingNode.tag === vnode.tag &&\\n pendingNode.elm._leaveCb) {\\n pendingNode.elm._leaveCb();\\n }\\n enterHook && enterHook(el, cb);\\n }, 'transition-insert');\\n }\\n\\n // start enter transition\\n beforeEnterHook && beforeEnterHook(el);\\n if (expectsCSS) {\\n addTransitionClass(el, startClass);\\n addTransitionClass(el, activeClass);\\n nextFrame(function () {\\n removeTransitionClass(el, startClass);\\n if (!cb.cancelled && !userWantsControl) {\\n whenTransitionEnds(el, type, cb);\\n }\\n });\\n }\\n\\n if (vnode.data.show) {\\n toggleDisplay && toggleDisplay();\\n enterHook && enterHook(el, cb);\\n }\\n\\n if (!expectsCSS && !userWantsControl) {\\n cb();\\n }\\n}\\n\\nfunction leave (vnode, rm) {\\n var el = vnode.elm;\\n\\n // call enter callback now\\n if (el._enterCb) {\\n el._enterCb.cancelled = true;\\n el._enterCb();\\n }\\n\\n var data = resolveTransition(vnode.data.transition);\\n if (!data) {\\n return rm()\\n }\\n\\n /* istanbul ignore if */\\n if (el._leaveCb || el.nodeType !== 1) {\\n return\\n }\\n\\n var css = data.css;\\n var type = data.type;\\n var leaveClass = data.leaveClass;\\n var leaveActiveClass = data.leaveActiveClass;\\n var beforeLeave = data.beforeLeave;\\n var leave = data.leave;\\n var afterLeave = data.afterLeave;\\n var leaveCancelled = data.leaveCancelled;\\n var delayLeave = data.delayLeave;\\n\\n var expectsCSS = css !== false && !isIE9;\\n var userWantsControl =\\n leave &&\\n // leave hook may be a bound method which exposes\\n // the length of original fn as _length\\n (leave._length || leave.length) > 1;\\n\\n var cb = el._leaveCb = once(function () {\\n if (el.parentNode && el.parentNode._pending) {\\n el.parentNode._pending[vnode.key] = null;\\n }\\n if (expectsCSS) {\\n removeTransitionClass(el, leaveActiveClass);\\n }\\n if (cb.cancelled) {\\n if (expectsCSS) {\\n removeTransitionClass(el, leaveClass);\\n }\\n leaveCancelled && leaveCancelled(el);\\n } else {\\n rm();\\n afterLeave && afterLeave(el);\\n }\\n el._leaveCb = null;\\n });\\n\\n if (delayLeave) {\\n delayLeave(performLeave);\\n } else {\\n performLeave();\\n }\\n\\n function performLeave () {\\n // the delayed leave may have already been cancelled\\n if (cb.cancelled) {\\n return\\n }\\n // record leaving element\\n if (!vnode.data.show) {\\n (el.parentNode._pending || (el.parentNode._pending = {}))[vnode.key] = vnode;\\n }\\n beforeLeave && beforeLeave(el);\\n if (expectsCSS) {\\n addTransitionClass(el, leaveClass);\\n addTransitionClass(el, leaveActiveClass);\\n nextFrame(function () {\\n removeTransitionClass(el, leaveClass);\\n if (!cb.cancelled && !userWantsControl) {\\n whenTransitionEnds(el, type, cb);\\n }\\n });\\n }\\n leave && leave(el, cb);\\n if (!expectsCSS && !userWantsControl) {\\n cb();\\n }\\n }\\n}\\n\\nfunction resolveTransition (def$$1) {\\n if (!def$$1) {\\n return\\n }\\n /* istanbul ignore else */\\n if (typeof def$$1 === 'object') {\\n var res = {};\\n if (def$$1.css !== false) {\\n extend(res, autoCssTransition(def$$1.name || 'v'));\\n }\\n extend(res, def$$1);\\n return res\\n } else if (typeof def$$1 === 'string') {\\n return autoCssTransition(def$$1)\\n }\\n}\\n\\nvar autoCssTransition = cached(function (name) {\\n return {\\n enterClass: (name + \\\"-enter\\\"),\\n leaveClass: (name + \\\"-leave\\\"),\\n appearClass: (name + \\\"-enter\\\"),\\n enterActiveClass: (name + \\\"-enter-active\\\"),\\n leaveActiveClass: (name + \\\"-leave-active\\\"),\\n appearActiveClass: (name + \\\"-enter-active\\\")\\n }\\n});\\n\\nfunction once (fn) {\\n var called = false;\\n return function () {\\n if (!called) {\\n called = true;\\n fn();\\n }\\n }\\n}\\n\\nfunction _enter (_, vnode) {\\n if (!vnode.data.show) {\\n enter(vnode);\\n }\\n}\\n\\nvar transition = inBrowser ? {\\n create: _enter,\\n activate: _enter,\\n remove: function remove (vnode, rm) {\\n /* istanbul ignore else */\\n if (!vnode.data.show) {\\n leave(vnode, rm);\\n } else {\\n rm();\\n }\\n }\\n} : {};\\n\\nvar platformModules = [\\n attrs,\\n klass,\\n events,\\n domProps,\\n style,\\n transition\\n];\\n\\n/* */\\n\\n// the directive module should be applied last, after all\\n// built-in modules have been applied.\\nvar modules = platformModules.concat(baseModules);\\n\\nvar patch$1 = createPatchFunction({ nodeOps: nodeOps, modules: modules });\\n\\n/**\\n * Not type checking this file because flow doesn't like attaching\\n * properties to Elements.\\n */\\n\\nvar modelableTagRE = /^input|select|textarea|vue-component-[0-9]+(-[0-9a-zA-Z_-]*)?$/;\\n\\n/* istanbul ignore if */\\nif (isIE9) {\\n // http://www.matts411.com/post/internet-explorer-9-oninput/\\n document.addEventListener('selectionchange', function () {\\n var el = document.activeElement;\\n if (el && el.vmodel) {\\n trigger(el, 'input');\\n }\\n });\\n}\\n\\nvar model = {\\n inserted: function inserted (el, binding, vnode) {\\n {\\n if (!modelableTagRE.test(vnode.tag)) {\\n warn(\\n \\\"v-model is not supported on element type: <\\\" + (vnode.tag) + \\\">. \\\" +\\n 'If you are working with contenteditable, it\\\\'s recommended to ' +\\n 'wrap a library dedicated for that purpose inside a custom component.',\\n vnode.context\\n );\\n }\\n }\\n if (vnode.tag === 'select') {\\n var cb = function () {\\n setSelected(el, binding, vnode.context);\\n };\\n cb();\\n /* istanbul ignore if */\\n if (isIE || isEdge) {\\n setTimeout(cb, 0);\\n }\\n } else if (vnode.tag === 'textarea' || el.type === 'text') {\\n el._vModifiers = binding.modifiers;\\n if (!binding.modifiers.lazy) {\\n if (!isAndroid) {\\n el.addEventListener('compositionstart', onCompositionStart);\\n el.addEventListener('compositionend', onCompositionEnd);\\n }\\n /* istanbul ignore if */\\n if (isIE9) {\\n el.vmodel = true;\\n }\\n }\\n }\\n },\\n componentUpdated: function componentUpdated (el, binding, vnode) {\\n if (vnode.tag === 'select') {\\n setSelected(el, binding, vnode.context);\\n // in case the options rendered by v-for have changed,\\n // it's possible that the value is out-of-sync with the rendered options.\\n // detect such cases and filter out values that no longer has a matching\\n // option in the DOM.\\n var needReset = el.multiple\\n ? binding.value.some(function (v) { return hasNoMatchingOption(v, el.options); })\\n : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, el.options);\\n if (needReset) {\\n trigger(el, 'change');\\n }\\n }\\n }\\n};\\n\\nfunction setSelected (el, binding, vm) {\\n var value = binding.value;\\n var isMultiple = el.multiple;\\n if (isMultiple && !Array.isArray(value)) {\\n \\\"development\\\" !== 'production' && warn(\\n \\\"